From 12b03af394f1841cc53bfda3dcc6f1b16f3437d2 Mon Sep 17 00:00:00 2001 From: Bastiaan Marinus van de Weerd Date: Thu, 3 Apr 2025 10:47:14 -0300 Subject: [PATCH] Fix deep property access in TypeScript. --- .../src/stack-graphs.tsg | 17 +++++++++++--- .../test/expressions/access-properties.ts | 23 +++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 languages/tree-sitter-stack-graphs-typescript/test/expressions/access-properties.ts diff --git a/languages/tree-sitter-stack-graphs-typescript/src/stack-graphs.tsg b/languages/tree-sitter-stack-graphs-typescript/src/stack-graphs.tsg index 773abde7c..b99fcdb34 100644 --- a/languages/tree-sitter-stack-graphs-typescript/src/stack-graphs.tsg +++ b/languages/tree-sitter-stack-graphs-typescript/src/stack-graphs.tsg @@ -2361,12 +2361,17 @@ if none @is_async { } [ - (nested_identifier object:(_)@mod) - (member_expression object:[(member_expression) (identifier)]@mod) + (nested_identifier object:(_)) + (member_expression object:(_)) ]@nested { node @nested.expr_def node @nested.type_def +} +[ + (nested_identifier object:(_)@mod) + (member_expression object:[(member_expression) (identifier)]@mod) +]@nested { edge @nested.expr_def -> @mod.expr_def edge @nested.type_def -> @mod.type_def } @@ -5583,11 +5588,17 @@ if none @is_acc { edge @name.type_ref_member -> @name.type_ref } +[ + (nested_identifier object:(_)) + (member_expression object:(_)) +]@nested { + node @nested.type_ref +} + [ (nested_identifier object:(_)@mod) (member_expression object:[(member_expression) (identifier)]@mod) ]@nested { - node @nested.type_ref edge @mod.type_ref -> @nested.type_ref } diff --git a/languages/tree-sitter-stack-graphs-typescript/test/expressions/access-properties.ts b/languages/tree-sitter-stack-graphs-typescript/test/expressions/access-properties.ts new file mode 100644 index 000000000..a98966929 --- /dev/null +++ b/languages/tree-sitter-stack-graphs-typescript/test/expressions/access-properties.ts @@ -0,0 +1,23 @@ +{ + let x = { y: 42 }; + x.y; +// ^ defined: 2 +} + +{ /// Deep + let x = { y: { z: 42 } }; + x.y.z; +// ^ defined: 8 +} + +{ /// Deep with parenthesized expression + let x = { y: { z: 42 } }; + (x).y.z; +// ^ defined: 14 +} + +{ /// Deep with subscript expression + let x = [{ y: { z: 42 } }]; + x[0].y.z; +// ^ defined: 20 +}