diff --git a/src/codegen/sdk/core/expressions/boolean.py b/src/codegen/sdk/core/expressions/boolean.py index 6d8a4d9aa..28655adaf 100644 --- a/src/codegen/sdk/core/expressions/boolean.py +++ b/src/codegen/sdk/core/expressions/boolean.py @@ -25,3 +25,7 @@ def __bool__(self): @override def _compute_dependencies(self, usage_type: UsageKind, dest: HasName | None = None) -> None: pass + + @property + def __class__(self): + return bool diff --git a/src/codegen/sdk/core/expressions/number.py b/src/codegen/sdk/core/expressions/number.py index a4684aa38..a52c3605b 100644 --- a/src/codegen/sdk/core/expressions/number.py +++ b/src/codegen/sdk/core/expressions/number.py @@ -22,3 +22,7 @@ class Number(Expression[Parent], Builtin, Generic[Parent]): @override def _compute_dependencies(self, usage_type: UsageKind, dest: HasName | None = None) -> None: pass + + @property + def __class__(self): + return int diff --git a/src/codegen/sdk/core/expressions/string.py b/src/codegen/sdk/core/expressions/string.py index b604e4486..aa4240db4 100644 --- a/src/codegen/sdk/core/expressions/string.py +++ b/src/codegen/sdk/core/expressions/string.py @@ -68,3 +68,7 @@ def _compute_dependencies(self, usage_type: UsageKind | None = None, dest: HasNa # If the string is a template string, we need to compute the dependencies of the string content for expression in self.expressions: expression._compute_dependencies(usage_type, dest) + + @property + def __class__(self): + return str diff --git a/src/codegen/sdk/core/interfaces/editable.py b/src/codegen/sdk/core/interfaces/editable.py index 0fc5343ef..625828b74 100644 --- a/src/codegen/sdk/core/interfaces/editable.py +++ b/src/codegen/sdk/core/interfaces/editable.py @@ -168,10 +168,10 @@ def __rich_console__(self, console: Console, options: ConsoleOptions) -> RenderR def __eq__(self, other: object): if other is None: return False - if isinstance(other, str): - return self.source == other if isinstance(other, Editable): return self.filepath == other.filepath and self.ts_node.kind_id == other.ts_node.kind_id and self.range == other.range + if isinstance(other, str): + return self.source == other return False @reader diff --git a/src/codegen/sdk/core/symbol_group.py b/src/codegen/sdk/core/symbol_group.py index c8340e012..24d75c15d 100644 --- a/src/codegen/sdk/core/symbol_group.py +++ b/src/codegen/sdk/core/symbol_group.py @@ -47,10 +47,10 @@ def __hash__(self): def __eq__(self, other: object) -> bool: if other is None: return False - if isinstance(other, list): - return self.symbols == other if isinstance(other, SymbolGroup): return self.symbols == other.symbols + if isinstance(other, list): + return self.symbols == other return super().__eq__(other) @property diff --git a/src/codegen/sdk/core/symbol_groups/dict.py b/src/codegen/sdk/core/symbol_groups/dict.py index 6e729e2fe..26365d948 100644 --- a/src/codegen/sdk/core/symbol_groups/dict.py +++ b/src/codegen/sdk/core/symbol_groups/dict.py @@ -174,3 +174,7 @@ def descendant_symbols(self) -> list["Importable"]: if child.value: ret.extend(child.value.descendant_symbols) return ret + + @property + def __class__(self): + return dict diff --git a/src/codegen/sdk/core/symbol_groups/list.py b/src/codegen/sdk/core/symbol_groups/list.py index 5d8555f9b..06fce41bf 100644 --- a/src/codegen/sdk/core/symbol_groups/list.py +++ b/src/codegen/sdk/core/symbol_groups/list.py @@ -24,3 +24,7 @@ class List(Collection["Expression[Self, None]", Parent], Expression[Parent], Bui def __init__(self, ts_node: TSNode, file_node_id: NodeId, G: "CodebaseGraph", parent: Parent) -> None: super().__init__(ts_node, file_node_id, G, parent) self._init_children([self._parse_expression(child) for child in ts_node.named_children if child.type]) + + @property + def __class__(self): + return list diff --git a/src/codegen/sdk/core/symbol_groups/tuple.py b/src/codegen/sdk/core/symbol_groups/tuple.py index f92de381b..525d5bba2 100644 --- a/src/codegen/sdk/core/symbol_groups/tuple.py +++ b/src/codegen/sdk/core/symbol_groups/tuple.py @@ -24,3 +24,7 @@ class Tuple(Collection["Expression[Self, None]", Parent], Expression[Parent], Bu def __init__(self, ts_node: TSNode, file_node_id: NodeId, G: "CodebaseGraph", parent: Parent) -> None: super().__init__(ts_node, file_node_id, G, parent) self._init_children([self._parse_expression(child) for child in ts_node.named_children if child.type]) + + @property + def __class__(self): + return tuple diff --git a/tests/unit/codegen/sdk/python/expressions/test_builtin_types.py b/tests/unit/codegen/sdk/python/expressions/test_builtin_types.py new file mode 100644 index 000000000..74204a171 --- /dev/null +++ b/tests/unit/codegen/sdk/python/expressions/test_builtin_types.py @@ -0,0 +1,51 @@ +from codegen.sdk.codebase.factory.get_session import get_codebase_session +from codegen.sdk.core.expressions.boolean import Boolean +from codegen.sdk.core.expressions.number import Number +from codegen.sdk.core.expressions.string import String +from codegen.sdk.core.symbol_groups.dict import Dict +from codegen.sdk.core.symbol_groups.list import List +from codegen.sdk.core.symbol_groups.tuple import Tuple +from codegen.sdk.enums import ProgrammingLanguage + + +def test_builtin_types(tmpdir): + # language=python + content = """ +a = 1 +b = "hello" +c = True +d = [1, 2, 3] +e = {"a": 1, "b": 2} +f = (1, 2, 3) + """ + with get_codebase_session(tmpdir=tmpdir, files={"test.py": content}, programming_language=ProgrammingLanguage.PYTHON) as codebase: + file = codebase.get_file("test.py") + # Test Number + a = file.get_global_var("a") + assert isinstance(a.value, Number) + assert isinstance(a.value, int) + + # Test String + b = file.get_global_var("b") + assert isinstance(b.value, String) + assert isinstance(b.value, str) + + # Test Boolean + c = file.get_global_var("c") + assert isinstance(c.value, Boolean) + assert isinstance(c.value, bool) + + # Test List + d = file.get_global_var("d") + assert isinstance(d.value, List) + assert isinstance(d.value, list) + + # Test Dict + e = file.get_global_var("e") + assert isinstance(e.value, Dict) + assert isinstance(e.value, dict) + + # Test Tuple + f = file.get_global_var("f") + assert isinstance(f.value, Tuple) + assert isinstance(f.value, tuple) diff --git a/tests/unit/codegen/sdk/typescript/expressions/test_builtin_types.py b/tests/unit/codegen/sdk/typescript/expressions/test_builtin_types.py new file mode 100644 index 000000000..524741bbd --- /dev/null +++ b/tests/unit/codegen/sdk/typescript/expressions/test_builtin_types.py @@ -0,0 +1,44 @@ +from codegen.sdk.codebase.factory.get_session import get_codebase_session +from codegen.sdk.core.expressions.boolean import Boolean +from codegen.sdk.core.expressions.number import Number +from codegen.sdk.core.expressions.string import String +from codegen.sdk.core.symbol_groups.dict import Dict +from codegen.sdk.core.symbol_groups.list import List +from codegen.sdk.enums import ProgrammingLanguage + + +def test_builtin_types(tmpdir): + # language=typescript + content = """ +let a = 1; +let b = "hello"; +let c = true; +let d = [1, 2, 3]; +let e = {"a": 1, "b": 2}; + """ + with get_codebase_session(tmpdir=tmpdir, files={"test.ts": content}, programming_language=ProgrammingLanguage.TYPESCRIPT) as codebase: + file = codebase.get_file("test.ts") + # Test Number + a = file.get_global_var("a") + assert isinstance(a.value, Number) + assert isinstance(a.value, int) + + # Test String + b = file.get_global_var("b") + assert isinstance(b.value, String) + assert isinstance(b.value, str) + + # Test Boolean + c = file.get_global_var("c") + assert isinstance(c.value, Boolean) + assert isinstance(c.value, bool) + + # Test List/Array + d = file.get_global_var("d") + assert isinstance(d.value, List) + assert isinstance(d.value, list) + + # Test Dict/Object + e = file.get_global_var("e") + assert isinstance(e.value, Dict) + assert isinstance(e.value, dict)