From 9af25b372f39594ab668d89719cb9d3afb181f0e Mon Sep 17 00:00:00 2001 From: Bastiaan Marinus van de Weerd Date: Tue, 19 Nov 2024 17:57:41 -0300 Subject: [PATCH 1/3] Fix JS optional-chained member expression. --- .../src/stack-graphs.tsg | 7 ++++++- .../test/expressions/member_expression.js | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/languages/tree-sitter-stack-graphs-javascript/src/stack-graphs.tsg b/languages/tree-sitter-stack-graphs-javascript/src/stack-graphs.tsg index a9167c3a1..1e20060bb 100644 --- a/languages/tree-sitter-stack-graphs-javascript/src/stack-graphs.tsg +++ b/languages/tree-sitter-stack-graphs-javascript/src/stack-graphs.tsg @@ -3189,7 +3189,12 @@ inherit .containing_class_value ;; ##### Member Expressions (member_expression - (_)@object . (_)@property)@member_expr + . + (_)@object + (_)? ; '?.' `optional_chain` operator + (_)@property + . +)@member_expr { node member_push diff --git a/languages/tree-sitter-stack-graphs-javascript/test/expressions/member_expression.js b/languages/tree-sitter-stack-graphs-javascript/test/expressions/member_expression.js index b397d747a..7eb7a8e56 100644 --- a/languages/tree-sitter-stack-graphs-javascript/test/expressions/member_expression.js +++ b/languages/tree-sitter-stack-graphs-javascript/test/expressions/member_expression.js @@ -15,4 +15,9 @@ let x = 1; // Flow around /**/ x; -// ^ defined: 1 \ No newline at end of file +// ^ defined: 1 + +// Optional chain + +/**/ x?.foo +// ^ defined: 1 From cf773f4a72d072b24253e3ee26a006504acaa2bf Mon Sep 17 00:00:00 2001 From: Hendrik van Antwerpen Date: Fri, 6 Dec 2024 15:58:37 +0100 Subject: [PATCH 2/3] Suggestion --- .../tree-sitter-stack-graphs-javascript/src/stack-graphs.tsg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/tree-sitter-stack-graphs-javascript/src/stack-graphs.tsg b/languages/tree-sitter-stack-graphs-javascript/src/stack-graphs.tsg index 1e20060bb..a1cad6217 100644 --- a/languages/tree-sitter-stack-graphs-javascript/src/stack-graphs.tsg +++ b/languages/tree-sitter-stack-graphs-javascript/src/stack-graphs.tsg @@ -3191,7 +3191,7 @@ inherit .containing_class_value (member_expression . (_)@object - (_)? ; '?.' `optional_chain` operator + (optional_chain)? ; '?.' operator (_)@property . )@member_expr From 60681c3e0464c397a29dbec76e874e6f0d407d42 Mon Sep 17 00:00:00 2001 From: Hendrik van Antwerpen Date: Fri, 6 Dec 2024 16:25:17 +0100 Subject: [PATCH 3/3] Use field names instead of positions to match member expressions --- .../src/stack-graphs.tsg | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/languages/tree-sitter-stack-graphs-javascript/src/stack-graphs.tsg b/languages/tree-sitter-stack-graphs-javascript/src/stack-graphs.tsg index a1cad6217..21650ea83 100644 --- a/languages/tree-sitter-stack-graphs-javascript/src/stack-graphs.tsg +++ b/languages/tree-sitter-stack-graphs-javascript/src/stack-graphs.tsg @@ -3189,27 +3189,22 @@ inherit .containing_class_value ;; ##### Member Expressions (member_expression - . - (_)@object - (optional_chain)? ; '?.' operator - (_)@property - . -)@member_expr -{ - - node member_push - node property_push + object:(_)@object + property:(_)@property +)@member_expr { + node member_push + node property_push ; scopes flow into object then back out edge @object.before_scope -> @member_expr.before_scope edge @member_expr.after_scope -> @object.after_scope ; value is a member projection on the value of the object ie. a push then push dot - attr (member_push) push_symbol = "GUARD:MEMBER" - attr (property_push) node_reference = @property - edge property_push -> member_push - edge @member_expr.value -> property_push - edge member_push -> @object.value + attr (member_push) push_symbol = "GUARD:MEMBER" + attr (property_push) node_reference = @property + edge property_push -> member_push + edge @member_expr.value -> property_push + edge member_push -> @object.value ; (member_expression) nodes can occur in patterns node @member_expr.covalue