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..b9f992745 100644
--- a/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py
+++ b/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py
@@ -72,6 +72,8 @@ def unwrap(self, node: Expression | None = None) -> None:
if node is None:
node = self
+ 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 (
+ }
+ />
+ );
+}
+"""
+ )