diff --git a/scripts/cxx-api/parser/__main__.py b/scripts/cxx-api/parser/__main__.py index 84dbb9a57cbd..00f5d219356b 100644 --- a/scripts/cxx-api/parser/__main__.py +++ b/scripts/cxx-api/parser/__main__.py @@ -193,22 +193,20 @@ def build_snapshots( failed_views = ", ".join(name for name, _ in errors) raise RuntimeError(f"Failed to generate snapshots: {failed_views}") else: - with tempfile.TemporaryDirectory(prefix="cxx-api-test-") as work_dir: - snapshot = build_snapshot_for_view( - api_view="Test", - react_native_dir=react_native_dir, - include_directories=[], - exclude_patterns=[], - definitions={}, - output_dir=output_dir, - codegen_platform=None, - verbose=verbose, - input_filter=input_filter, - work_dir=work_dir, - ) - - if verbose: - print(snapshot) + snapshot = build_snapshot_for_view( + api_view="Test", + react_native_dir=react_native_dir, + include_directories=[], + exclude_patterns=[], + definitions={}, + output_dir=output_dir, + codegen_platform=None, + verbose=verbose, + input_filter=input_filter, + ) + + if verbose: + print(snapshot) def get_default_snapshot_dir() -> str: diff --git a/scripts/cxx-api/parser/member/variable_member.py b/scripts/cxx-api/parser/member/variable_member.py index 8c456f6c1e17..403af09eae45 100644 --- a/scripts/cxx-api/parser/member/variable_member.py +++ b/scripts/cxx-api/parser/member/variable_member.py @@ -111,6 +111,8 @@ def to_string( result += f"{qualified_type} (*{name})({formatted_args})" else: result += f"{format_parsed_type(self._parsed_type)} {name}" + if self.argstring: + result += self.argstring if STORE_INITIALIZERS_IN_SNAPSHOT and self.value is not None: if self.is_brace_initializer: diff --git a/scripts/cxx-api/parser/scope/base_scope_kind.py b/scripts/cxx-api/parser/scope/base_scope_kind.py index 02aa9720687b..ae27e0a583c4 100644 --- a/scripts/cxx-api/parser/scope/base_scope_kind.py +++ b/scripts/cxx-api/parser/scope/base_scope_kind.py @@ -34,7 +34,12 @@ def _format_scope_body(self, scope: Scope, member_suffix: str = "") -> str: stringified_members = [ member.to_string(2) + member_suffix for member in scope.get_members() ] + stringified_members = natsorted(stringified_members) + # Deduplicate members that produce identical signatures (e.g. + # constructors inherited from multiple bases). + stringified_members = list(dict.fromkeys(stringified_members)) + result = "{" if stringified_members: result += "\n" + "\n".join(stringified_members) diff --git a/scripts/cxx-api/parser/scope/namespace_scope_kind.py b/scripts/cxx-api/parser/scope/namespace_scope_kind.py index 0d7444be5473..57aaae3df7a9 100644 --- a/scripts/cxx-api/parser/scope/namespace_scope_kind.py +++ b/scripts/cxx-api/parser/scope/namespace_scope_kind.py @@ -35,6 +35,8 @@ def to_string(self, scope: Scope) -> str: result = [] for kind in MemberKind: sorted_group = natsorted(groups[kind]) + # Deduplicate members with identical signatures. + sorted_group = list(dict.fromkeys(sorted_group)) result.extend(sorted_group) return "\n".join(result) diff --git a/scripts/cxx-api/tests/snapshots/should_handle_array_variable/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_array_variable/snapshot.api new file mode 100644 index 000000000000..fd3f119e9564 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_array_variable/snapshot.api @@ -0,0 +1 @@ +const char test::ViewComponentName[]; diff --git a/scripts/cxx-api/tests/snapshots/should_handle_array_variable/test.h b/scripts/cxx-api/tests/snapshots/should_handle_array_variable/test.h new file mode 100644 index 000000000000..cf1624f6b919 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_array_variable/test.h @@ -0,0 +1,14 @@ +/* + * 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. + */ + +#pragma once + +namespace test { + +const char ViewComponentName[] = "View"; + +} // namespace test diff --git a/scripts/cxx-api/tests/snapshots/should_handle_multiple_inherited_constructors/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_multiple_inherited_constructors/snapshot.api new file mode 100644 index 000000000000..4b008a74d180 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_multiple_inherited_constructors/snapshot.api @@ -0,0 +1,27 @@ +class test::BaseTextShadowNode : public test::ShadowNode { + public BaseTextShadowNode(const test::ShadowNode& source, const test::ShadowNode::Fragment& fragment); + public BaseTextShadowNode(const test::ShadowNode::Fragment& fragment, const test::ShadowNode::Shared& family, test::ShadowNode::Traits traits); +} + +class test::ConcreteViewShadowNode : public test::ShadowNode { + public ConcreteViewShadowNode(const test::ShadowNode& source, const test::ShadowNode::Fragment& fragment); + public ConcreteViewShadowNode(const test::ShadowNode::Fragment& fragment, const test::ShadowNode::Shared& family, test::ShadowNode::Traits traits); +} + +class test::ParagraphShadowNode : public test::ConcreteViewShadowNode, public test::BaseTextShadowNode { + public ParagraphShadowNode(const test::ShadowNode& source, const test::ShadowNode::Fragment& fragment); + public ParagraphShadowNode(const test::ShadowNode::Fragment& fragment, const test::ShadowNode::Shared& family, test::ShadowNode::Traits traits); +} + +class test::ShadowNode { +} + +enum test::ShadowNode::Traits { + None, +} + +struct test::ShadowNode::Fragment { +} + +struct test::ShadowNode::Shared { +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_multiple_inherited_constructors/test.h b/scripts/cxx-api/tests/snapshots/should_handle_multiple_inherited_constructors/test.h new file mode 100644 index 000000000000..2d19852e49cc --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_multiple_inherited_constructors/test.h @@ -0,0 +1,37 @@ +/* + * 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. + */ + +#pragma once + +namespace test { + +class ShadowNode { + public: + struct Fragment {}; + struct Shared {}; + enum class Traits { None }; +}; + +class ConcreteViewShadowNode : public ShadowNode { + public: + ConcreteViewShadowNode(const ShadowNode &source, const Fragment &fragment); + ConcreteViewShadowNode(const Fragment &fragment, const Shared &family, Traits traits); +}; + +class BaseTextShadowNode : public ShadowNode { + public: + BaseTextShadowNode(const ShadowNode &source, const Fragment &fragment); + BaseTextShadowNode(const Fragment &fragment, const Shared &family, Traits traits); +}; + +class ParagraphShadowNode : public ConcreteViewShadowNode, public BaseTextShadowNode { + public: + using BaseTextShadowNode::BaseTextShadowNode; + using ConcreteViewShadowNode::ConcreteViewShadowNode; +}; + +} // namespace test