Skip to content

Commit 967308c

Browse files
authored
Fix JSX prop parsing (#326)
# Motivation <!-- Why is this change necessary? --> # Content <!-- Please include a summary of the change --> # Testing <!-- How was the change tested? --> # Please check the following before marking your PR as ready for review - [ ] I have added tests for my changes - [ ] I have updated the documentation or added new documentation as needed
1 parent 6fe0f9b commit 967308c

File tree

5 files changed

+41
-4
lines changed

5 files changed

+41
-4
lines changed

src/codegen/sdk/codebase/node_classes/ts_node_classes.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock
2323
from codegen.sdk.typescript.detached_symbols.jsx.element import JSXElement
2424
from codegen.sdk.typescript.detached_symbols.jsx.expression import JSXExpression
25+
from codegen.sdk.typescript.detached_symbols.jsx.prop import JSXProp
2526
from codegen.sdk.typescript.detached_symbols.parameter import TSParameter
2627
from codegen.sdk.typescript.enum_definition import TSEnum
2728
from codegen.sdk.typescript.enums import TSFunctionTypeNames
@@ -91,6 +92,7 @@ def parse_new(node: TSNode, *args):
9192
"jsx_closing_element": JSXElement,
9293
"jsx_opening_element": JSXElement,
9394
"jsx_self_closing_element": JSXElement,
95+
"jsx_attribute": JSXProp,
9496
"spread_element": Unpack,
9597
"subscript_expression": SubscriptExpression,
9698
"type_parameters": TypeParameters,

src/codegen/sdk/typescript/detached_symbols/jsx/element.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def props(self) -> list[JSXProp]:
9595
Returns:
9696
list[JSXProp]: A list of JSXProp objects representing each attribute on the element.
9797
"""
98-
return [JSXProp(x.ts_node, self) for x in self._attribute_nodes]
98+
return [self._parse_expression(x.ts_node, default=JSXProp) for x in self._attribute_nodes]
9999

100100
@reader
101101
def get_prop(self, name: str) -> JSXProp | None:
@@ -124,7 +124,7 @@ def attributes(self) -> list[JSXProp]:
124124
Returns:
125125
list[JSXProp]: A list of JSXProp objects representing each attribute/prop on the JSXElement.
126126
"""
127-
return [JSXProp(x.ts_node, self) for x in self._attribute_nodes]
127+
return [self._parse_expression(x.ts_node, default=JSXProp) for x in self._attribute_nodes]
128128

129129
@writer
130130
def set_name(self, name: str) -> None:

src/codegen/sdk/typescript/detached_symbols/jsx/expression.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ def unwrap(self, node: Expression | None = None) -> None:
7272

7373
if node is None:
7474
node = self
75+
if isinstance(self.parent, JSXProp):
76+
return
7577
if isinstance(node, JSXExpression | JSXElement | JSXProp):
7678
for child in self._anonymous_children:
7779
child.remove()

src/codegen/sdk/typescript/detached_symbols/jsx/prop.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
from tree_sitter import Node as TSNode
44

5+
from codegen.sdk.codebase.codebase_graph import CodebaseGraph
56
from codegen.sdk.core.autocommit import reader, writer
67
from codegen.sdk.core.dataclasses.usage import UsageKind
78
from codegen.sdk.core.expressions import Expression
89
from codegen.sdk.core.expressions.name import Name
910
from codegen.sdk.core.interfaces.has_name import HasName
1011
from codegen.sdk.core.interfaces.has_value import HasValue
12+
from codegen.sdk.core.node_id_factory import NodeId
1113
from codegen.sdk.extensions.autocommit import commiter
1214
from codegen.sdk.typescript.detached_symbols.jsx.expression import JSXExpression
1315
from codegen.shared.decorators.docs import noapidoc, ts_apidoc
@@ -24,8 +26,8 @@ class JSXProp(Expression["Function | JSXElement | JSXProp"], HasName, HasValue):
2426
_name_node: Name | None
2527
_expression_node: JSXExpression | None
2628

27-
def __init__(self, ts_node: TSNode, parent: "Function | JSXElement | JSXProp") -> None:
28-
super().__init__(ts_node, parent.file_node_id, parent.G, parent)
29+
def __init__(self, ts_node: TSNode, file_node_id: NodeId, G: CodebaseGraph, parent: "Function | JSXElement | JSXProp") -> None:
30+
super().__init__(ts_node, file_node_id, G, parent)
2931
self._name_node = self._parse_expression(self.ts_node.children[0], default=Name)
3032
if len(self.ts_node.children) > 2:
3133
self._value_node = self._parse_expression(self.ts_node.children[2])

tests/unit/codegen/sdk/typescript/expressions/ternary_expression/test_ternary_reduce_condition.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,3 +295,34 @@ def test_reduce_ternary_condition_with_empty_arrays(tmpdir):
295295
}
296296
"""
297297
)
298+
299+
300+
def test_reduce_ternary_condition_with_jsx_prop(tmpdir):
301+
# language=typescript jsx
302+
content = """
303+
function foo(): JSX.Element {
304+
return (
305+
<Container
306+
content={condition ? <ComponentA title="hello" /> : undefined}
307+
/>
308+
);
309+
}
310+
"""
311+
with get_codebase_session(tmpdir=tmpdir, files={"dir/file1.ts": content}, programming_language=ProgrammingLanguage.TYPESCRIPT) as codebase:
312+
file: TSFile = codebase.get_file("dir/file1.ts")
313+
foo = file.get_function("foo")
314+
ternary = foo.code_block.statements[0].value.value.props[0].value.statement
315+
ternary.reduce_condition(True)
316+
# language=typescript jsx
317+
assert (
318+
file.content
319+
== """
320+
function foo(): JSX.Element {
321+
return (
322+
<Container
323+
content={<ComponentA title="hello" />}
324+
/>
325+
);
326+
}
327+
"""
328+
)

0 commit comments

Comments
 (0)