From 349a48d9370d1616a3eb082ae5cabfcc43db822d Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Thu, 6 Mar 2025 18:17:34 -0500 Subject: [PATCH] lua: Extract to zed-extensions/lua repository (#26250) This PR extracts the Lua extension to the [zed-extensions/lua](https://github.com/zed-extensions/lua) repository. Release Notes: - N/A --- Cargo.lock | 7 - Cargo.toml | 1 - docs/src/languages/lua.md | 2 +- extensions/lua/Cargo.toml | 16 -- extensions/lua/LICENSE-APACHE | 1 - extensions/lua/extension.toml | 15 -- extensions/lua/languages/lua/brackets.scm | 3 - extensions/lua/languages/lua/config.toml | 13 -- extensions/lua/languages/lua/embedding.scm | 10 -- extensions/lua/languages/lua/highlights.scm | 148 ---------------- extensions/lua/languages/lua/indents.scm | 10 -- extensions/lua/languages/lua/outline.scm | 3 - extensions/lua/languages/lua/textobjects.scm | 7 - extensions/lua/src/lua.rs | 170 ------------------- 14 files changed, 1 insertion(+), 405 deletions(-) delete mode 100644 extensions/lua/Cargo.toml delete mode 120000 extensions/lua/LICENSE-APACHE delete mode 100644 extensions/lua/extension.toml delete mode 100644 extensions/lua/languages/lua/brackets.scm delete mode 100644 extensions/lua/languages/lua/config.toml delete mode 100644 extensions/lua/languages/lua/embedding.scm delete mode 100644 extensions/lua/languages/lua/highlights.scm delete mode 100644 extensions/lua/languages/lua/indents.scm delete mode 100644 extensions/lua/languages/lua/outline.scm delete mode 100644 extensions/lua/languages/lua/textobjects.scm delete mode 100644 extensions/lua/src/lua.rs diff --git a/Cargo.lock b/Cargo.lock index 86347b7b20..316587ee83 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17088,13 +17088,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "zed_lua" -version = "0.1.1" -dependencies = [ - "zed_extension_api 0.1.0", -] - [[package]] name = "zed_proto" version = "0.2.1" diff --git a/Cargo.toml b/Cargo.toml index 0e2576652f..20e4a00a9f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -173,7 +173,6 @@ members = [ "extensions/glsl", "extensions/haskell", "extensions/html", - "extensions/lua", "extensions/perplexity", "extensions/proto", "extensions/purescript", diff --git a/docs/src/languages/lua.md b/docs/src/languages/lua.md index 3a6b4a917a..b10aa068b4 100644 --- a/docs/src/languages/lua.md +++ b/docs/src/languages/lua.md @@ -1,6 +1,6 @@ # Lua -Lua support is available through the [Lua extension](https://github.com/zed-industries/zed/tree/main/extensions/lua). +Lua support is available through the [Lua extension](https://github.com/zed-extensions/lua). - Tree-sitter: [tree-sitter-grammars/tree-sitter-lua](https://github.com/tree-sitter-grammars/tree-sitter-lua) - Language server: [LuaLS/lua-language-server](https://github.com/LuaLS/lua-language-server) diff --git a/extensions/lua/Cargo.toml b/extensions/lua/Cargo.toml deleted file mode 100644 index f7ba18eda5..0000000000 --- a/extensions/lua/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "zed_lua" -version = "0.1.1" -edition.workspace = true -publish.workspace = true -license = "Apache-2.0" - -[lints] -workspace = true - -[lib] -path = "src/lua.rs" -crate-type = ["cdylib"] - -[dependencies] -zed_extension_api = "0.1.0" diff --git a/extensions/lua/LICENSE-APACHE b/extensions/lua/LICENSE-APACHE deleted file mode 120000 index 1cd601d0a3..0000000000 --- a/extensions/lua/LICENSE-APACHE +++ /dev/null @@ -1 +0,0 @@ -../../LICENSE-APACHE \ No newline at end of file diff --git a/extensions/lua/extension.toml b/extensions/lua/extension.toml deleted file mode 100644 index 52120cdfa2..0000000000 --- a/extensions/lua/extension.toml +++ /dev/null @@ -1,15 +0,0 @@ -id = "lua" -name = "Lua" -description = "Lua support." -version = "0.1.1" -schema_version = 1 -authors = ["Max Brunsfeld "] -repository = "https://github.com/zed-industries/zed" - -[language_servers.lua-language-server] -name = "LuaLS" -language = "Lua" - -[grammars.lua] -repository = "https://github.com/tree-sitter-grammars/tree-sitter-lua" -commit = "a24dab177e58c9c6832f96b9a73102a0cfbced4a" diff --git a/extensions/lua/languages/lua/brackets.scm b/extensions/lua/languages/lua/brackets.scm deleted file mode 100644 index 62e137ef26..0000000000 --- a/extensions/lua/languages/lua/brackets.scm +++ /dev/null @@ -1,3 +0,0 @@ -("[" @open "]" @close) -("{" @open "}" @close) -("(" @open ")" @close) diff --git a/extensions/lua/languages/lua/config.toml b/extensions/lua/languages/lua/config.toml deleted file mode 100644 index 7ec8ef2f03..0000000000 --- a/extensions/lua/languages/lua/config.toml +++ /dev/null @@ -1,13 +0,0 @@ -name = "Lua" -grammar = "lua" -path_suffixes = ["lua"] -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, not_in = ["string"] }, - { start = "'", end = "'", close = true, newline = false, not_in = ["string"] }, -] -collapsed_placeholder = "--[ ... ]--" diff --git a/extensions/lua/languages/lua/embedding.scm b/extensions/lua/languages/lua/embedding.scm deleted file mode 100644 index 0d1065089f..0000000000 --- a/extensions/lua/languages/lua/embedding.scm +++ /dev/null @@ -1,10 +0,0 @@ -( - (comment)* @context - . - (function_declaration - "function" @name - name: (_) @name - (comment)* @collapse - body: (block) @collapse - ) @item -) diff --git a/extensions/lua/languages/lua/highlights.scm b/extensions/lua/languages/lua/highlights.scm deleted file mode 100644 index f56b46338e..0000000000 --- a/extensions/lua/languages/lua/highlights.scm +++ /dev/null @@ -1,148 +0,0 @@ -;; Keywords - -[ - "do" - "else" - "elseif" - "end" - "for" - "function" - "goto" - "if" - "in" - "local" - "repeat" - "return" - "then" - "until" - "while" - (break_statement) -] @keyword - -;; Operators - -[ - "and" - "not" - "or" -] @keyword.operator - -[ - "+" - "-" - "*" - "/" - "%" - "^" - "#" - "==" - "~=" - "<=" - ">=" - "<" - ">" - "=" - "&" - "~" - "|" - "<<" - ">>" - "//" - ".." -] @operator - -;; Punctuations - -[ - ";" - ":" - "," - "." -] @punctuation.delimiter - -;; Brackets - -[ - "(" - ")" - "[" - "]" - "{" - "}" -] @punctuation.bracket - -;; Variables - -(identifier) @variable - -((identifier) @variable.special - (#eq? @variable.special "self")) - -(variable_list - attribute: (attribute - (["<" ">"] @punctuation.bracket - (identifier) @attribute))) - -;; Constants - -((identifier) @constant - (#match? @constant "^[A-Z][A-Z_0-9]*$")) - -(vararg_expression) @constant - -(nil) @constant.builtin - -[ - (false) - (true) -] @boolean - -;; Tables - -(field name: (identifier) @property) - -(dot_index_expression field: (identifier) @property) - -(table_constructor -[ - "{" - "}" -] @constructor) - -;; Functions - -(parameters (identifier) @parameter) - -(function_call - name: [ - (identifier) @function - (dot_index_expression field: (identifier) @function) - ]) - -(function_declaration - name: [ - (identifier) @function.definition - (dot_index_expression field: (identifier) @function.definition) - ]) - -(method_index_expression method: (identifier) @function.method) - -(function_call - (identifier) @function.builtin - (#any-of? @function.builtin - ;; built-in functions in Lua 5.1 - "assert" "collectgarbage" "dofile" "error" "getfenv" "getmetatable" "ipairs" - "load" "loadfile" "loadstring" "module" "next" "pairs" "pcall" "print" - "rawequal" "rawget" "rawset" "require" "select" "setfenv" "setmetatable" - "tonumber" "tostring" "type" "unpack" "xpcall")) - -;; Others - -(comment) @comment - -(hash_bang_line) @preproc - -(number) @number - -(string) @string -(escape_sequence) @string.escape diff --git a/extensions/lua/languages/lua/indents.scm b/extensions/lua/languages/lua/indents.scm deleted file mode 100644 index ed26c5a8f0..0000000000 --- a/extensions/lua/languages/lua/indents.scm +++ /dev/null @@ -1,10 +0,0 @@ -(if_statement "end" @end) @indent -(do_statement "end" @end) @indent -(while_statement "end" @end) @indent -(for_statement "end" @end) @indent -(repeat_statement "until" @end) @indent -(function_declaration "end" @end) @indent - -(_ "[" "]" @end) @indent -(_ "{" "}" @end) @indent -(_ "(" ")" @end) @indent diff --git a/extensions/lua/languages/lua/outline.scm b/extensions/lua/languages/lua/outline.scm deleted file mode 100644 index aa59d17247..0000000000 --- a/extensions/lua/languages/lua/outline.scm +++ /dev/null @@ -1,3 +0,0 @@ -(function_declaration - "function" @context - name: (_) @name) @item diff --git a/extensions/lua/languages/lua/textobjects.scm b/extensions/lua/languages/lua/textobjects.scm deleted file mode 100644 index 1f8bf66059..0000000000 --- a/extensions/lua/languages/lua/textobjects.scm +++ /dev/null @@ -1,7 +0,0 @@ -(function_definition - body: (_) @function.inside) @function.around - -(function_declaration - body: (_) @function.inside) @function.around - -(comment)+ @comment.around diff --git a/extensions/lua/src/lua.rs b/extensions/lua/src/lua.rs deleted file mode 100644 index 4d0c9c4d2b..0000000000 --- a/extensions/lua/src/lua.rs +++ /dev/null @@ -1,170 +0,0 @@ -use std::fs; -use zed::lsp::CompletionKind; -use zed::{CodeLabel, CodeLabelSpan, LanguageServerId}; -use zed_extension_api::{self as zed, Result}; - -struct LuaExtension { - cached_binary_path: Option, -} - -impl LuaExtension { - fn language_server_binary_path( - &mut self, - language_server_id: &LanguageServerId, - worktree: &zed::Worktree, - ) -> Result { - if let Some(path) = worktree.which("lua-language-server") { - return Ok(path); - } - - if let Some(path) = &self.cached_binary_path { - if fs::metadata(path).map_or(false, |stat| stat.is_file()) { - return Ok(path.clone()); - } - } - - zed::set_language_server_installation_status( - language_server_id, - &zed::LanguageServerInstallationStatus::CheckingForUpdate, - ); - let release = zed::latest_github_release( - "LuaLS/lua-language-server", - zed::GithubReleaseOptions { - require_assets: true, - pre_release: false, - }, - )?; - - let (platform, arch) = zed::current_platform(); - let asset_name = format!( - "lua-language-server-{version}-{os}-{arch}.{extension}", - version = release.version, - os = match platform { - zed::Os::Mac => "darwin", - zed::Os::Linux => "linux", - zed::Os::Windows => "win32", - }, - arch = match arch { - zed::Architecture::Aarch64 => "arm64", - zed::Architecture::X8664 => "x64", - zed::Architecture::X86 => return Err("unsupported platform x86".into()), - }, - extension = match platform { - zed::Os::Mac | zed::Os::Linux => "tar.gz", - zed::Os::Windows => "zip", - }, - ); - - let asset = release - .assets - .iter() - .find(|asset| asset.name == asset_name) - .ok_or_else(|| format!("no asset found matching {:?}", asset_name))?; - - let version_dir = format!("lua-language-server-{}", release.version); - let binary_path = format!( - "{version_dir}/bin/lua-language-server{extension}", - extension = match platform { - zed::Os::Mac | zed::Os::Linux => "", - zed::Os::Windows => ".exe", - }, - ); - - if !fs::metadata(&binary_path).map_or(false, |stat| stat.is_file()) { - zed::set_language_server_installation_status( - language_server_id, - &zed::LanguageServerInstallationStatus::Downloading, - ); - - zed::download_file( - &asset.download_url, - &version_dir, - match platform { - zed::Os::Mac | zed::Os::Linux => zed::DownloadedFileType::GzipTar, - zed::Os::Windows => zed::DownloadedFileType::Zip, - }, - ) - .map_err(|e| format!("failed to download file: {e}"))?; - - let entries = - fs::read_dir(".").map_err(|e| format!("failed to list working directory {e}"))?; - for entry in entries { - let entry = entry.map_err(|e| format!("failed to load directory entry {e}"))?; - if entry.file_name().to_str() != Some(&version_dir) { - fs::remove_dir_all(entry.path()).ok(); - } - } - } - - self.cached_binary_path = Some(binary_path.clone()); - Ok(binary_path) - } -} - -impl zed::Extension for LuaExtension { - fn new() -> Self { - Self { - cached_binary_path: None, - } - } - - fn language_server_command( - &mut self, - language_server_id: &LanguageServerId, - worktree: &zed::Worktree, - ) -> Result { - Ok(zed::Command { - command: self.language_server_binary_path(language_server_id, worktree)?, - args: Default::default(), - env: Default::default(), - }) - } - - fn label_for_completion( - &self, - _language_server_id: &LanguageServerId, - completion: zed::lsp::Completion, - ) -> Option { - match completion.kind? { - CompletionKind::Method | CompletionKind::Function => { - let name_len = completion.label.find('(').unwrap_or(completion.label.len()); - Some(CodeLabel { - spans: vec![CodeLabelSpan::code_range(0..completion.label.len())], - filter_range: (0..name_len).into(), - code: completion.label, - }) - } - CompletionKind::Field => Some(CodeLabel { - spans: vec![CodeLabelSpan::literal( - completion.label.clone(), - Some("property".into()), - )], - filter_range: (0..completion.label.len()).into(), - code: Default::default(), - }), - _ => None, - } - } - - fn label_for_symbol( - &self, - _language_server_id: &LanguageServerId, - symbol: zed::lsp::Symbol, - ) -> Option { - let prefix = "let a = "; - let suffix = match symbol.kind { - zed::lsp::SymbolKind::Method => "()", - _ => "", - }; - let code = format!("{prefix}{}{suffix}", symbol.name); - Some(CodeLabel { - spans: vec![CodeLabelSpan::code_range( - prefix.len()..code.len() - suffix.len(), - )], - filter_range: (0..symbol.name.len()).into(), - code, - }) - } -} - -zed::register_extension!(LuaExtension);