From 544ca443e3dc51e94557c4284f79003d228dc719 Mon Sep 17 00:00:00 2001 From: Keith Simmons Date: Tue, 12 Apr 2022 11:30:37 -0700 Subject: [PATCH] Add javascript and jsx specific languages --- crates/zed/src/languages.rs | 10 + .../zed/src/languages/javascript/brackets.scm | 5 + .../zed/src/languages/javascript/config.toml | 12 + .../src/languages/javascript/highlights.scm | 219 ++++++++++++++++++ .../zed/src/languages/javascript/indents.scm | 15 ++ .../zed/src/languages/javascript/outline.scm | 55 +++++ crates/zed/src/languages/jsx/brackets.scm | 5 + crates/zed/src/languages/jsx/config.toml | 12 + .../zed/src/languages/jsx/highlights-jsx.scm | 0 crates/zed/src/languages/jsx/highlights.scm | 219 ++++++++++++++++++ crates/zed/src/languages/jsx/indents.scm | 15 ++ crates/zed/src/languages/jsx/outline.scm | 55 +++++ crates/zed/src/languages/tsx/config.toml | 2 +- crates/zed/src/main.rs | 14 ++ 14 files changed, 637 insertions(+), 1 deletion(-) create mode 100644 crates/zed/src/languages/javascript/brackets.scm create mode 100644 crates/zed/src/languages/javascript/config.toml create mode 100644 crates/zed/src/languages/javascript/highlights.scm create mode 100644 crates/zed/src/languages/javascript/indents.scm create mode 100644 crates/zed/src/languages/javascript/outline.scm create mode 100644 crates/zed/src/languages/jsx/brackets.scm create mode 100644 crates/zed/src/languages/jsx/config.toml create mode 100644 crates/zed/src/languages/jsx/highlights-jsx.scm create mode 100644 crates/zed/src/languages/jsx/highlights.scm create mode 100644 crates/zed/src/languages/jsx/indents.scm create mode 100644 crates/zed/src/languages/jsx/outline.scm diff --git a/crates/zed/src/languages.rs b/crates/zed/src/languages.rs index 75a5030ec6a9991ef87d7ebc764c5aabaa6d27d6..b62ae1bfdbb54300eca966f1827664d7c4690dd5 100644 --- a/crates/zed/src/languages.rs +++ b/crates/zed/src/languages.rs @@ -42,11 +42,21 @@ pub fn build_language_registry(login_shell_env_loaded: Task<()>) -> LanguageRegi tree_sitter_typescript::language_tsx(), Some(Arc::new(typescript::TypeScriptLspAdapter)), ), + ( + "jsx", + tree_sitter_typescript::language_tsx(), + Some(Arc::new(typescript::TypeScriptLspAdapter)), + ), ( "typescript", tree_sitter_typescript::language_typescript(), Some(Arc::new(typescript::TypeScriptLspAdapter)), ), + ( + "javascript", + tree_sitter_typescript::language_typescript(), + Some(Arc::new(typescript::TypeScriptLspAdapter)), + ), ] { languages.add(Arc::new(language(name, grammar, lsp_adapter))); } diff --git a/crates/zed/src/languages/javascript/brackets.scm b/crates/zed/src/languages/javascript/brackets.scm new file mode 100644 index 0000000000000000000000000000000000000000..63395f81d84e6452c631a9e582e2d697cba445ef --- /dev/null +++ b/crates/zed/src/languages/javascript/brackets.scm @@ -0,0 +1,5 @@ +("(" @open ")" @close) +("[" @open "]" @close) +("{" @open "}" @close) +("<" @open ">" @close) +("\"" @open "\"" @close) diff --git a/crates/zed/src/languages/javascript/config.toml b/crates/zed/src/languages/javascript/config.toml new file mode 100644 index 0000000000000000000000000000000000000000..875dcdaf8e585908bbf9b05b64f43dcc2ee25b91 --- /dev/null +++ b/crates/zed/src/languages/javascript/config.toml @@ -0,0 +1,12 @@ +name = "JavaScript" +path_suffixes = ["js"] +line_comment = "// " +autoclose_before = ";:.,=}])>" +brackets = [ + { start = "{", end = "}", close = true, newline = true }, + { start = "[", end = "]", close = true, newline = true }, + { start = "(", end = ")", close = true, newline = true }, + { start = "<", end = ">", close = false, newline = true }, + { start = "\"", end = "\"", close = true, newline = false }, + { start = "/*", end = " */", close = true, newline = false }, +] diff --git a/crates/zed/src/languages/javascript/highlights.scm b/crates/zed/src/languages/javascript/highlights.scm new file mode 100644 index 0000000000000000000000000000000000000000..cb4e82b33d8b04da41e90c6926499669fee33b60 --- /dev/null +++ b/crates/zed/src/languages/javascript/highlights.scm @@ -0,0 +1,219 @@ +; Variables + +(identifier) @variable + +; Properties + +(property_identifier) @property + +; Function and method calls + +(call_expression + function: (identifier) @function) + +(call_expression + function: (member_expression + property: (property_identifier) @function.method)) + +; Function and method definitions + +(function + name: (identifier) @function) +(function_declaration + name: (identifier) @function) +(method_definition + name: (property_identifier) @function.method) + +(pair + key: (property_identifier) @function.method + value: [(function) (arrow_function)]) + +(assignment_expression + left: (member_expression + property: (property_identifier) @function.method) + right: [(function) (arrow_function)]) + +(variable_declarator + name: (identifier) @function + value: [(function) (arrow_function)]) + +(assignment_expression + left: (identifier) @function + right: [(function) (arrow_function)]) + +; Special identifiers + +((identifier) @constructor + (#match? @constructor "^[A-Z]")) + +([ + (identifier) + (shorthand_property_identifier) + (shorthand_property_identifier_pattern) + ] @constant + (#match? @constant "^[A-Z_][A-Z\\d_]+$")) + +; Literals + +(this) @variable.builtin +(super) @variable.builtin + +[ + (true) + (false) + (null) + (undefined) +] @constant.builtin + +(comment) @comment + +[ + (string) + (template_string) +] @string + +(regex) @string.special +(number) @number + +; Tokens + +(template_substitution + "${" @punctuation.special + "}" @punctuation.special) @embedded + +[ + ";" + "?." + "." + "," +] @punctuation.delimiter + +[ + "-" + "--" + "-=" + "+" + "++" + "+=" + "*" + "*=" + "**" + "**=" + "/" + "/=" + "%" + "%=" + "<" + "<=" + "<<" + "<<=" + "=" + "==" + "===" + "!" + "!=" + "!==" + "=>" + ">" + ">=" + ">>" + ">>=" + ">>>" + ">>>=" + "~" + "^" + "&" + "|" + "^=" + "&=" + "|=" + "&&" + "||" + "??" + "&&=" + "||=" + "??=" +] @operator + +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + +[ + "as" + "async" + "await" + "break" + "case" + "catch" + "class" + "const" + "continue" + "debugger" + "default" + "delete" + "do" + "else" + "export" + "extends" + "finally" + "for" + "from" + "function" + "get" + "if" + "import" + "in" + "instanceof" + "let" + "new" + "of" + "return" + "set" + "static" + "switch" + "target" + "throw" + "try" + "typeof" + "var" + "void" + "while" + "with" + "yield" +] @keyword + +; Types + +(type_identifier) @type +(predefined_type) @type.builtin + +((identifier) @type + (#match? @type "^[A-Z]")) + +(type_arguments + "<" @punctuation.bracket + ">" @punctuation.bracket) + +; Keywords + +[ "abstract" + "declare" + "enum" + "export" + "implements" + "interface" + "keyof" + "namespace" + "private" + "protected" + "public" + "type" + "readonly" + "override" +] @keyword \ No newline at end of file diff --git a/crates/zed/src/languages/javascript/indents.scm b/crates/zed/src/languages/javascript/indents.scm new file mode 100644 index 0000000000000000000000000000000000000000..107e6ff8e03b633f408676243c24d0d9707a2a26 --- /dev/null +++ b/crates/zed/src/languages/javascript/indents.scm @@ -0,0 +1,15 @@ +[ + (call_expression) + (assignment_expression) + (member_expression) + (lexical_declaration) + (variable_declaration) + (assignment_expression) + (if_statement) + (for_statement) +] @indent + +(_ "[" "]" @end) @indent +(_ "<" ">" @end) @indent +(_ "{" "}" @end) @indent +(_ "(" ")" @end) @indent diff --git a/crates/zed/src/languages/javascript/outline.scm b/crates/zed/src/languages/javascript/outline.scm new file mode 100644 index 0000000000000000000000000000000000000000..f8691fa41d9f64bc71e8a7ada2e6d64d62268a3a --- /dev/null +++ b/crates/zed/src/languages/javascript/outline.scm @@ -0,0 +1,55 @@ +(internal_module + "namespace" @context + name: (_) @name) @item + +(enum_declaration + "enum" @context + name: (_) @name) @item + +(function_declaration + "async"? @context + "function" @context + name: (_) @name + parameters: (formal_parameters + "(" @context + ")" @context)) @item + +(interface_declaration + "interface" @context + name: (_) @name) @item + +(program + (lexical_declaration + ["let" "const"] @context + (variable_declarator + name: (_) @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 + +(public_field_definition + [ + "declare" + "readonly" + "abstract" + "static" + (accessibility_modifier) + ]* @context + name: (_) @name) @item diff --git a/crates/zed/src/languages/jsx/brackets.scm b/crates/zed/src/languages/jsx/brackets.scm new file mode 100644 index 0000000000000000000000000000000000000000..63395f81d84e6452c631a9e582e2d697cba445ef --- /dev/null +++ b/crates/zed/src/languages/jsx/brackets.scm @@ -0,0 +1,5 @@ +("(" @open ")" @close) +("[" @open "]" @close) +("{" @open "}" @close) +("<" @open ">" @close) +("\"" @open "\"" @close) diff --git a/crates/zed/src/languages/jsx/config.toml b/crates/zed/src/languages/jsx/config.toml new file mode 100644 index 0000000000000000000000000000000000000000..3e4dc5f79f300de8ec2883f6d012b64e0c989dc4 --- /dev/null +++ b/crates/zed/src/languages/jsx/config.toml @@ -0,0 +1,12 @@ +name = "JSX" +path_suffixes = ["jsx"] +line_comment = "// " +autoclose_before = ";:.,=}])>" +brackets = [ + { start = "{", end = "}", close = true, newline = true }, + { start = "[", end = "]", close = true, newline = true }, + { start = "(", end = ")", close = true, newline = true }, + { start = "<", end = ">", close = false, newline = true }, + { start = "\"", end = "\"", close = true, newline = false }, + { start = "/*", end = " */", close = true, newline = false }, +] diff --git a/crates/zed/src/languages/jsx/highlights-jsx.scm b/crates/zed/src/languages/jsx/highlights-jsx.scm new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/crates/zed/src/languages/jsx/highlights.scm b/crates/zed/src/languages/jsx/highlights.scm new file mode 100644 index 0000000000000000000000000000000000000000..cb4e82b33d8b04da41e90c6926499669fee33b60 --- /dev/null +++ b/crates/zed/src/languages/jsx/highlights.scm @@ -0,0 +1,219 @@ +; Variables + +(identifier) @variable + +; Properties + +(property_identifier) @property + +; Function and method calls + +(call_expression + function: (identifier) @function) + +(call_expression + function: (member_expression + property: (property_identifier) @function.method)) + +; Function and method definitions + +(function + name: (identifier) @function) +(function_declaration + name: (identifier) @function) +(method_definition + name: (property_identifier) @function.method) + +(pair + key: (property_identifier) @function.method + value: [(function) (arrow_function)]) + +(assignment_expression + left: (member_expression + property: (property_identifier) @function.method) + right: [(function) (arrow_function)]) + +(variable_declarator + name: (identifier) @function + value: [(function) (arrow_function)]) + +(assignment_expression + left: (identifier) @function + right: [(function) (arrow_function)]) + +; Special identifiers + +((identifier) @constructor + (#match? @constructor "^[A-Z]")) + +([ + (identifier) + (shorthand_property_identifier) + (shorthand_property_identifier_pattern) + ] @constant + (#match? @constant "^[A-Z_][A-Z\\d_]+$")) + +; Literals + +(this) @variable.builtin +(super) @variable.builtin + +[ + (true) + (false) + (null) + (undefined) +] @constant.builtin + +(comment) @comment + +[ + (string) + (template_string) +] @string + +(regex) @string.special +(number) @number + +; Tokens + +(template_substitution + "${" @punctuation.special + "}" @punctuation.special) @embedded + +[ + ";" + "?." + "." + "," +] @punctuation.delimiter + +[ + "-" + "--" + "-=" + "+" + "++" + "+=" + "*" + "*=" + "**" + "**=" + "/" + "/=" + "%" + "%=" + "<" + "<=" + "<<" + "<<=" + "=" + "==" + "===" + "!" + "!=" + "!==" + "=>" + ">" + ">=" + ">>" + ">>=" + ">>>" + ">>>=" + "~" + "^" + "&" + "|" + "^=" + "&=" + "|=" + "&&" + "||" + "??" + "&&=" + "||=" + "??=" +] @operator + +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + +[ + "as" + "async" + "await" + "break" + "case" + "catch" + "class" + "const" + "continue" + "debugger" + "default" + "delete" + "do" + "else" + "export" + "extends" + "finally" + "for" + "from" + "function" + "get" + "if" + "import" + "in" + "instanceof" + "let" + "new" + "of" + "return" + "set" + "static" + "switch" + "target" + "throw" + "try" + "typeof" + "var" + "void" + "while" + "with" + "yield" +] @keyword + +; Types + +(type_identifier) @type +(predefined_type) @type.builtin + +((identifier) @type + (#match? @type "^[A-Z]")) + +(type_arguments + "<" @punctuation.bracket + ">" @punctuation.bracket) + +; Keywords + +[ "abstract" + "declare" + "enum" + "export" + "implements" + "interface" + "keyof" + "namespace" + "private" + "protected" + "public" + "type" + "readonly" + "override" +] @keyword \ No newline at end of file diff --git a/crates/zed/src/languages/jsx/indents.scm b/crates/zed/src/languages/jsx/indents.scm new file mode 100644 index 0000000000000000000000000000000000000000..107e6ff8e03b633f408676243c24d0d9707a2a26 --- /dev/null +++ b/crates/zed/src/languages/jsx/indents.scm @@ -0,0 +1,15 @@ +[ + (call_expression) + (assignment_expression) + (member_expression) + (lexical_declaration) + (variable_declaration) + (assignment_expression) + (if_statement) + (for_statement) +] @indent + +(_ "[" "]" @end) @indent +(_ "<" ">" @end) @indent +(_ "{" "}" @end) @indent +(_ "(" ")" @end) @indent diff --git a/crates/zed/src/languages/jsx/outline.scm b/crates/zed/src/languages/jsx/outline.scm new file mode 100644 index 0000000000000000000000000000000000000000..f8691fa41d9f64bc71e8a7ada2e6d64d62268a3a --- /dev/null +++ b/crates/zed/src/languages/jsx/outline.scm @@ -0,0 +1,55 @@ +(internal_module + "namespace" @context + name: (_) @name) @item + +(enum_declaration + "enum" @context + name: (_) @name) @item + +(function_declaration + "async"? @context + "function" @context + name: (_) @name + parameters: (formal_parameters + "(" @context + ")" @context)) @item + +(interface_declaration + "interface" @context + name: (_) @name) @item + +(program + (lexical_declaration + ["let" "const"] @context + (variable_declarator + name: (_) @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 + +(public_field_definition + [ + "declare" + "readonly" + "abstract" + "static" + (accessibility_modifier) + ]* @context + name: (_) @name) @item diff --git a/crates/zed/src/languages/tsx/config.toml b/crates/zed/src/languages/tsx/config.toml index a6f4a6d2d000d5bcf83219a27b52446178c7e079..62717266df9e0bd56d83b336cfbf28aa2b01ee4b 100644 --- a/crates/zed/src/languages/tsx/config.toml +++ b/crates/zed/src/languages/tsx/config.toml @@ -1,5 +1,5 @@ name = "TSX" -path_suffixes = ["tsx", "js"] +path_suffixes = ["tsx"] line_comment = "// " autoclose_before = ";:.,=}])>" brackets = [ diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 1c24c613d7cb437fbe92c97b46ab5372a29ed92e..599754dd9e0abfb63eec8c2ba04ccb4587713f83 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -55,6 +55,20 @@ fn main() { ..Default::default() }, ) + .with_overrides( + "JavaScript", + settings::LanguageOverride { + tab_size: Some(2), + ..Default::default() + }, + ) + .with_overrides( + "JSX", + settings::LanguageOverride { + tab_size: Some(2), + ..Default::default() + }, + ) .with_overrides( "TypeScript", settings::LanguageOverride {