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
This commit is contained in:
Marshall Bowers 2025-03-06 18:17:34 -05:00 committed by GitHub
parent a88af7351a
commit 349a48d937
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 1 additions and 405 deletions

View file

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

View file

@ -1 +0,0 @@
../../LICENSE-APACHE

View file

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

View file

@ -1,3 +0,0 @@
("[" @open "]" @close)
("{" @open "}" @close)
("(" @open ")" @close)

View file

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

View file

@ -1,10 +0,0 @@
(
(comment)* @context
.
(function_declaration
"function" @name
name: (_) @name
(comment)* @collapse
body: (block) @collapse
) @item
)

View file

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

View file

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

View file

@ -1,3 +0,0 @@
(function_declaration
"function" @context
name: (_) @name) @item

View file

@ -1,7 +0,0 @@
(function_definition
body: (_) @function.inside) @function.around
(function_declaration
body: (_) @function.inside) @function.around
(comment)+ @comment.around

View file

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