lua: Extract to zed-extensions/lua repository (#26250)

Marshall Bowers created

This PR extracts the Lua extension to the
[zed-extensions/lua](https://github.com/zed-extensions/lua) repository.

Release Notes:

- N/A

Change summary

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(-)

Detailed changes

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"

Cargo.toml 🔗

@@ -173,7 +173,6 @@ members = [
     "extensions/glsl",
     "extensions/haskell",
     "extensions/html",
-    "extensions/lua",
     "extensions/perplexity",
     "extensions/proto",
     "extensions/purescript",

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)

extensions/lua/Cargo.toml 🔗

@@ -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"

extensions/lua/extension.toml 🔗

@@ -1,15 +0,0 @@
-id = "lua"
-name = "Lua"
-description = "Lua support."
-version = "0.1.1"
-schema_version = 1
-authors = ["Max Brunsfeld <max@zed.dev>"]
-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"

extensions/lua/languages/lua/config.toml 🔗

@@ -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 = "--[ ... ]--"

extensions/lua/languages/lua/highlights.scm 🔗

@@ -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

extensions/lua/languages/lua/indents.scm 🔗

@@ -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

extensions/lua/src/lua.rs 🔗

@@ -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<String>,
-}
-
-impl LuaExtension {
-    fn language_server_binary_path(
-        &mut self,
-        language_server_id: &LanguageServerId,
-        worktree: &zed::Worktree,
-    ) -> Result<String> {
-        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<zed::Command> {
-        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<CodeLabel> {
-        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<CodeLabel> {
-        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);