You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fix Doxygen merging base classes from primary templates into specializations
Summary:
Doxygen incorrectly merges base classes from primary templates into their partial specializations. In C++, a specialization's inheritance list completely replaces the primary template's, but Doxygen combines both into a single basecompoundref list.
- **Contradictory type traits** — is_optional<std::optional<T>> and is_variant_of_data_types<std::variant<Ts...>> showed inheritance from both std::false_type (primary) and std::true_type (specialization)
- **Duplicate base classes** — Converter<jsi::Object> listed ConverterBase<jsi::Object> twice (once from the primary template after substitution, once from the specialization)
This diff fixes both issues with two complementary mechanisms:
- **Dedup-by-name (Extendable._deduplicate_base_classes)**: removes exact duplicate base classes, keeping the last occurrence. Handles cases where Doxygen's template argument substitution produces identical names.
- **Primary template base subtraction (StructLikeScopeKind._remove_merged_primary_bases)**: for partial specializations, looks up the primary template among sibling scopes and performs count-based subtraction of its bases. Count-based (rather than set-based) subtraction correctly preserves bases that a specialization explicitly re-inherits from the same class as the primary.
Changelog:
[Internal]
Differential Revision: D98291360
@@ -12476,21 +12476,21 @@ struct facebook::react::bridging::is_optional : public std::false_type {
12476
12476
}
12477
12477
12478
12478
template <typename T>
12479
-
struct facebook::react::bridging::Converter<std::optional<T>> : public facebook::react::bridging::ConverterBase<T>, public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
12479
+
struct facebook::react::bridging::Converter<std::optional<T>> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
12480
12480
public Converter(facebook::jsi::Runtime& rt, std::optional<T> value);
12481
12481
public operator std::optional<T>();
12482
12482
}
12483
12483
12484
12484
template <typename T>
12485
-
struct facebook::react::bridging::is_optional<std::optional<T>> : public std::false_type, public std::true_type {
12485
+
struct facebook::react::bridging::is_optional<std::optional<T>> : public std::true_type {
12486
12486
}
12487
12487
12488
-
struct facebook::react::bridging::Converter<facebook::jsi::Object> : public facebook::react::bridging::ConverterBase<facebook::jsi::Object>, public facebook::react::bridging::ConverterBase<facebook::jsi::Object> {
12488
+
struct facebook::react::bridging::Converter<facebook::jsi::Object> : public facebook::react::bridging::ConverterBase<facebook::jsi::Object> {
12489
12489
public operator jsi::Array();
12490
12490
public operator jsi::Function();
12491
12491
}
12492
12492
12493
-
struct facebook::react::bridging::Converter<facebook::jsi::Value> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value>, public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
12493
+
struct facebook::react::bridging::Converter<facebook::jsi::Value> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
@@ -12303,21 +12303,21 @@ struct facebook::react::bridging::is_optional : public std::false_type {
12303
12303
}
12304
12304
12305
12305
template <typename T>
12306
-
struct facebook::react::bridging::Converter<std::optional<T>> : public facebook::react::bridging::ConverterBase<T>, public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
12306
+
struct facebook::react::bridging::Converter<std::optional<T>> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
12307
12307
public Converter(facebook::jsi::Runtime& rt, std::optional<T> value);
12308
12308
public operator std::optional<T>();
12309
12309
}
12310
12310
12311
12311
template <typename T>
12312
-
struct facebook::react::bridging::is_optional<std::optional<T>> : public std::false_type, public std::true_type {
12312
+
struct facebook::react::bridging::is_optional<std::optional<T>> : public std::true_type {
12313
12313
}
12314
12314
12315
-
struct facebook::react::bridging::Converter<facebook::jsi::Object> : public facebook::react::bridging::ConverterBase<facebook::jsi::Object>, public facebook::react::bridging::ConverterBase<facebook::jsi::Object> {
12315
+
struct facebook::react::bridging::Converter<facebook::jsi::Object> : public facebook::react::bridging::ConverterBase<facebook::jsi::Object> {
12316
12316
public operator jsi::Array();
12317
12317
public operator jsi::Function();
12318
12318
}
12319
12319
12320
-
struct facebook::react::bridging::Converter<facebook::jsi::Value> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value>, public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
12320
+
struct facebook::react::bridging::Converter<facebook::jsi::Value> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
@@ -14862,21 +14862,21 @@ struct facebook::react::bridging::is_optional : public std::false_type {
14862
14862
}
14863
14863
14864
14864
template <typename T>
14865
-
struct facebook::react::bridging::Converter<std::optional<T>> : public facebook::react::bridging::ConverterBase<T>, public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
14865
+
struct facebook::react::bridging::Converter<std::optional<T>> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
14866
14866
public Converter(facebook::jsi::Runtime& rt, std::optional<T> value);
14867
14867
public operator std::optional<T>();
14868
14868
}
14869
14869
14870
14870
template <typename T>
14871
-
struct facebook::react::bridging::is_optional<std::optional<T>> : public std::false_type, public std::true_type {
14871
+
struct facebook::react::bridging::is_optional<std::optional<T>> : public std::true_type {
14872
14872
}
14873
14873
14874
-
struct facebook::react::bridging::Converter<facebook::jsi::Object> : public facebook::react::bridging::ConverterBase<facebook::jsi::Object>, public facebook::react::bridging::ConverterBase<facebook::jsi::Object> {
14874
+
struct facebook::react::bridging::Converter<facebook::jsi::Object> : public facebook::react::bridging::ConverterBase<facebook::jsi::Object> {
14875
14875
public operator jsi::Array();
14876
14876
public operator jsi::Function();
14877
14877
}
14878
14878
14879
-
struct facebook::react::bridging::Converter<facebook::jsi::Value> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value>, public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
14879
+
struct facebook::react::bridging::Converter<facebook::jsi::Value> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
@@ -14689,21 +14689,21 @@ struct facebook::react::bridging::is_optional : public std::false_type {
14689
14689
}
14690
14690
14691
14691
template <typename T>
14692
-
struct facebook::react::bridging::Converter<std::optional<T>> : public facebook::react::bridging::ConverterBase<T>, public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
14692
+
struct facebook::react::bridging::Converter<std::optional<T>> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
14693
14693
public Converter(facebook::jsi::Runtime& rt, std::optional<T> value);
14694
14694
public operator std::optional<T>();
14695
14695
}
14696
14696
14697
14697
template <typename T>
14698
-
struct facebook::react::bridging::is_optional<std::optional<T>> : public std::false_type, public std::true_type {
14698
+
struct facebook::react::bridging::is_optional<std::optional<T>> : public std::true_type {
14699
14699
}
14700
14700
14701
-
struct facebook::react::bridging::Converter<facebook::jsi::Object> : public facebook::react::bridging::ConverterBase<facebook::jsi::Object>, public facebook::react::bridging::ConverterBase<facebook::jsi::Object> {
14701
+
struct facebook::react::bridging::Converter<facebook::jsi::Object> : public facebook::react::bridging::ConverterBase<facebook::jsi::Object> {
14702
14702
public operator jsi::Array();
14703
14703
public operator jsi::Function();
14704
14704
}
14705
14705
14706
-
struct facebook::react::bridging::Converter<facebook::jsi::Value> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value>, public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
14706
+
struct facebook::react::bridging::Converter<facebook::jsi::Value> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
@@ -9155,21 +9155,21 @@ struct facebook::react::bridging::is_optional : public std::false_type {
9155
9155
}
9156
9156
9157
9157
template <typename T>
9158
-
struct facebook::react::bridging::Converter<std::optional<T>> : public facebook::react::bridging::ConverterBase<T>, public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
9158
+
struct facebook::react::bridging::Converter<std::optional<T>> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
9159
9159
public Converter(facebook::jsi::Runtime& rt, std::optional<T> value);
9160
9160
public operator std::optional<T>();
9161
9161
}
9162
9162
9163
9163
template <typename T>
9164
-
struct facebook::react::bridging::is_optional<std::optional<T>> : public std::false_type, public std::true_type {
9164
+
struct facebook::react::bridging::is_optional<std::optional<T>> : public std::true_type {
9165
9165
}
9166
9166
9167
-
struct facebook::react::bridging::Converter<facebook::jsi::Object> : public facebook::react::bridging::ConverterBase<facebook::jsi::Object>, public facebook::react::bridging::ConverterBase<facebook::jsi::Object> {
9167
+
struct facebook::react::bridging::Converter<facebook::jsi::Object> : public facebook::react::bridging::ConverterBase<facebook::jsi::Object> {
9168
9168
public operator jsi::Array();
9169
9169
public operator jsi::Function();
9170
9170
}
9171
9171
9172
-
struct facebook::react::bridging::Converter<facebook::jsi::Value> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value>, public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
9172
+
struct facebook::react::bridging::Converter<facebook::jsi::Value> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
@@ -9146,21 +9146,21 @@ struct facebook::react::bridging::is_optional : public std::false_type {
9146
9146
}
9147
9147
9148
9148
template <typename T>
9149
-
struct facebook::react::bridging::Converter<std::optional<T>> : public facebook::react::bridging::ConverterBase<T>, public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
9149
+
struct facebook::react::bridging::Converter<std::optional<T>> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
9150
9150
public Converter(facebook::jsi::Runtime& rt, std::optional<T> value);
9151
9151
public operator std::optional<T>();
9152
9152
}
9153
9153
9154
9154
template <typename T>
9155
-
struct facebook::react::bridging::is_optional<std::optional<T>> : public std::false_type, public std::true_type {
9155
+
struct facebook::react::bridging::is_optional<std::optional<T>> : public std::true_type {
9156
9156
}
9157
9157
9158
-
struct facebook::react::bridging::Converter<facebook::jsi::Object> : public facebook::react::bridging::ConverterBase<facebook::jsi::Object>, public facebook::react::bridging::ConverterBase<facebook::jsi::Object> {
9158
+
struct facebook::react::bridging::Converter<facebook::jsi::Object> : public facebook::react::bridging::ConverterBase<facebook::jsi::Object> {
9159
9159
public operator jsi::Array();
9160
9160
public operator jsi::Function();
9161
9161
}
9162
9162
9163
-
struct facebook::react::bridging::Converter<facebook::jsi::Value> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value>, public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
9163
+
struct facebook::react::bridging::Converter<facebook::jsi::Value> : public facebook::react::bridging::ConverterBase<facebook::jsi::Value> {
0 commit comments