Screenshots of current vs new
New:
Current:
Current vscode (cursor):
I have never touched scheme before, and pair-programmed this with ai, so
please let me know if there's any glaring issues with the
implementation. I just miss the outline panel in vscode very much, and
would love to see this land.
Happy to help with tsx/jsx as well if this is the direction you guys
were thinking of taking the outline impl.
Doesn't fully close https://github.com/zed-industries/zed/issues/20964
as there is no support for chained class method callbacks or
`Class.prototype.method = ...` as mentioned in
https://github.com/zed-industries/zed/issues/21243, but this is a step
forward.
Release Notes:
- Improved typescript and javascript symbol outline panel
---
crates/languages/src/javascript/outline.scm | 146 +++++++++++--
crates/languages/src/typescript.rs | 220 +++++++++++++++++++-
crates/languages/src/typescript/outline.scm | 145 +++++++++++--
3 files changed, 468 insertions(+), 43 deletions(-)
diff --git a/crates/languages/src/javascript/outline.scm b/crates/languages/src/javascript/outline.scm
index ca16c27a27be3e1e09ced16cd2eef7aa28345f9e..5f72103bc63bdfab73f7b858c01abe8d34317b22 100644
--- a/crates/languages/src/javascript/outline.scm
+++ b/crates/languages/src/javascript/outline.scm
@@ -31,38 +31,103 @@
(export_statement
(lexical_declaration
["let" "const"] @context
- ; Multiple names may be exported - @item is on the declarator to keep
- ; ranges distinct.
(variable_declarator
- name: (_) @name) @item)))
+ name: (identifier) @name) @item)))
+
+; Exported array destructuring
+(program
+ (export_statement
+ (lexical_declaration
+ ["let" "const"] @context
+ (variable_declarator
+ name: (array_pattern
+ [
+ (identifier) @name @item
+ (assignment_pattern left: (identifier) @name @item)
+ (rest_pattern (identifier) @name @item)
+ ])))))
+
+; Exported object destructuring
+(program
+ (export_statement
+ (lexical_declaration
+ ["let" "const"] @context
+ (variable_declarator
+ name: (object_pattern
+ [(shorthand_property_identifier_pattern) @name @item
+ (pair_pattern
+ value: (identifier) @name @item)
+ (pair_pattern
+ value: (assignment_pattern left: (identifier) @name @item))
+ (rest_pattern (identifier) @name @item)])))))
(program
(lexical_declaration
["let" "const"] @context
- ; Multiple names may be defined - @item is on the declarator to keep
- ; ranges distinct.
(variable_declarator
- name: (_) @name) @item))
+ name: (identifier) @name) @item))
+
+; Top-level array destructuring
+(program
+ (lexical_declaration
+ ["let" "const"] @context
+ (variable_declarator
+ name: (array_pattern
+ [
+ (identifier) @name @item
+ (assignment_pattern left: (identifier) @name @item)
+ (rest_pattern (identifier) @name @item)
+ ]))))
+
+; Top-level object destructuring
+(program
+ (lexical_declaration
+ ["let" "const"] @context
+ (variable_declarator
+ name: (object_pattern
+ [(shorthand_property_identifier_pattern) @name @item
+ (pair_pattern
+ value: (identifier) @name @item)
+ (pair_pattern
+ value: (assignment_pattern left: (identifier) @name @item))
+ (rest_pattern (identifier) @name @item)]))))
(class_declaration
"class" @context
name: (_) @name) @item
-(method_definition
- [
- "get"
- "set"
- "async"
- "*"
- "readonly"
- "static"
- (override_modifier)
- (accessibility_modifier)
- ]* @context
- name: (_) @name
- parameters: (formal_parameters
- "(" @context
- ")" @context)) @item
+; Method definitions in classes (not in object literals)
+(class_body
+ (method_definition
+ [
+ "get"
+ "set"
+ "async"
+ "*"
+ "readonly"
+ "static"
+ (override_modifier)
+ (accessibility_modifier)
+ ]* @context
+ name: (_) @name
+ parameters: (formal_parameters
+ "(" @context
+ ")" @context)) @item)
+
+; Object literal methods
+(variable_declarator
+ value: (object
+ (method_definition
+ [
+ "get"
+ "set"
+ "async"
+ "*"
+ ]* @context
+ name: (_) @name
+ parameters: (formal_parameters
+ "(" @context
+ ")" @context)) @item))
(public_field_definition
[
@@ -116,4 +181,43 @@
)
) @item
+; Object properties
+(pair
+ key: [
+ (property_identifier) @name
+ (string (string_fragment) @name)
+ (number) @name
+ (computed_property_name) @name
+ ]) @item
+
+; Nested variables in function bodies
+(statement_block
+ (lexical_declaration
+ ["let" "const"] @context
+ (variable_declarator
+ name: (identifier) @name) @item))
+
+; Nested array destructuring in functions
+(statement_block
+ (lexical_declaration
+ ["let" "const"] @context
+ (variable_declarator
+ name: (array_pattern
+ [
+ (identifier) @name @item
+ (assignment_pattern left: (identifier) @name @item)
+ (rest_pattern (identifier) @name @item)
+ ]))))
+
+; Nested object destructuring in functions
+(statement_block
+ (lexical_declaration
+ ["let" "const"] @context
+ (variable_declarator
+ name: (object_pattern
+ [(shorthand_property_identifier_pattern) @name @item
+ (pair_pattern value: (identifier) @name @item)
+ (pair_pattern value: (assignment_pattern left: (identifier) @name @item))
+ (rest_pattern (identifier) @name @item)]))))
+
(comment) @annotation
diff --git a/crates/languages/src/typescript.rs b/crates/languages/src/typescript.rs
index a9a1104c8c6cfa2b6eaa7083d18316cee4978fc8..334fd4c4a717d2b0a9890611ff5cc21f3d898aeb 100644
--- a/crates/languages/src/typescript.rs
+++ b/crates/languages/src/typescript.rs
@@ -1110,7 +1110,7 @@ mod tests {
let text = r#"
function a() {
- // local variables are omitted
+ // local variables are included
let a1 = 1;
// all functions are included
async function a2() {}
@@ -1133,6 +1133,7 @@ mod tests {
.collect::