From 5dee43b05cd83d6746b8c8dee5ef8d455190dbf6 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Wed, 30 Oct 2024 11:00:06 -0400 Subject: [PATCH] dart: Extract to zed-extensions/dart repository (#19959) This PR extracts the Dart extension to the [zed-extensions/dart](https://github.com/zed-extensions/dart) repository. Release Notes: - N/A --- Cargo.lock | 7 - Cargo.toml | 1 - docs/src/languages/dart.md | 2 +- extensions/dart/Cargo.toml | 16 -- extensions/dart/LICENSE-APACHE | 1 - extensions/dart/README.md | 6 - extensions/dart/extension.toml | 16 -- extensions/dart/languages/dart/brackets.scm | 6 - extensions/dart/languages/dart/config.toml | 15 - extensions/dart/languages/dart/highlights.scm | 269 ------------------ extensions/dart/languages/dart/indents.scm | 3 - extensions/dart/languages/dart/outline.scm | 18 -- extensions/dart/languages/dart/runnables.scm | 45 --- extensions/dart/languages/dart/tasks.json | 26 -- extensions/dart/src/dart.rs | 162 ----------- 15 files changed, 1 insertion(+), 592 deletions(-) delete mode 100644 extensions/dart/Cargo.toml delete mode 120000 extensions/dart/LICENSE-APACHE delete mode 100644 extensions/dart/README.md delete mode 100644 extensions/dart/extension.toml delete mode 100644 extensions/dart/languages/dart/brackets.scm delete mode 100644 extensions/dart/languages/dart/config.toml delete mode 100644 extensions/dart/languages/dart/highlights.scm delete mode 100644 extensions/dart/languages/dart/indents.scm delete mode 100644 extensions/dart/languages/dart/outline.scm delete mode 100644 extensions/dart/languages/dart/runnables.scm delete mode 100644 extensions/dart/languages/dart/tasks.json delete mode 100644 extensions/dart/src/dart.rs diff --git a/Cargo.lock b/Cargo.lock index 266c1922bbb3114d40aa1ead3233bd4d0f9ce36d..039016a50ae34fa7daa2f5a3328c357ebf3a7d71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15173,13 +15173,6 @@ dependencies = [ "zed_extension_api 0.1.0", ] -[[package]] -name = "zed_dart" -version = "0.1.2" -dependencies = [ - "zed_extension_api 0.1.0", -] - [[package]] name = "zed_deno" version = "0.0.2" diff --git a/Cargo.toml b/Cargo.toml index d67f78dc2bfcea5cb714e8b7a564355b376bde96..fda3254cc51489160566a60a36c092bca179213e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -138,7 +138,6 @@ members = [ "extensions/astro", "extensions/clojure", "extensions/csharp", - "extensions/dart", "extensions/deno", "extensions/elixir", "extensions/elm", diff --git a/docs/src/languages/dart.md b/docs/src/languages/dart.md index 6571166b6d30616245272f84523584e8b505709a..32f312e5dd04eb1d0bb18acaaad89ef09b45f43f 100644 --- a/docs/src/languages/dart.md +++ b/docs/src/languages/dart.md @@ -1,6 +1,6 @@ # Dart -Dart support is available through the [Dart extension](https://github.com/zed-industries/zed/tree/main/extensions/dart). +Dart support is available through the [Dart extension](https://github.com/zed-extensions/dart). - Tree Sitter: [UserNobody14/tree-sitter-dart](https://github.com/UserNobody14/tree-sitter-dart) - Language Server: [dart language-server](https://github.com/dart-lang/sdk) diff --git a/extensions/dart/Cargo.toml b/extensions/dart/Cargo.toml deleted file mode 100644 index 8d50e620cc3c03d87eca7132b531376e0ec067e1..0000000000000000000000000000000000000000 --- a/extensions/dart/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "zed_dart" -version = "0.1.2" -edition = "2021" -publish = false -license = "Apache-2.0" - -[lints] -workspace = true - -[lib] -path = "src/dart.rs" -crate-type = ["cdylib"] - -[dependencies] -zed_extension_api = "0.1.0" diff --git a/extensions/dart/LICENSE-APACHE b/extensions/dart/LICENSE-APACHE deleted file mode 120000 index 1cd601d0a3affae83854be02a0afdec3b7a9ec4d..0000000000000000000000000000000000000000 --- a/extensions/dart/LICENSE-APACHE +++ /dev/null @@ -1 +0,0 @@ -../../LICENSE-APACHE \ No newline at end of file diff --git a/extensions/dart/README.md b/extensions/dart/README.md deleted file mode 100644 index bf6976dd60577a6c2b8077c6e96f52daf626874f..0000000000000000000000000000000000000000 --- a/extensions/dart/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## Roadmap - -1. Add `dart run` command. -2. Add `dart test` command. -3. Add `flutter test --name` command, to allow running a single test or group of tests. -4. Auto hot reload Flutter app when files change. diff --git a/extensions/dart/extension.toml b/extensions/dart/extension.toml deleted file mode 100644 index 684580e7c05666dddb28f34e097f046d27efca53..0000000000000000000000000000000000000000 --- a/extensions/dart/extension.toml +++ /dev/null @@ -1,16 +0,0 @@ -id = "dart" -name = "Dart" -description = "Dart support." -version = "0.1.2" -schema_version = 1 -authors = ["Abdullah Alsigar ", "Flo ", "ybbond "] -repository = "https://github.com/zed-industries/zed" - -[language_servers.dart] -name = "Dart LSP" -language = "Dart" -languages = ["Dart"] - -[grammars.dart] -repository = "https://github.com/UserNobody14/tree-sitter-dart" -commit = "6da46473ab8accb13da48113f4634e729a71d335" diff --git a/extensions/dart/languages/dart/brackets.scm b/extensions/dart/languages/dart/brackets.scm deleted file mode 100644 index 8d96f95f864cef513b6e21669a76d362322bd163..0000000000000000000000000000000000000000 --- a/extensions/dart/languages/dart/brackets.scm +++ /dev/null @@ -1,6 +0,0 @@ -("(" @open ")" @close) -("[" @open "]" @close) -("{" @open "}" @close) -("<" @open ">" @close) -("\"" @open "\"" @close) -("'" @open "'" @close) diff --git a/extensions/dart/languages/dart/config.toml b/extensions/dart/languages/dart/config.toml deleted file mode 100644 index 15420c74f0536df89c19e5e00c0b4d0e1baad85e..0000000000000000000000000000000000000000 --- a/extensions/dart/languages/dart/config.toml +++ /dev/null @@ -1,15 +0,0 @@ -name = "Dart" -grammar = "dart" -path_suffixes = ["dart"] -line_comments = ["// ", "/// "] -autoclose_before = ";:.,=}])>" -brackets = [ - { start = "{", end = "}", close = true, newline = true }, - { start = "[", end = "]", close = true, newline = true }, - { start = "(", end = ")", close = true, newline = true }, - { start = "<", end = ">", close = true, newline = false}, - { start = "\"", end = "\"", close = true, newline = false, not_in = ["string"] }, - { start = "'", end = "'", close = true, newline = false, not_in = ["string"] }, - { start = "/*", end = " */", close = true, newline = false, not_in = ["string", "comment"] }, - { start = "`", end = "`", close = true, newline = false, not_in = ["string", "comment"] }, -] diff --git a/extensions/dart/languages/dart/highlights.scm b/extensions/dart/languages/dart/highlights.scm deleted file mode 100644 index e75a86cd79f105e86b7d20c26044e6e7a8a1be08..0000000000000000000000000000000000000000 --- a/extensions/dart/languages/dart/highlights.scm +++ /dev/null @@ -1,269 +0,0 @@ -(dotted_identifier_list) @string - -; Methods -; -------------------- -(super) @function - -(function_expression_body (identifier) @type) -; ((identifier)(selector (argument_part)) @function) - -(((identifier) @function (#match? @function "^_?[a-z]")) - . (selector . (argument_part))) @function - -; Annotations -; -------------------- -(annotation - name: (identifier) @attribute) - -; Operators and Tokens -; -------------------- -(template_substitution - "$" @punctuation.special - "{" @punctuation.special - "}" @punctuation.special) @none - -(template_substitution - "$" @punctuation.special - (identifier_dollar_escaped) @variable) @none - -(escape_sequence) @string.escape - -[ - "@" - "=>" - ".." - "??" - "==" - "?" - ":" - "&&" - "%" - "<" - ">" - "=" - ">=" - "<=" - "||" - (multiplicative_operator) - (increment_operator) - (is_operator) - (prefix_operator) - (equality_operator) - (additive_operator) - ] @operator - -[ - "(" - ")" - "[" - "]" - "{" - "}" - ] @punctuation.bracket - -; Delimiters -; -------------------- -[ - ";" - "." - "," - ] @punctuation.delimiter - -; Types -; -------------------- -(class_definition - name: (identifier) @type) -(constructor_signature - name: (identifier) @type) -(scoped_identifier - scope: (identifier) @type) -(function_signature - name: (identifier) @function.method) - -(getter_signature - (identifier) @function.method) - -(setter_signature - name: (identifier) @function.method) -(enum_declaration - name: (identifier) @type) -(enum_constant - name: (identifier) @type) -(void_type) @type - -((scoped_identifier - scope: (identifier) @type - name: (identifier) @type) - (#match? @type "^[a-zA-Z]")) - -(type_identifier) @type - -(type_alias - (type_identifier) @type.definition) - -; Variables -; -------------------- -; var keyword -(inferred_type) @keyword - -((identifier) @type - (#match? @type "^_?[A-Z].*[a-z]")) - -("Function" @type) - -; properties -(unconditional_assignable_selector - (identifier) @property) - -(conditional_assignable_selector - (identifier) @property) - -; assignments -(assignment_expression - left: (assignable_expression) @variable) - -(this) @variable.builtin - -; Parameters -; -------------------- -(formal_parameter - name: (identifier) @variable.parameter) - -(named_argument - (label - (identifier) @variable.parameter)) - -; Literals -; -------------------- -[ - (hex_integer_literal) - (decimal_integer_literal) - (decimal_floating_point_literal) - ; TODO: inaccessible nodes - ; (octal_integer_literal) - ; (hex_floating_point_literal) - ] @number - -(symbol_literal) @string.special.symbol - -(string_literal) @string -(true) @boolean -(false) @boolean -(null_literal) @constant.builtin - -(comment) @comment - -(documentation_comment) @comment.documentation - -; Keywords -; -------------------- -[ - "import" - "library" - "export" - "as" - "show" - "hide" - ] @keyword.import - -; Reserved words (cannot be used as identifiers) -[ - (case_builtin) - "late" - "required" - "extension" - "on" - "class" - "enum" - "extends" - "in" - "is" - "new" - "super" - "with" - ] @keyword - -"return" @keyword.return - -; Built in identifiers: -; alone these are marked as keywords -[ - "deferred" - "factory" - "get" - "implements" - "interface" - "library" - "operator" - "mixin" - "part" - "set" - "typedef" - ] @keyword - -[ - "async" - "async*" - "sync*" - "await" - "yield" -] @keyword.coroutine - -[ - (const_builtin) - (final_builtin) - "abstract" - "covariant" - "dynamic" - "external" - "static" - "final" - "base" - "sealed" - ] @type.qualifier - -; when used as an identifier: -((identifier) @variable.builtin - (#any-of? @variable.builtin - "abstract" - "as" - "covariant" - "deferred" - "dynamic" - "export" - "external" - "factory" - "Function" - "get" - "implements" - "import" - "interface" - "library" - "operator" - "mixin" - "part" - "set" - "static" - "typedef")) - -[ - "if" - "else" - "switch" - "default" -] @keyword.conditional - -[ - "try" - "throw" - "catch" - "finally" - (break_statement) -] @keyword.exception - -[ - "do" - "while" - "continue" - "for" -] @keyword.repeat diff --git a/extensions/dart/languages/dart/indents.scm b/extensions/dart/languages/dart/indents.scm deleted file mode 100644 index 112b414aa45f277138d0c681851129a608ee96e0..0000000000000000000000000000000000000000 --- a/extensions/dart/languages/dart/indents.scm +++ /dev/null @@ -1,3 +0,0 @@ -(_ "[" "]" @end) @indent -(_ "{" "}" @end) @indent -(_ "(" ")" @end) @indent diff --git a/extensions/dart/languages/dart/outline.scm b/extensions/dart/languages/dart/outline.scm deleted file mode 100644 index 4d6f8c1cb75b6918ecad60dacfe8f6f3388f5b2c..0000000000000000000000000000000000000000 --- a/extensions/dart/languages/dart/outline.scm +++ /dev/null @@ -1,18 +0,0 @@ -(class_definition - "class" @context - name: (_) @name) @item - -(function_signature - name: (_) @name) @item - -(getter_signature - "get" @context - name: (_) @name) @item - -(setter_signature - "set" @context - name: (_) @name) @item - -(enum_declaration - "enum" @context - name: (_) @name) @item diff --git a/extensions/dart/languages/dart/runnables.scm b/extensions/dart/languages/dart/runnables.scm deleted file mode 100644 index 509cd38d05d78a1355537315becb8e704b0b40a4..0000000000000000000000000000000000000000 --- a/extensions/dart/languages/dart/runnables.scm +++ /dev/null @@ -1,45 +0,0 @@ -; Flutter main -( - ( - (import_or_export - (library_import - (import_specification - ("import" - (configurable_uri - (uri - (string_literal) @_import - (#match? @_import "package:flutter/(material|widgets|cupertino).dart") - (#not-match? @_import "package:flutter_test/flutter_test.dart") - (#not-match? @_import "package:test/test.dart") - )))))) - ( - (function_signature - name: (_) @run - ) - (#eq? @run "main") - ) - (#set! tag flutter-main) - ) -) - -; Flutter test main -( - ( - (import_or_export - (library_import - (import_specification - ("import" - (configurable_uri - (uri - (string_literal) @_import - (#match? @_import "package:flutter_test/flutter_test.dart") - )))))) - ( - (function_signature - name: (_) @run - ) - (#eq? @run "main") - ) - (#set! tag flutter-test-main) - ) -) diff --git a/extensions/dart/languages/dart/tasks.json b/extensions/dart/languages/dart/tasks.json deleted file mode 100644 index c177d04cec190fabf1001b6f168129597045aa28..0000000000000000000000000000000000000000 --- a/extensions/dart/languages/dart/tasks.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "label": "flutter run", - "command": "flutter", - "args": ["run"], - "tags": ["flutter-main"] - }, - { - "label": "fvm flutter run", - "command": "fvm flutter", - "args": ["run"], - "tags": ["flutter-main"] - }, - { - "label": "flutter test $ZED_STEM", - "command": "flutter", - "args": ["test", "$ZED_FILE"], - "tags": ["flutter-test-main"] - }, - { - "label": "fvm flutter test $ZED_STEM", - "command": "fvm flutter", - "args": ["test", "$ZED_FILE"], - "tags": ["flutter-test-main"] - } -] diff --git a/extensions/dart/src/dart.rs b/extensions/dart/src/dart.rs deleted file mode 100644 index 38a2cf25a690f5a53a7ec196e0a3dee7bb3a073a..0000000000000000000000000000000000000000 --- a/extensions/dart/src/dart.rs +++ /dev/null @@ -1,162 +0,0 @@ -use zed::lsp::CompletionKind; -use zed::settings::LspSettings; -use zed::{CodeLabel, CodeLabelSpan}; -use zed_extension_api::{self as zed, serde_json, Result}; - -struct DartBinary { - pub path: String, - pub args: Option>, -} - -struct DartExtension; - -impl DartExtension { - fn language_server_binary( - &mut self, - _language_server_id: &zed::LanguageServerId, - worktree: &zed::Worktree, - ) -> Result { - let binary_settings = LspSettings::for_worktree("dart", worktree) - .ok() - .and_then(|lsp_settings| lsp_settings.binary); - let binary_args = binary_settings - .as_ref() - .and_then(|binary_settings| binary_settings.arguments.clone()); - - if let Some(path) = binary_settings.and_then(|binary_settings| binary_settings.path) { - return Ok(DartBinary { - path, - args: binary_args, - }); - } - - if let Some(path) = worktree.which("dart") { - return Ok(DartBinary { - path, - args: binary_args, - }); - } - - Err( - "dart must be installed from dart.dev/get-dart or pointed to by the LSP binary settings" - .to_string(), - ) - } -} - -impl zed::Extension for DartExtension { - fn new() -> Self { - Self - } - - fn language_server_command( - &mut self, - language_server_id: &zed::LanguageServerId, - worktree: &zed::Worktree, - ) -> Result { - let dart_binary = self.language_server_binary(language_server_id, worktree)?; - - Ok(zed::Command { - command: dart_binary.path, - args: dart_binary.args.unwrap_or_else(|| { - vec!["language-server".to_string(), "--protocol=lsp".to_string()] - }), - env: Default::default(), - }) - } - - fn language_server_workspace_configuration( - &mut self, - _language_server_id: &zed::LanguageServerId, - worktree: &zed::Worktree, - ) -> Result> { - let settings = LspSettings::for_worktree("dart", worktree) - .ok() - .and_then(|lsp_settings| lsp_settings.settings.clone()) - .unwrap_or_default(); - - Ok(Some(serde_json::json!({ - "dart": settings - }))) - } - - fn label_for_completion( - &self, - _language_server_id: &zed::LanguageServerId, - completion: zed::lsp::Completion, - ) -> Option { - let arrow = " → "; - - match completion.kind? { - CompletionKind::Class => Some(CodeLabel { - filter_range: (0..completion.label.len()).into(), - spans: vec![CodeLabelSpan::literal( - completion.label, - Some("type".into()), - )], - code: String::new(), - }), - CompletionKind::Function | CompletionKind::Constructor | CompletionKind::Method => { - let mut parts = completion.detail.as_ref()?.split(arrow); - let (name, _) = completion.label.split_once('(')?; - let parameter_list = parts.next()?; - let return_type = parts.next()?; - let fn_name = " a"; - let fat_arrow = " => "; - let call_expr = "();"; - - let code = - format!("{return_type}{fn_name}{parameter_list}{fat_arrow}{name}{call_expr}"); - - let parameter_list_start = return_type.len() + fn_name.len(); - - Some(CodeLabel { - spans: vec![ - CodeLabelSpan::code_range( - code.len() - call_expr.len() - name.len()..code.len() - call_expr.len(), - ), - CodeLabelSpan::code_range( - parameter_list_start..parameter_list_start + parameter_list.len(), - ), - CodeLabelSpan::literal(arrow, None), - CodeLabelSpan::code_range(0..return_type.len()), - ], - filter_range: (0..name.len()).into(), - code, - }) - } - CompletionKind::Property => { - let class_start = "class A {"; - let get = " get "; - let property_end = " => a; }"; - let ty = completion.detail?; - let name = completion.label; - - let code = format!("{class_start}{ty}{get}{name}{property_end}"); - let name_start = class_start.len() + ty.len() + get.len(); - - Some(CodeLabel { - spans: vec![ - CodeLabelSpan::code_range(name_start..name_start + name.len()), - CodeLabelSpan::literal(arrow, None), - CodeLabelSpan::code_range(class_start.len()..class_start.len() + ty.len()), - ], - filter_range: (0..name.len()).into(), - code, - }) - } - CompletionKind::Variable => { - let name = completion.label; - - Some(CodeLabel { - filter_range: (0..name.len()).into(), - spans: vec![CodeLabelSpan::literal(name, Some("variable".into()))], - code: String::new(), - }) - } - _ => None, - } - } -} - -zed::register_extension!(DartExtension);