From c90a8a8d5ac7ebecc49a41cc17b15215532ec0a6 Mon Sep 17 00:00:00 2001 From: bagel897 Date: Wed, 5 Feb 2025 17:09:11 -0800 Subject: [PATCH 1/2] Fix JSX prop parsing --- .../codebase/node_classes/ts_node_classes.py | 2 ++ .../detached_symbols/jsx/element.py | 4 +-- .../detached_symbols/jsx/expression.py | 3 ++ .../typescript/detached_symbols/jsx/prop.py | 6 ++-- .../test_ternary_reduce_condition.py | 31 +++++++++++++++++++ 5 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/codegen/sdk/codebase/node_classes/ts_node_classes.py b/src/codegen/sdk/codebase/node_classes/ts_node_classes.py index 10610018f..ac3690c22 100644 --- a/src/codegen/sdk/codebase/node_classes/ts_node_classes.py +++ b/src/codegen/sdk/codebase/node_classes/ts_node_classes.py @@ -22,6 +22,7 @@ from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock from codegen.sdk.typescript.detached_symbols.jsx.element import JSXElement from codegen.sdk.typescript.detached_symbols.jsx.expression import JSXExpression +from codegen.sdk.typescript.detached_symbols.jsx.prop import JSXProp from codegen.sdk.typescript.detached_symbols.parameter import TSParameter from codegen.sdk.typescript.enum_definition import TSEnum from codegen.sdk.typescript.enums import TSFunctionTypeNames @@ -91,6 +92,7 @@ def parse_new(node: TSNode, *args): "jsx_closing_element": JSXElement, "jsx_opening_element": JSXElement, "jsx_self_closing_element": JSXElement, + "jsx_attribute": JSXProp, "spread_element": Unpack, "subscript_expression": SubscriptExpression, "type_parameters": TypeParameters, diff --git a/src/codegen/sdk/typescript/detached_symbols/jsx/element.py b/src/codegen/sdk/typescript/detached_symbols/jsx/element.py index 407e9f47b..5682f0fd3 100644 --- a/src/codegen/sdk/typescript/detached_symbols/jsx/element.py +++ b/src/codegen/sdk/typescript/detached_symbols/jsx/element.py @@ -95,7 +95,7 @@ def props(self) -> list[JSXProp]: Returns: list[JSXProp]: A list of JSXProp objects representing each attribute on the element. """ - return [JSXProp(x.ts_node, self) for x in self._attribute_nodes] + return [self._parse_expression(x.ts_node, default=JSXProp) for x in self._attribute_nodes] @reader def get_prop(self, name: str) -> JSXProp | None: @@ -124,7 +124,7 @@ def attributes(self) -> list[JSXProp]: Returns: list[JSXProp]: A list of JSXProp objects representing each attribute/prop on the JSXElement. """ - return [JSXProp(x.ts_node, self) for x in self._attribute_nodes] + return [self._parse_expression(x.ts_node, default=JSXProp) for x in self._attribute_nodes] @writer def set_name(self, name: str) -> None: diff --git a/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py b/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py index 833e1ec77..df95c7bcf 100644 --- a/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py +++ b/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py @@ -72,6 +72,9 @@ def unwrap(self, node: Expression | None = None) -> None: if node is None: node = self + print(self.parent.ts_node_type) + if isinstance(self.parent, JSXProp): + return if isinstance(node, JSXExpression | JSXElement | JSXProp): for child in self._anonymous_children: child.remove() diff --git a/src/codegen/sdk/typescript/detached_symbols/jsx/prop.py b/src/codegen/sdk/typescript/detached_symbols/jsx/prop.py index b7521be55..7459146d8 100644 --- a/src/codegen/sdk/typescript/detached_symbols/jsx/prop.py +++ b/src/codegen/sdk/typescript/detached_symbols/jsx/prop.py @@ -2,12 +2,14 @@ from tree_sitter import Node as TSNode +from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import reader, writer from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.expressions import Expression from codegen.sdk.core.expressions.name import Name from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.has_value import HasValue +from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.extensions.autocommit import commiter from codegen.sdk.typescript.detached_symbols.jsx.expression import JSXExpression from codegen.shared.decorators.docs import noapidoc, ts_apidoc @@ -24,8 +26,8 @@ class JSXProp(Expression["Function | JSXElement | JSXProp"], HasName, HasValue): _name_node: Name | None _expression_node: JSXExpression | None - def __init__(self, ts_node: TSNode, parent: "Function | JSXElement | JSXProp") -> None: - super().__init__(ts_node, parent.file_node_id, parent.G, parent) + def __init__(self, ts_node: TSNode, file_node_id: NodeId, G: CodebaseGraph, parent: "Function | JSXElement | JSXProp") -> None: + super().__init__(ts_node, file_node_id, G, parent) self._name_node = self._parse_expression(self.ts_node.children[0], default=Name) if len(self.ts_node.children) > 2: self._value_node = self._parse_expression(self.ts_node.children[2]) diff --git a/tests/unit/codegen/sdk/typescript/expressions/ternary_expression/test_ternary_reduce_condition.py b/tests/unit/codegen/sdk/typescript/expressions/ternary_expression/test_ternary_reduce_condition.py index b1383acef..356c92a11 100644 --- a/tests/unit/codegen/sdk/typescript/expressions/ternary_expression/test_ternary_reduce_condition.py +++ b/tests/unit/codegen/sdk/typescript/expressions/ternary_expression/test_ternary_reduce_condition.py @@ -295,3 +295,34 @@ def test_reduce_ternary_condition_with_empty_arrays(tmpdir): } """ ) + + +def test_reduce_ternary_condition_with_jsx_prop(tmpdir): + # language=typescript jsx + content = """ +function foo(): JSX.Element { + return ( + : undefined} + /> + ); +} +""" + with get_codebase_session(tmpdir=tmpdir, files={"dir/file1.ts": content}, programming_language=ProgrammingLanguage.TYPESCRIPT) as codebase: + file: TSFile = codebase.get_file("dir/file1.ts") + foo = file.get_function("foo") + ternary = foo.code_block.statements[0].value.value.props[0].value.statement + ternary.reduce_condition(True) + # language=typescript jsx + assert ( + file.content + == """ +function foo(): JSX.Element { + return ( + } + /> + ); +} +""" + ) From d2a6cd3f8875a8ba8a41d80cd60ff1b589f316de Mon Sep 17 00:00:00 2001 From: bagel897 Date: Wed, 5 Feb 2025 17:10:35 -0800 Subject: [PATCH 2/2] Remove print statement --- src/codegen/sdk/typescript/detached_symbols/jsx/expression.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py b/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py index df95c7bcf..b9f992745 100644 --- a/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py +++ b/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py @@ -72,7 +72,6 @@ def unwrap(self, node: Expression | None = None) -> None: if node is None: node = self - print(self.parent.ts_node_type) if isinstance(self.parent, JSXProp): return if isinstance(node, JSXExpression | JSXElement | JSXProp):