diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api index 40df46e03489..b733f249d34a 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api @@ -12545,7 +12545,6 @@ const char* facebook::yoga::toString(facebook::yoga::Direction e); const char* facebook::yoga::toString(facebook::yoga::Display e); const char* facebook::yoga::toString(facebook::yoga::Edge e); const char* facebook::yoga::toString(facebook::yoga::Errata e); -const char* facebook::yoga::toString(facebook::yoga::ExperimentalFeature e); const char* facebook::yoga::toString(facebook::yoga::FlexDirection e); const char* facebook::yoga::toString(facebook::yoga::GridTrackType e); const char* facebook::yoga::toString(facebook::yoga::Gutter e); @@ -12565,7 +12564,6 @@ constexpr YGDirection facebook::yoga::unscopedEnum(facebook::yoga::Direction sco constexpr YGDisplay facebook::yoga::unscopedEnum(facebook::yoga::Display scoped); constexpr YGEdge facebook::yoga::unscopedEnum(facebook::yoga::Edge scoped); constexpr YGErrata facebook::yoga::unscopedEnum(facebook::yoga::Errata scoped); -constexpr YGExperimentalFeature facebook::yoga::unscopedEnum(facebook::yoga::ExperimentalFeature scoped); constexpr YGFlexDirection facebook::yoga::unscopedEnum(facebook::yoga::FlexDirection scoped); constexpr YGGridTrackType facebook::yoga::unscopedEnum(facebook::yoga::GridTrackType scoped); constexpr YGGutter facebook::yoga::unscopedEnum(facebook::yoga::Gutter scoped); @@ -12591,7 +12589,6 @@ constexpr facebook::yoga::Direction facebook::yoga::scopedEnum(YGDirection unsco constexpr facebook::yoga::Display facebook::yoga::scopedEnum(YGDisplay unscoped); constexpr facebook::yoga::Edge facebook::yoga::scopedEnum(YGEdge unscoped); constexpr facebook::yoga::Errata facebook::yoga::scopedEnum(YGErrata unscoped); -constexpr facebook::yoga::ExperimentalFeature facebook::yoga::scopedEnum(YGExperimentalFeature unscoped); constexpr facebook::yoga::FlexDirection facebook::yoga::scopedEnum(YGFlexDirection unscoped); constexpr facebook::yoga::FloatOptional facebook::yoga::maxOrDefined(facebook::yoga::FloatOptional lhs, facebook::yoga::FloatOptional rhs); constexpr facebook::yoga::GridTrackType facebook::yoga::scopedEnum(YGGridTrackType unscoped); @@ -12678,10 +12675,8 @@ class facebook::yoga::Config : public YGConfig { public Config(YGLogger logger); public YGNodeRef cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const; public bool hasErrata(facebook::yoga::Errata errata) const; - public bool isExperimentalFeatureEnabled(facebook::yoga::ExperimentalFeature feature) const; public bool useWebDefaults() const; public facebook::yoga::Errata getErrata() const; - public facebook::yoga::ExperimentalFeatureSet getEnabledExperiments() const; public float getPointScaleFactor() const; public static const facebook::yoga::Config& getDefault(); public uint32_t getVersion() const noexcept; @@ -12691,7 +12686,6 @@ class facebook::yoga::Config : public YGConfig { public void setCloneNodeCallback(YGCloneNodeFunc cloneNode); public void setContext(void* context); public void setErrata(facebook::yoga::Errata errata); - public void setExperimentalFeatureEnabled(facebook::yoga::ExperimentalFeature feature, bool enabled); public void setLogger(YGLogger logger); public void setPointScaleFactor(float pointScaleFactor); public void setUseWebDefaults(bool useWebDefaults); diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api index 28f040b53ad4..eb5a02cb1b33 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api @@ -12401,7 +12401,6 @@ const char* facebook::yoga::toString(facebook::yoga::Direction e); const char* facebook::yoga::toString(facebook::yoga::Display e); const char* facebook::yoga::toString(facebook::yoga::Edge e); const char* facebook::yoga::toString(facebook::yoga::Errata e); -const char* facebook::yoga::toString(facebook::yoga::ExperimentalFeature e); const char* facebook::yoga::toString(facebook::yoga::FlexDirection e); const char* facebook::yoga::toString(facebook::yoga::GridTrackType e); const char* facebook::yoga::toString(facebook::yoga::Gutter e); @@ -12421,7 +12420,6 @@ constexpr YGDirection facebook::yoga::unscopedEnum(facebook::yoga::Direction sco constexpr YGDisplay facebook::yoga::unscopedEnum(facebook::yoga::Display scoped); constexpr YGEdge facebook::yoga::unscopedEnum(facebook::yoga::Edge scoped); constexpr YGErrata facebook::yoga::unscopedEnum(facebook::yoga::Errata scoped); -constexpr YGExperimentalFeature facebook::yoga::unscopedEnum(facebook::yoga::ExperimentalFeature scoped); constexpr YGFlexDirection facebook::yoga::unscopedEnum(facebook::yoga::FlexDirection scoped); constexpr YGGridTrackType facebook::yoga::unscopedEnum(facebook::yoga::GridTrackType scoped); constexpr YGGutter facebook::yoga::unscopedEnum(facebook::yoga::Gutter scoped); @@ -12447,7 +12445,6 @@ constexpr facebook::yoga::Direction facebook::yoga::scopedEnum(YGDirection unsco constexpr facebook::yoga::Display facebook::yoga::scopedEnum(YGDisplay unscoped); constexpr facebook::yoga::Edge facebook::yoga::scopedEnum(YGEdge unscoped); constexpr facebook::yoga::Errata facebook::yoga::scopedEnum(YGErrata unscoped); -constexpr facebook::yoga::ExperimentalFeature facebook::yoga::scopedEnum(YGExperimentalFeature unscoped); constexpr facebook::yoga::FlexDirection facebook::yoga::scopedEnum(YGFlexDirection unscoped); constexpr facebook::yoga::FloatOptional facebook::yoga::maxOrDefined(facebook::yoga::FloatOptional lhs, facebook::yoga::FloatOptional rhs); constexpr facebook::yoga::GridTrackType facebook::yoga::scopedEnum(YGGridTrackType unscoped); @@ -12534,10 +12531,8 @@ class facebook::yoga::Config : public YGConfig { public Config(YGLogger logger); public YGNodeRef cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const; public bool hasErrata(facebook::yoga::Errata errata) const; - public bool isExperimentalFeatureEnabled(facebook::yoga::ExperimentalFeature feature) const; public bool useWebDefaults() const; public facebook::yoga::Errata getErrata() const; - public facebook::yoga::ExperimentalFeatureSet getEnabledExperiments() const; public float getPointScaleFactor() const; public static const facebook::yoga::Config& getDefault(); public uint32_t getVersion() const noexcept; @@ -12547,7 +12542,6 @@ class facebook::yoga::Config : public YGConfig { public void setCloneNodeCallback(YGCloneNodeFunc cloneNode); public void setContext(void* context); public void setErrata(facebook::yoga::Errata errata); - public void setExperimentalFeatureEnabled(facebook::yoga::ExperimentalFeature feature, bool enabled); public void setLogger(YGLogger logger); public void setPointScaleFactor(float pointScaleFactor); public void setUseWebDefaults(bool useWebDefaults); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api index 1a7d1e0d1926..484e788f2486 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api @@ -4720,7 +4720,6 @@ class facebook::react::BaseTextInputProps : public facebook::react::HostPlatform public facebook::react::SharedColor placeholderTextColor; public facebook::react::SharedColor selectionColor; public facebook::react::SharedColor selectionHandleColor; - public facebook::react::SharedColor underlineColorAndroid; public facebook::react::SubmitBehavior getNonDefaultSubmitBehavior() const; public facebook::react::SubmitBehavior submitBehavior; public facebook::react::TextAttributes getEffectiveTextAttributes(facebook::react::Float fontSizeMultiplier) const; @@ -14804,7 +14803,6 @@ const char* facebook::yoga::toString(facebook::yoga::Direction e); const char* facebook::yoga::toString(facebook::yoga::Display e); const char* facebook::yoga::toString(facebook::yoga::Edge e); const char* facebook::yoga::toString(facebook::yoga::Errata e); -const char* facebook::yoga::toString(facebook::yoga::ExperimentalFeature e); const char* facebook::yoga::toString(facebook::yoga::FlexDirection e); const char* facebook::yoga::toString(facebook::yoga::GridTrackType e); const char* facebook::yoga::toString(facebook::yoga::Gutter e); @@ -14824,7 +14822,6 @@ constexpr YGDirection facebook::yoga::unscopedEnum(facebook::yoga::Direction sco constexpr YGDisplay facebook::yoga::unscopedEnum(facebook::yoga::Display scoped); constexpr YGEdge facebook::yoga::unscopedEnum(facebook::yoga::Edge scoped); constexpr YGErrata facebook::yoga::unscopedEnum(facebook::yoga::Errata scoped); -constexpr YGExperimentalFeature facebook::yoga::unscopedEnum(facebook::yoga::ExperimentalFeature scoped); constexpr YGFlexDirection facebook::yoga::unscopedEnum(facebook::yoga::FlexDirection scoped); constexpr YGGridTrackType facebook::yoga::unscopedEnum(facebook::yoga::GridTrackType scoped); constexpr YGGutter facebook::yoga::unscopedEnum(facebook::yoga::Gutter scoped); @@ -14850,7 +14847,6 @@ constexpr facebook::yoga::Direction facebook::yoga::scopedEnum(YGDirection unsco constexpr facebook::yoga::Display facebook::yoga::scopedEnum(YGDisplay unscoped); constexpr facebook::yoga::Edge facebook::yoga::scopedEnum(YGEdge unscoped); constexpr facebook::yoga::Errata facebook::yoga::scopedEnum(YGErrata unscoped); -constexpr facebook::yoga::ExperimentalFeature facebook::yoga::scopedEnum(YGExperimentalFeature unscoped); constexpr facebook::yoga::FlexDirection facebook::yoga::scopedEnum(YGFlexDirection unscoped); constexpr facebook::yoga::FloatOptional facebook::yoga::maxOrDefined(facebook::yoga::FloatOptional lhs, facebook::yoga::FloatOptional rhs); constexpr facebook::yoga::GridTrackType facebook::yoga::scopedEnum(YGGridTrackType unscoped); @@ -14937,10 +14933,8 @@ class facebook::yoga::Config : public YGConfig { public Config(YGLogger logger); public YGNodeRef cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const; public bool hasErrata(facebook::yoga::Errata errata) const; - public bool isExperimentalFeatureEnabled(facebook::yoga::ExperimentalFeature feature) const; public bool useWebDefaults() const; public facebook::yoga::Errata getErrata() const; - public facebook::yoga::ExperimentalFeatureSet getEnabledExperiments() const; public float getPointScaleFactor() const; public static const facebook::yoga::Config& getDefault(); public uint32_t getVersion() const noexcept; @@ -14950,7 +14944,6 @@ class facebook::yoga::Config : public YGConfig { public void setCloneNodeCallback(YGCloneNodeFunc cloneNode); public void setContext(void* context); public void setErrata(facebook::yoga::Errata errata); - public void setExperimentalFeatureEnabled(facebook::yoga::ExperimentalFeature feature, bool enabled); public void setLogger(YGLogger logger); public void setPointScaleFactor(float pointScaleFactor); public void setUseWebDefaults(bool useWebDefaults); @@ -15749,8 +15742,6 @@ struct JS::NativeDeviceInfo::DimensionsPayload::Builder { struct JS::NativeDeviceInfo::DimensionsPayload::Builder::Input { protected std::optional screen; protected std::optional window; - protected std::optional screenPhysicalPixels; - protected std::optional windowPhysicalPixels; } struct JS::NativeDeviceInfo::DisplayMetrics { diff --git a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api index 6bcf2227ae3d..6f3ad11eaf62 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api @@ -4718,7 +4718,6 @@ class facebook::react::BaseTextInputProps : public facebook::react::HostPlatform public facebook::react::SharedColor placeholderTextColor; public facebook::react::SharedColor selectionColor; public facebook::react::SharedColor selectionHandleColor; - public facebook::react::SharedColor underlineColorAndroid; public facebook::react::SubmitBehavior getNonDefaultSubmitBehavior() const; public facebook::react::SubmitBehavior submitBehavior; public facebook::react::TextAttributes getEffectiveTextAttributes(facebook::react::Float fontSizeMultiplier) const; @@ -14670,7 +14669,6 @@ const char* facebook::yoga::toString(facebook::yoga::Direction e); const char* facebook::yoga::toString(facebook::yoga::Display e); const char* facebook::yoga::toString(facebook::yoga::Edge e); const char* facebook::yoga::toString(facebook::yoga::Errata e); -const char* facebook::yoga::toString(facebook::yoga::ExperimentalFeature e); const char* facebook::yoga::toString(facebook::yoga::FlexDirection e); const char* facebook::yoga::toString(facebook::yoga::GridTrackType e); const char* facebook::yoga::toString(facebook::yoga::Gutter e); @@ -14690,7 +14688,6 @@ constexpr YGDirection facebook::yoga::unscopedEnum(facebook::yoga::Direction sco constexpr YGDisplay facebook::yoga::unscopedEnum(facebook::yoga::Display scoped); constexpr YGEdge facebook::yoga::unscopedEnum(facebook::yoga::Edge scoped); constexpr YGErrata facebook::yoga::unscopedEnum(facebook::yoga::Errata scoped); -constexpr YGExperimentalFeature facebook::yoga::unscopedEnum(facebook::yoga::ExperimentalFeature scoped); constexpr YGFlexDirection facebook::yoga::unscopedEnum(facebook::yoga::FlexDirection scoped); constexpr YGGridTrackType facebook::yoga::unscopedEnum(facebook::yoga::GridTrackType scoped); constexpr YGGutter facebook::yoga::unscopedEnum(facebook::yoga::Gutter scoped); @@ -14716,7 +14713,6 @@ constexpr facebook::yoga::Direction facebook::yoga::scopedEnum(YGDirection unsco constexpr facebook::yoga::Display facebook::yoga::scopedEnum(YGDisplay unscoped); constexpr facebook::yoga::Edge facebook::yoga::scopedEnum(YGEdge unscoped); constexpr facebook::yoga::Errata facebook::yoga::scopedEnum(YGErrata unscoped); -constexpr facebook::yoga::ExperimentalFeature facebook::yoga::scopedEnum(YGExperimentalFeature unscoped); constexpr facebook::yoga::FlexDirection facebook::yoga::scopedEnum(YGFlexDirection unscoped); constexpr facebook::yoga::FloatOptional facebook::yoga::maxOrDefined(facebook::yoga::FloatOptional lhs, facebook::yoga::FloatOptional rhs); constexpr facebook::yoga::GridTrackType facebook::yoga::scopedEnum(YGGridTrackType unscoped); @@ -14803,10 +14799,8 @@ class facebook::yoga::Config : public YGConfig { public Config(YGLogger logger); public YGNodeRef cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const; public bool hasErrata(facebook::yoga::Errata errata) const; - public bool isExperimentalFeatureEnabled(facebook::yoga::ExperimentalFeature feature) const; public bool useWebDefaults() const; public facebook::yoga::Errata getErrata() const; - public facebook::yoga::ExperimentalFeatureSet getEnabledExperiments() const; public float getPointScaleFactor() const; public static const facebook::yoga::Config& getDefault(); public uint32_t getVersion() const noexcept; @@ -14816,7 +14810,6 @@ class facebook::yoga::Config : public YGConfig { public void setCloneNodeCallback(YGCloneNodeFunc cloneNode); public void setContext(void* context); public void setErrata(facebook::yoga::Errata errata); - public void setExperimentalFeatureEnabled(facebook::yoga::ExperimentalFeature feature, bool enabled); public void setLogger(YGLogger logger); public void setPointScaleFactor(float pointScaleFactor); public void setUseWebDefaults(bool useWebDefaults); @@ -15615,8 +15608,6 @@ struct JS::NativeDeviceInfo::DimensionsPayload::Builder { struct JS::NativeDeviceInfo::DimensionsPayload::Builder::Input { protected std::optional screen; protected std::optional window; - protected std::optional screenPhysicalPixels; - protected std::optional windowPhysicalPixels; } struct JS::NativeDeviceInfo::DisplayMetrics { diff --git a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api index 9ebe1a5f7445..a6df58996a72 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api @@ -9568,7 +9568,6 @@ const char* facebook::yoga::toString(facebook::yoga::Direction e); const char* facebook::yoga::toString(facebook::yoga::Display e); const char* facebook::yoga::toString(facebook::yoga::Edge e); const char* facebook::yoga::toString(facebook::yoga::Errata e); -const char* facebook::yoga::toString(facebook::yoga::ExperimentalFeature e); const char* facebook::yoga::toString(facebook::yoga::FlexDirection e); const char* facebook::yoga::toString(facebook::yoga::GridTrackType e); const char* facebook::yoga::toString(facebook::yoga::Gutter e); @@ -9588,7 +9587,6 @@ constexpr YGDirection facebook::yoga::unscopedEnum(facebook::yoga::Direction sco constexpr YGDisplay facebook::yoga::unscopedEnum(facebook::yoga::Display scoped); constexpr YGEdge facebook::yoga::unscopedEnum(facebook::yoga::Edge scoped); constexpr YGErrata facebook::yoga::unscopedEnum(facebook::yoga::Errata scoped); -constexpr YGExperimentalFeature facebook::yoga::unscopedEnum(facebook::yoga::ExperimentalFeature scoped); constexpr YGFlexDirection facebook::yoga::unscopedEnum(facebook::yoga::FlexDirection scoped); constexpr YGGridTrackType facebook::yoga::unscopedEnum(facebook::yoga::GridTrackType scoped); constexpr YGGutter facebook::yoga::unscopedEnum(facebook::yoga::Gutter scoped); @@ -9614,7 +9612,6 @@ constexpr facebook::yoga::Direction facebook::yoga::scopedEnum(YGDirection unsco constexpr facebook::yoga::Display facebook::yoga::scopedEnum(YGDisplay unscoped); constexpr facebook::yoga::Edge facebook::yoga::scopedEnum(YGEdge unscoped); constexpr facebook::yoga::Errata facebook::yoga::scopedEnum(YGErrata unscoped); -constexpr facebook::yoga::ExperimentalFeature facebook::yoga::scopedEnum(YGExperimentalFeature unscoped); constexpr facebook::yoga::FlexDirection facebook::yoga::scopedEnum(YGFlexDirection unscoped); constexpr facebook::yoga::FloatOptional facebook::yoga::maxOrDefined(facebook::yoga::FloatOptional lhs, facebook::yoga::FloatOptional rhs); constexpr facebook::yoga::GridTrackType facebook::yoga::scopedEnum(YGGridTrackType unscoped); @@ -9701,10 +9698,8 @@ class facebook::yoga::Config : public YGConfig { public Config(YGLogger logger); public YGNodeRef cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const; public bool hasErrata(facebook::yoga::Errata errata) const; - public bool isExperimentalFeatureEnabled(facebook::yoga::ExperimentalFeature feature) const; public bool useWebDefaults() const; public facebook::yoga::Errata getErrata() const; - public facebook::yoga::ExperimentalFeatureSet getEnabledExperiments() const; public float getPointScaleFactor() const; public static const facebook::yoga::Config& getDefault(); public uint32_t getVersion() const noexcept; @@ -9714,7 +9709,6 @@ class facebook::yoga::Config : public YGConfig { public void setCloneNodeCallback(YGCloneNodeFunc cloneNode); public void setContext(void* context); public void setErrata(facebook::yoga::Errata errata); - public void setExperimentalFeatureEnabled(facebook::yoga::ExperimentalFeature feature, bool enabled); public void setLogger(YGLogger logger); public void setPointScaleFactor(float pointScaleFactor); public void setUseWebDefaults(bool useWebDefaults); diff --git a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api index 6fe7e5d239f0..e62cead91fb4 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api @@ -9559,7 +9559,6 @@ const char* facebook::yoga::toString(facebook::yoga::Direction e); const char* facebook::yoga::toString(facebook::yoga::Display e); const char* facebook::yoga::toString(facebook::yoga::Edge e); const char* facebook::yoga::toString(facebook::yoga::Errata e); -const char* facebook::yoga::toString(facebook::yoga::ExperimentalFeature e); const char* facebook::yoga::toString(facebook::yoga::FlexDirection e); const char* facebook::yoga::toString(facebook::yoga::GridTrackType e); const char* facebook::yoga::toString(facebook::yoga::Gutter e); @@ -9579,7 +9578,6 @@ constexpr YGDirection facebook::yoga::unscopedEnum(facebook::yoga::Direction sco constexpr YGDisplay facebook::yoga::unscopedEnum(facebook::yoga::Display scoped); constexpr YGEdge facebook::yoga::unscopedEnum(facebook::yoga::Edge scoped); constexpr YGErrata facebook::yoga::unscopedEnum(facebook::yoga::Errata scoped); -constexpr YGExperimentalFeature facebook::yoga::unscopedEnum(facebook::yoga::ExperimentalFeature scoped); constexpr YGFlexDirection facebook::yoga::unscopedEnum(facebook::yoga::FlexDirection scoped); constexpr YGGridTrackType facebook::yoga::unscopedEnum(facebook::yoga::GridTrackType scoped); constexpr YGGutter facebook::yoga::unscopedEnum(facebook::yoga::Gutter scoped); @@ -9605,7 +9603,6 @@ constexpr facebook::yoga::Direction facebook::yoga::scopedEnum(YGDirection unsco constexpr facebook::yoga::Display facebook::yoga::scopedEnum(YGDisplay unscoped); constexpr facebook::yoga::Edge facebook::yoga::scopedEnum(YGEdge unscoped); constexpr facebook::yoga::Errata facebook::yoga::scopedEnum(YGErrata unscoped); -constexpr facebook::yoga::ExperimentalFeature facebook::yoga::scopedEnum(YGExperimentalFeature unscoped); constexpr facebook::yoga::FlexDirection facebook::yoga::scopedEnum(YGFlexDirection unscoped); constexpr facebook::yoga::FloatOptional facebook::yoga::maxOrDefined(facebook::yoga::FloatOptional lhs, facebook::yoga::FloatOptional rhs); constexpr facebook::yoga::GridTrackType facebook::yoga::scopedEnum(YGGridTrackType unscoped); @@ -9692,10 +9689,8 @@ class facebook::yoga::Config : public YGConfig { public Config(YGLogger logger); public YGNodeRef cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const; public bool hasErrata(facebook::yoga::Errata errata) const; - public bool isExperimentalFeatureEnabled(facebook::yoga::ExperimentalFeature feature) const; public bool useWebDefaults() const; public facebook::yoga::Errata getErrata() const; - public facebook::yoga::ExperimentalFeatureSet getEnabledExperiments() const; public float getPointScaleFactor() const; public static const facebook::yoga::Config& getDefault(); public uint32_t getVersion() const noexcept; @@ -9705,7 +9700,6 @@ class facebook::yoga::Config : public YGConfig { public void setCloneNodeCallback(YGCloneNodeFunc cloneNode); public void setContext(void* context); public void setErrata(facebook::yoga::Errata errata); - public void setExperimentalFeatureEnabled(facebook::yoga::ExperimentalFeature feature, bool enabled); public void setLogger(YGLogger logger); public void setPointScaleFactor(float pointScaleFactor); public void setUseWebDefaults(bool useWebDefaults); diff --git a/scripts/cxx-api/parser/builders.py b/scripts/cxx-api/parser/builders.py index 03e0d1bc6a3e..cec83d918bc3 100644 --- a/scripts/cxx-api/parser/builders.py +++ b/scripts/cxx-api/parser/builders.py @@ -67,9 +67,7 @@ def parse(cls, kind: str) -> ParsedSectionKind: ) -###################### -# Base class fixups -###################### +# region Base class fixups def _fix_base_class_default_substitution( @@ -125,9 +123,9 @@ class Foo : public Bar {}; return f"{prefix}<{', '.join(fixed_args)}>{suffix}" -###################### -# Inherited constructor fixup -###################### +# endregion + +# region Inherited constructor fixup def _fix_inherited_constructor_name( @@ -155,9 +153,9 @@ def _fix_inherited_constructor_name( func_member.name = class_unqualified_name -###################### -# Member extraction -###################### +# endregion + +# region Member extraction def get_base_classes( @@ -541,9 +539,60 @@ def get_property_member( ) -###################### -# Scope creation -###################### +# endregion + +# region Symbol exclusion + + +def _should_exclude_symbol(name: str, exclude_symbols: list[str]) -> bool: + """ + Check if a symbol name should be excluded based on symbol patterns. + + Each pattern in exclude_symbols is treated as a substring match against + the symbol's qualified name. + """ + return any(pattern in name for pattern in exclude_symbols) + + +def _type_contains_excluded_symbol( + type_str: str | None, exclude_symbols: list[str] +) -> bool: + """Return True if *type_str* contains any substring from *exclude_symbols*.""" + if not type_str or not exclude_symbols: + return False + return any(pattern in type_str for pattern in exclude_symbols) + + +def _member_types_reference_excluded_symbol(member, exclude_symbols: list[str]) -> bool: + """Check whether any type string on *member* references an excluded symbol.""" + if not exclude_symbols: + return False + + if isinstance(member, FunctionMember): + if _type_contains_excluded_symbol(member.type, exclude_symbols): + return True + for arg in member.arguments: + if _type_contains_excluded_symbol(arg[1], exclude_symbols): + return True + + elif isinstance(member, VariableMember): + if _type_contains_excluded_symbol(member.type, exclude_symbols): + return True + + elif isinstance(member, TypedefMember): + if _type_contains_excluded_symbol(member.type, exclude_symbols): + return True + + elif isinstance(member, PropertyMember): + if _type_contains_excluded_symbol(member.type, exclude_symbols): + return True + + return False + + +# endregion + +# region Scope creation def create_enum_scope(snapshot: Snapshot, enum_def: compound.EnumdefType) -> None: @@ -595,6 +644,7 @@ def _process_objc_sections( location_file: str, scope_type: str, filter_category_members: bool = False, + exclude_symbols: list[str] | None = None, ) -> None: """ Common section processing for protocols and interfaces. @@ -622,16 +672,34 @@ def _process_objc_sections( if member_def.kind == "variable": if filter_category_members and _is_category_member(member_def): continue - scope.add_member( - get_variable_member(member_def, visibility, is_static) + if exclude_symbols and _should_exclude_symbol( + member_def.get_name(), exclude_symbols + ): + continue + var_member = get_variable_member( + member_def, visibility, is_static ) + if exclude_symbols and _member_types_reference_excluded_symbol( + var_member, exclude_symbols + ): + continue + scope.add_member(var_member) elif member_type == "func": for function_def in section_def.memberdef: if filter_category_members and _is_category_member(function_def): continue - scope.add_member( - get_function_member(function_def, visibility, is_static) + if exclude_symbols and _should_exclude_symbol( + function_def.get_name(), exclude_symbols + ): + continue + func_member = get_function_member( + function_def, visibility, is_static ) + if exclude_symbols and _member_types_reference_excluded_symbol( + func_member, exclude_symbols + ): + continue + scope.add_member(func_member) elif member_type == "type": for member_def in section_def.memberdef: if member_def.kind == "enum": @@ -639,7 +707,16 @@ def _process_objc_sections( elif member_def.kind == "typedef": if filter_category_members and _is_category_member(member_def): continue - scope.add_member(get_typedef_member(member_def, visibility)) + if exclude_symbols and _should_exclude_symbol( + member_def.get_name(), exclude_symbols + ): + continue + typedef_member = get_typedef_member(member_def, visibility) + if exclude_symbols and _member_types_reference_excluded_symbol( + typedef_member, exclude_symbols + ): + continue + scope.add_member(typedef_member) else: print( f"Unknown section member kind: {member_def.kind} in {location_file}" @@ -653,15 +730,24 @@ def _process_objc_sections( if member_def.kind == "property": if filter_category_members and _is_category_member(member_def): continue - scope.add_member( - get_property_member(member_def, "public", is_static) - ) + if exclude_symbols and _should_exclude_symbol( + member_def.get_name(), exclude_symbols + ): + continue + prop_member = get_property_member(member_def, "public", is_static) + if exclude_symbols and _member_types_reference_excluded_symbol( + prop_member, exclude_symbols + ): + continue + scope.add_member(prop_member) else: print(f"Unknown {scope_type} visibility: {visibility} in {location_file}") def create_protocol_scope( - snapshot: Snapshot, scope_def: compound.CompounddefType + snapshot: Snapshot, + scope_def: compound.CompounddefType, + exclude_symbols: list[str] | None = None, ) -> None: """ Create a protocol scope in the snapshot. @@ -683,11 +769,17 @@ def create_protocol_scope( scope_def.sectiondef, scope_def.location.file, "protocol", + exclude_symbols=exclude_symbols, ) +# endregion + + def create_interface_scope( - snapshot: Snapshot, scope_def: compound.CompounddefType + snapshot: Snapshot, + scope_def: compound.CompounddefType, + exclude_symbols: list[str] | None = None, ) -> None: """ Create an interface scope in the snapshot (Objective-C @interface). @@ -729,11 +821,14 @@ def create_interface_scope( scope_def.location.file, "interface", filter_category_members=True, + exclude_symbols=exclude_symbols, ) def create_class_scope( - snapshot: Snapshot, compound_object: compound.CompounddefType + snapshot: Snapshot, + compound_object: compound.CompounddefType, + exclude_symbols: list[str] | None = None, ) -> None: """ Create a class/struct/union scope in the snapshot. @@ -789,26 +884,53 @@ def create_class_scope( FriendMember(member_def.get_name(), visibility) ) else: - class_scope.add_member( - get_variable_member(member_def, visibility, is_static) + if exclude_symbols and _should_exclude_symbol( + member_def.get_name(), exclude_symbols + ): + continue + var_member = get_variable_member( + member_def, visibility, is_static ) + if ( + exclude_symbols + and _member_types_reference_excluded_symbol( + var_member, exclude_symbols + ) + ): + continue + class_scope.add_member(var_member) elif member_type == "func": for function_def in section_def.memberdef: + if exclude_symbols and _should_exclude_symbol( + function_def.get_name(), exclude_symbols + ): + continue func_member = get_function_member( function_def, visibility, is_static ) _fix_inherited_constructor_name( func_member, compound_object.compoundname ) + if exclude_symbols and _member_types_reference_excluded_symbol( + func_member, exclude_symbols + ): + continue class_scope.add_member(func_member) elif member_type == "type": for member_def in section_def.memberdef: if member_def.kind == "enum": create_enum_scope(snapshot, member_def) elif member_def.kind == "typedef": - class_scope.add_member( - get_typedef_member(member_def, visibility) - ) + if exclude_symbols and _should_exclude_symbol( + member_def.get_name(), exclude_symbols + ): + continue + typedef_member = get_typedef_member(member_def, visibility) + if exclude_symbols and _member_types_reference_excluded_symbol( + typedef_member, exclude_symbols + ): + continue + class_scope.add_member(typedef_member) else: print( f"Unknown section member kind: {member_def.kind} in {compound_object.location.file}" @@ -830,7 +952,9 @@ def create_class_scope( def create_category_scope( - snapshot: Snapshot, scope_def: compound.CompounddefType + snapshot: Snapshot, + scope_def: compound.CompounddefType, + exclude_symbols: list[str] | None = None, ) -> None: """ Create a category scope in the snapshot (Objective-C category). @@ -857,4 +981,5 @@ def create_category_scope( scope_def.sectiondef, scope_def.location.file, "category", + exclude_symbols=exclude_symbols, ) diff --git a/scripts/cxx-api/parser/main.py b/scripts/cxx-api/parser/main.py index d5f629d7aa2f..947a9404b35a 100644 --- a/scripts/cxx-api/parser/main.py +++ b/scripts/cxx-api/parser/main.py @@ -10,10 +10,13 @@ from __future__ import annotations import os +from dataclasses import dataclass from doxmlparser import compound, index from .builders import ( + _member_types_reference_excluded_symbol, + _should_exclude_symbol, create_category_scope, create_class_scope, create_enum_scope, @@ -24,18 +27,21 @@ get_typedef_member, get_variable_member, ) +from .member import ( + FriendMember, + FunctionMember, + PropertyMember, + TypedefMember, + VariableMember, +) +from .scope import Scope, StructLikeScopeKind +from .scope.extendable import Extendable from .snapshot import Snapshot -from .utils import has_scope_resolution_outside_angles, parse_qualified_path - - -def _should_exclude_symbol(name: str, exclude_symbols: list[str]) -> bool: - """ - Check if a compound name should be excluded based on symbol patterns. - - Each pattern in exclude_symbols is treated as a substring match against - the compound's qualified name. - """ - return any(pattern in name for pattern in exclude_symbols) +from .utils import ( + format_parsed_type, + has_scope_resolution_outside_angles, + parse_qualified_path, +) def _process_namespace_sections( @@ -55,9 +61,10 @@ def _process_namespace_sections( if _should_exclude_symbol(qualified_name, exclude_symbols): continue is_static = variable_def.static == "yes" - namespace_scope.add_member( - get_variable_member(variable_def, "public", is_static) - ) + var_member = get_variable_member(variable_def, "public", is_static) + if _member_types_reference_excluded_symbol(var_member, exclude_symbols): + continue + namespace_scope.add_member(var_member) elif section_def.kind == "func": for function_def in section_def.memberdef: # Skip out-of-class definitions (e.g. "Strct::convert") @@ -69,15 +76,23 @@ def _process_namespace_sections( function_static = function_def.static == "yes" if not function_static: - namespace_scope.add_member( - get_function_member(function_def, "public") - ) + func_member = get_function_member(function_def, "public") + if _member_types_reference_excluded_symbol( + func_member, exclude_symbols + ): + continue + namespace_scope.add_member(func_member) elif section_def.kind == "typedef": for typedef_def in section_def.memberdef: qualified_name = f"{compound_name}::{typedef_def.get_name()}" if _should_exclude_symbol(qualified_name, exclude_symbols): continue - namespace_scope.add_member(get_typedef_member(typedef_def, "public")) + typedef_member = get_typedef_member(typedef_def, "public") + if _member_types_reference_excluded_symbol( + typedef_member, exclude_symbols + ): + continue + namespace_scope.add_member(typedef_member) elif section_def.kind == "enum": for enum_def in section_def.memberdef: qualified_name = f"{compound_name}::{enum_def.get_name()}" @@ -128,7 +143,7 @@ def _handle_concept_compound(snapshot, compound_object): namespace_scope.add_member(get_concept_member(compound_object)) -def _handle_class_compound(snapshot, compound_object): +def _handle_class_compound(snapshot, compound_object, exclude_symbols=None): """ Handle class, struct, and union compound definitions. """ @@ -140,11 +155,11 @@ def _handle_class_compound(snapshot, compound_object): # Handle Objective-C interfaces separately if is_objc_interface: - create_interface_scope(snapshot, compound_object) + create_interface_scope(snapshot, compound_object, exclude_symbols) return # classes and structs are represented by the same scope with a different kind - create_class_scope(snapshot, compound_object) + create_class_scope(snapshot, compound_object, exclude_symbols) # Dispatch table for compound kinds that map directly to a single builder call. @@ -170,6 +185,207 @@ def _handle_class_compound(snapshot, compound_object): ) +@dataclass +class ExcludedSymbolReference: + symbol: str + pattern: str + scope: str + context: str + + +def _check_text_for_excluded_patterns( + text: str, + scope_name: str, + context: str, + exclude_symbols: list[str], + results: list[ExcludedSymbolReference], +) -> None: + """Append an ExcludedSymbolReference for each pattern found in *text*.""" + for pattern in exclude_symbols: + if pattern in text: + results.append( + ExcludedSymbolReference( + symbol=text, + pattern=pattern, + scope=scope_name, + context=context, + ) + ) + + +def _check_arguments_for_excluded_patterns( + arguments: list, + scope_name: str, + context_prefix: str, + exclude_symbols: list[str], + results: list[ExcludedSymbolReference], +) -> None: + """Check every argument's type string for excluded patterns.""" + for arg in arguments: + # Argument is a tuple: (qualifiers, type, name, default_value) + arg_type = arg[1] + if arg_type: + _check_text_for_excluded_patterns( + arg_type, + scope_name, + f"{context_prefix} parameter type", + exclude_symbols, + results, + ) + + +def _check_member_for_excluded_patterns( + member, + scope_name: str, + exclude_symbols: list[str], + results: list[ExcludedSymbolReference], +) -> None: + """Check a single member for type references matching excluded patterns.""" + member_name = f"{scope_name}::{member.name}" + + if isinstance(member, FunctionMember): + if member.type: + _check_text_for_excluded_patterns( + member.type, + member_name, + "return type", + exclude_symbols, + results, + ) + _check_arguments_for_excluded_patterns( + member.arguments, + member_name, + "function", + exclude_symbols, + results, + ) + + elif isinstance(member, VariableMember): + type_str = format_parsed_type(member._parsed_type) + if type_str: + _check_text_for_excluded_patterns( + type_str, + member_name, + "variable type", + exclude_symbols, + results, + ) + _check_arguments_for_excluded_patterns( + member._fp_arguments, + member_name, + "function pointer", + exclude_symbols, + results, + ) + + elif isinstance(member, TypedefMember): + value = member.get_value() + if value: + _check_text_for_excluded_patterns( + value, + member_name, + "typedef target type", + exclude_symbols, + results, + ) + _check_arguments_for_excluded_patterns( + member._fp_arguments, + member_name, + "function pointer", + exclude_symbols, + results, + ) + + elif isinstance(member, PropertyMember): + if member.type: + _check_text_for_excluded_patterns( + member.type, + member_name, + "property type", + exclude_symbols, + results, + ) + + elif isinstance(member, FriendMember): + _check_text_for_excluded_patterns( + member.name, + member_name, + "friend declaration", + exclude_symbols, + results, + ) + + if member.specialization_args: + for arg in member.specialization_args: + _check_text_for_excluded_patterns( + arg, + member_name, + "member specialization argument", + exclude_symbols, + results, + ) + + +def _walk_scope_for_excluded_patterns( + scope: Scope, + exclude_symbols: list[str], + results: list[ExcludedSymbolReference], +) -> None: + """Recursively walk a scope tree checking for excluded pattern references.""" + scope_name = scope.get_qualified_name() or "(root)" + + # Check base classes (StructLikeScopeKind, ProtocolScopeKind, InterfaceScopeKind) + if isinstance(scope.kind, Extendable): + for base in scope.kind.base_classes: + _check_text_for_excluded_patterns( + base.name, + scope_name, + "base class", + exclude_symbols, + results, + ) + + # Check specialization args + if isinstance(scope.kind, StructLikeScopeKind) and scope.kind.specialization_args: + for arg in scope.kind.specialization_args: + _check_text_for_excluded_patterns( + arg, + scope_name, + "specialization argument", + exclude_symbols, + results, + ) + + for member in scope.get_members(): + _check_member_for_excluded_patterns( + member, scope_name, exclude_symbols, results + ) + + for inner in scope.inner_scopes.values(): + _walk_scope_for_excluded_patterns(inner, exclude_symbols, results) + + +def find_excluded_symbol_references( + snapshot: Snapshot, + exclude_symbols: list[str], +) -> list[ExcludedSymbolReference]: + """ + Walk the snapshot scope tree after it has been finalized and find + references to excluded symbols in type strings, base classes, and + other type references. + + This detects cases where a non-excluded symbol references an excluded + symbol (e.g., a class inherits from an excluded base, a function returns + an excluded type, etc.). + """ + if not exclude_symbols: + return [] + + results: list[ExcludedSymbolReference] = [] + _walk_scope_for_excluded_patterns(snapshot.root_scope, exclude_symbols, results) + return results + + def build_snapshot(xml_dir: str, exclude_symbols: list[str] | None = None) -> Snapshot: """ Reads the Doxygen XML output and builds a snapshot of the C++ API. @@ -212,10 +428,23 @@ def build_snapshot(xml_dir: str, exclude_symbols: list[str] | None = None) -> Sn handler = _COMPOUND_HANDLERS[kind] if handler == _handle_namespace_compound: handler(snapshot, compound_object, exclude_symbols) + elif handler == _handle_class_compound: + handler(snapshot, compound_object, exclude_symbols) + elif handler in ( + create_category_scope, + create_protocol_scope, + create_interface_scope, + ): + handler(snapshot, compound_object, exclude_symbols) else: handler(snapshot, compound_object) else: print(f"Unknown compound kind: {kind}") snapshot.finish() + + snapshot.excluded_symbol_references = find_excluded_symbol_references( + snapshot, exclude_symbols + ) + return snapshot diff --git a/scripts/cxx-api/tests/test_excluded_symbol_references.py b/scripts/cxx-api/tests/test_excluded_symbol_references.py new file mode 100644 index 000000000000..2d61a7106811 --- /dev/null +++ b/scripts/cxx-api/tests/test_excluded_symbol_references.py @@ -0,0 +1,395 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from __future__ import annotations + +import unittest + +from ..parser.builders import _member_types_reference_excluded_symbol +from ..parser.main import find_excluded_symbol_references +from ..parser.member import ( + FriendMember, + FunctionMember, + PropertyMember, + TypedefMember, + VariableMember, +) +from ..parser.scope import Scope, StructLikeScopeKind +from ..parser.scope.extendable import Extendable +from ..parser.snapshot import Snapshot + + +def _make_snapshot_with_class( + class_name: str = "facebook::react::Foo", +) -> tuple[Snapshot, Scope]: + """Create a snapshot with a single struct and return both.""" + snapshot = Snapshot() + snapshot.create_or_get_namespace("facebook") + snapshot.create_or_get_namespace("facebook::react") + scope = snapshot.create_struct_like(class_name, StructLikeScopeKind.Type.STRUCT) + return snapshot, scope + + +class TestFindExcludedSymbolReferencesEmpty(unittest.TestCase): + def test_empty_exclude_symbols_returns_empty(self) -> None: + snapshot = Snapshot() + refs = find_excluded_symbol_references(snapshot, []) + self.assertEqual(refs, []) + + def test_no_references_returns_empty(self) -> None: + snapshot, scope = _make_snapshot_with_class() + scope.add_member( + FunctionMember( + name="doStuff", + type="int", + visibility="public", + arg_string="()", + is_virtual=False, + is_pure_virtual=False, + is_static=False, + ) + ) + snapshot.finish() + refs = find_excluded_symbol_references(snapshot, ["Experimental"]) + self.assertEqual(refs, []) + + +class TestFindExcludedSymbolReferencesBaseClass(unittest.TestCase): + def test_base_class_reference_detected(self) -> None: + snapshot, scope = _make_snapshot_with_class() + scope.kind.add_base( + Extendable.Base( + name="ExperimentalBase", + protection="public", + virtual=False, + refid="", + ) + ) + snapshot.finish() + refs = find_excluded_symbol_references(snapshot, ["Experimental"]) + self.assertEqual(len(refs), 1) + self.assertEqual(refs[0].symbol, "ExperimentalBase") + self.assertEqual(refs[0].pattern, "Experimental") + self.assertEqual(refs[0].context, "base class") + + def test_base_class_no_match(self) -> None: + snapshot, scope = _make_snapshot_with_class() + scope.kind.add_base( + Extendable.Base( + name="RegularBase", + protection="public", + virtual=False, + refid="", + ) + ) + snapshot.finish() + refs = find_excluded_symbol_references(snapshot, ["Experimental"]) + self.assertEqual(refs, []) + + +class TestFindExcludedSymbolReferencesFunctionMember(unittest.TestCase): + def test_return_type_reference_detected(self) -> None: + snapshot, scope = _make_snapshot_with_class() + scope.add_member( + FunctionMember( + name="getModule", + type="ExperimentalModule", + visibility="public", + arg_string="()", + is_virtual=False, + is_pure_virtual=False, + is_static=False, + ) + ) + snapshot.finish() + refs = find_excluded_symbol_references(snapshot, ["Experimental"]) + self.assertEqual(len(refs), 1) + self.assertEqual(refs[0].symbol, "ExperimentalModule") + self.assertEqual(refs[0].context, "return type") + + def test_parameter_type_reference_detected(self) -> None: + snapshot, scope = _make_snapshot_with_class() + scope.add_member( + FunctionMember( + name="setModule", + type="void", + visibility="public", + arg_string="(ExperimentalModule module)", + is_virtual=False, + is_pure_virtual=False, + is_static=False, + ) + ) + snapshot.finish() + refs = find_excluded_symbol_references(snapshot, ["Experimental"]) + self.assertEqual(len(refs), 1) + self.assertEqual(refs[0].context, "function parameter type") + + def test_no_match_in_function(self) -> None: + snapshot, scope = _make_snapshot_with_class() + scope.add_member( + FunctionMember( + name="doExperimentalStuff", + type="int", + visibility="public", + arg_string="(int x)", + is_virtual=False, + is_pure_virtual=False, + is_static=False, + ) + ) + snapshot.finish() + refs = find_excluded_symbol_references(snapshot, ["Experimental"]) + self.assertEqual(refs, []) + + +class TestFindExcludedSymbolReferencesVariableMember(unittest.TestCase): + def test_variable_type_reference_detected(self) -> None: + snapshot, scope = _make_snapshot_with_class() + scope.add_member( + VariableMember( + name="module", + type="ExperimentalModule", + visibility="public", + is_const=False, + is_static=False, + is_constexpr=False, + is_mutable=False, + value=None, + definition="ExperimentalModule module", + ) + ) + snapshot.finish() + refs = find_excluded_symbol_references(snapshot, ["Experimental"]) + self.assertEqual(len(refs), 1) + self.assertEqual(refs[0].context, "variable type") + + +class TestFindExcludedSymbolReferencesTypedefMember(unittest.TestCase): + def test_typedef_target_type_reference_detected(self) -> None: + snapshot, scope = _make_snapshot_with_class() + scope.add_member( + TypedefMember( + name="ModuleAlias", + type="ExperimentalModule", + argstring=None, + visibility="public", + keyword="using", + ) + ) + snapshot.finish() + refs = find_excluded_symbol_references(snapshot, ["Experimental"]) + self.assertEqual(len(refs), 1) + self.assertEqual(refs[0].context, "typedef target type") + + +class TestFindExcludedSymbolReferencesFriendMember(unittest.TestCase): + def test_friend_declaration_detected(self) -> None: + snapshot, scope = _make_snapshot_with_class() + scope.add_member(FriendMember(name="ExperimentalHelper")) + snapshot.finish() + refs = find_excluded_symbol_references(snapshot, ["Experimental"]) + self.assertEqual(len(refs), 1) + self.assertEqual(refs[0].context, "friend declaration") + + +class TestFindExcludedSymbolReferencesPropertyMember(unittest.TestCase): + def test_property_type_reference_detected(self) -> None: + snapshot, scope = _make_snapshot_with_class() + scope.add_member( + PropertyMember( + name="module", + type="ExperimentalModule *", + visibility="public", + is_static=False, + accessor=None, + is_readable=True, + is_writable=True, + ) + ) + snapshot.finish() + refs = find_excluded_symbol_references(snapshot, ["Experimental"]) + self.assertEqual(len(refs), 1) + self.assertEqual(refs[0].context, "property type") + + +class TestFindExcludedSymbolReferencesSpecializationArgs(unittest.TestCase): + def test_scope_specialization_arg_detected(self) -> None: + snapshot = Snapshot() + snapshot.create_or_get_namespace("facebook") + snapshot.create_or_get_namespace("facebook::react") + scope = snapshot.create_struct_like( + "facebook::react::Container", + StructLikeScopeKind.Type.STRUCT, + ) + scope.add_member( + FunctionMember( + name="get", + type="int", + visibility="public", + arg_string="()", + is_virtual=False, + is_pure_virtual=False, + is_static=False, + ) + ) + snapshot.finish() + refs = find_excluded_symbol_references(snapshot, ["Experimental"]) + self.assertEqual(len(refs), 1) + self.assertEqual(refs[0].context, "specialization argument") + + +class TestFindExcludedSymbolReferencesMultiplePatterns(unittest.TestCase): + def test_multiple_patterns_detected(self) -> None: + snapshot, scope = _make_snapshot_with_class() + scope.add_member( + FunctionMember( + name="getModule", + type="ExperimentalModule", + visibility="public", + arg_string="(FantomArg arg)", + is_virtual=False, + is_pure_virtual=False, + is_static=False, + ) + ) + snapshot.finish() + refs = find_excluded_symbol_references(snapshot, ["Experimental", "Fantom"]) + self.assertEqual(len(refs), 2) + patterns = {r.pattern for r in refs} + self.assertIn("Experimental", patterns) + self.assertIn("Fantom", patterns) + + def test_same_text_matches_multiple_patterns(self) -> None: + snapshot, scope = _make_snapshot_with_class() + scope.add_member( + FunctionMember( + name="get", + type="ExperimentalFantomModule", + visibility="public", + arg_string="()", + is_virtual=False, + is_pure_virtual=False, + is_static=False, + ) + ) + snapshot.finish() + refs = find_excluded_symbol_references(snapshot, ["Experimental", "Fantom"]) + self.assertEqual(len(refs), 2) + self.assertTrue(all(r.symbol == "ExperimentalFantomModule" for r in refs)) + + +class TestMemberTypesReferenceExcludedSymbol(unittest.TestCase): + def test_function_return_type_detected(self) -> None: + member = FunctionMember( + name="get", + type="ExperimentalFeature", + visibility="public", + arg_string="()", + is_virtual=False, + is_pure_virtual=False, + is_static=False, + ) + self.assertTrue( + _member_types_reference_excluded_symbol(member, ["Experimental"]) + ) + + def test_function_param_type_detected(self) -> None: + member = FunctionMember( + name="set", + type="void", + visibility="public", + arg_string="(ExperimentalFeature feature)", + is_virtual=False, + is_pure_virtual=False, + is_static=False, + ) + self.assertTrue( + _member_types_reference_excluded_symbol(member, ["Experimental"]) + ) + + def test_function_no_match(self) -> None: + member = FunctionMember( + name="get", + type="int", + visibility="public", + arg_string="(int x)", + is_virtual=False, + is_pure_virtual=False, + is_static=False, + ) + self.assertFalse( + _member_types_reference_excluded_symbol(member, ["Experimental"]) + ) + + def test_variable_type_detected(self) -> None: + member = VariableMember( + name="feature", + type="ExperimentalFeatureSet", + visibility="public", + is_const=False, + is_static=False, + is_constexpr=False, + is_mutable=False, + value=None, + definition="ExperimentalFeatureSet feature", + ) + self.assertTrue( + _member_types_reference_excluded_symbol(member, ["Experimental"]) + ) + + def test_variable_no_match(self) -> None: + member = VariableMember( + name="count", + type="int", + visibility="public", + is_const=False, + is_static=False, + is_constexpr=False, + is_mutable=False, + value=None, + definition="int count", + ) + self.assertFalse( + _member_types_reference_excluded_symbol(member, ["Experimental"]) + ) + + def test_typedef_type_detected(self) -> None: + member = TypedefMember( + name="FeatureAlias", + type="ExperimentalFeature", + argstring=None, + visibility="public", + keyword="using", + ) + self.assertTrue( + _member_types_reference_excluded_symbol(member, ["Experimental"]) + ) + + def test_property_type_detected(self) -> None: + member = PropertyMember( + name="feature", + type="ExperimentalFeature *", + visibility="public", + is_static=False, + accessor=None, + is_readable=True, + is_writable=True, + ) + self.assertTrue( + _member_types_reference_excluded_symbol(member, ["Experimental"]) + ) + + def test_empty_exclude_symbols_returns_false(self) -> None: + member = FunctionMember( + name="get", + type="ExperimentalFeature", + visibility="public", + arg_string="()", + is_virtual=False, + is_pure_virtual=False, + is_static=False, + ) + self.assertFalse(_member_types_reference_excluded_symbol(member, []))