Improve runnable detection for JavaScript files (#21246)

Remco Smits created

Closes #21242

![Screenshot 2024-11-27 at 18 52
51](https://github.com/user-attachments/assets/d096197c-33d2-41b9-963d-3e1a9bbdc035)
![Screenshot 2024-11-27 at 18 53
08](https://github.com/user-attachments/assets/b3202b00-3f68-4d9d-acc2-1b86c081fc34)

Release Notes:

- Improved runnable detection for JavaScript/Typescript files.

Change summary

crates/languages/src/javascript/outline.scm   | 20 ++++++++++++++------
crates/languages/src/javascript/runnables.scm | 15 +++++++++++----
crates/languages/src/tsx/outline.scm          | 20 ++++++++++++++------
crates/languages/src/tsx/runnables.scm        | 19 +++++++++++++------
crates/languages/src/typescript/outline.scm   | 20 ++++++++++++++------
crates/languages/src/typescript/runnables.scm | 19 +++++++++++++------
6 files changed, 79 insertions(+), 34 deletions(-)

Detailed changes

crates/languages/src/javascript/outline.scm 🔗

@@ -62,12 +62,20 @@
     name: (_) @name) @item
 
 ; Add support for (node:test, bun:test and Jest) runnable
-(call_expression
-    function: (_) @context
-    (#any-of? @context "it" "test" "describe")
-    arguments: (
-        arguments . (string
-            (string_fragment) @name
+(
+    (call_expression
+        function: [
+            (identifier) @_name
+            (member_expression
+                object: [
+                    (identifier) @_name
+                    (member_expression object: (identifier) @_name)
+                ]*
+            )
+        ]* @context
+        (#any-of? @_name "it" "test" "describe")
+        arguments: (
+            arguments . (string (string_fragment) @name)
         )
     )
 ) @item

crates/languages/src/javascript/runnables.scm 🔗

@@ -2,13 +2,20 @@
 ; Function expression that has `it`, `test` or `describe` as the function name
 (
     (call_expression
-        function: (_) @_name
+        function: [
+            (identifier) @_name
+            (member_expression
+                object: [
+                    (identifier) @_name
+                    (member_expression object: (identifier) @_name)
+                ]*
+            )
+        ]
         (#any-of? @_name "it" "test" "describe")
         arguments: (
-            arguments . (string
-                (string_fragment) @run
-            )
+            arguments . (string (string_fragment) @run)
         )
     ) @_js-test
+
     (#set! tag js-test)
 )

crates/languages/src/tsx/outline.scm 🔗

@@ -70,12 +70,20 @@
     name: (_) @name) @item
 
 ; Add support for (node:test, bun:test and Jest) runnable
-(call_expression
-    function: (_) @context
-    (#any-of? @context "it" "test" "describe")
-    arguments: (
-        arguments . (string
-            (string_fragment) @name
+(
+    (call_expression
+        function: [
+            (identifier) @_name
+            (member_expression
+                object: [
+                    (identifier) @_name
+                    (member_expression object: (identifier) @_name)
+                ]*
+            )
+        ]* @context
+        (#any-of? @_name "it" "test" "describe")
+        arguments: (
+            arguments . (string (string_fragment) @name)
         )
     )
 ) @item

crates/languages/src/tsx/runnables.scm 🔗

@@ -2,13 +2,20 @@
 ; Function expression that has `it`, `test` or `describe` as the function name
 (
     (call_expression
-        function: (_) @_name
+        function: [
+            (identifier) @_name
+            (member_expression
+                object: [
+                    (identifier) @_name
+                    (member_expression object: (identifier) @_name)
+                ]*
+            )
+        ]
         (#any-of? @_name "it" "test" "describe")
         arguments: (
-            arguments . (string
-                (string_fragment) @run
-            )
+            arguments . (string (string_fragment) @run)
         )
-    ) @_tsx-test
-    (#set! tag tsx-test)
+    ) @_js-test
+
+    (#set! tag js-test)
 )

crates/languages/src/typescript/outline.scm 🔗

@@ -70,12 +70,20 @@
     name: (_) @name) @item
 
 ; Add support for (node:test, bun:test and Jest) runnable
-(call_expression
-    function: (_) @context
-    (#any-of? @context "it" "test" "describe")
-    arguments: (
-        arguments . (string
-            (string_fragment) @name
+(
+    (call_expression
+        function: [
+            (identifier) @_name
+            (member_expression
+                object: [
+                    (identifier) @_name
+                    (member_expression object: (identifier) @_name)
+                ]*
+            )
+        ]* @context
+        (#any-of? @_name "it" "test" "describe")
+        arguments: (
+            arguments . (string (string_fragment) @name)
         )
     )
 ) @item

crates/languages/src/typescript/runnables.scm 🔗

@@ -2,13 +2,20 @@
 ; Function expression that has `it`, `test` or `describe` as the function name
 (
     (call_expression
-        function: (_) @_name
+        function: [
+            (identifier) @_name
+            (member_expression
+                object: [
+                    (identifier) @_name
+                    (member_expression object: (identifier) @_name)
+                ]*
+            )
+        ]
         (#any-of? @_name "it" "test" "describe")
         arguments: (
-            arguments . (string
-                (string_fragment) @run
-            )
+            arguments . (string (string_fragment) @run)
         )
-    ) @_ts-test
-    (#set! tag ts-test)
+    ) @_js-test
+
+    (#set! tag js-test)
 )