├── languages ├── blade │ ├── outline.scm │ ├── overrides.scm │ ├── brackets.scm │ ├── indents.scm │ ├── highlights.scm │ ├── config.toml │ └── injections.scm └── php_only │ ├── overrides.scm │ ├── injections.scm │ ├── folds.scm │ ├── config.toml │ ├── tags.scm │ └── highlights.scm ├── .gitignore ├── src ├── language_servers.rs ├── language_servers │ ├── emmet.rs │ ├── phpactor.rs │ ├── phptools.rs │ └── intelephense.rs └── lsp.rs ├── Cargo.toml ├── .github └── workflows │ └── release.yml ├── README.md ├── extension.toml ├── LICENSE └── Cargo.lock /languages/blade/outline.scm: -------------------------------------------------------------------------------- 1 | (comment) @annotation 2 | -------------------------------------------------------------------------------- /languages/blade/overrides.scm: -------------------------------------------------------------------------------- 1 | [ 2 | (quoted_attribute_value) 3 | (attribute_value) 4 | ] @string 5 | -------------------------------------------------------------------------------- /languages/php_only/overrides.scm: -------------------------------------------------------------------------------- 1 | [ 2 | (encapsed_string) 3 | (string) 4 | (string_content) 5 | ] @string 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | grammars 2 | test.blade.php 3 | test1.blade.php 4 | index.blade.php 5 | layout.blade.php 6 | 7 | 8 | # Added by cargo 9 | 10 | /target 11 | 12 | extension.wasm 13 | -------------------------------------------------------------------------------- /languages/blade/brackets.scm: -------------------------------------------------------------------------------- 1 | ("<" @open "/>" @close) 2 | ("" @close) 3 | ("<" @open ">" @close) 4 | ("\"" @open "\"" @close) 5 | ((element (start_tag) @open (end_tag) @close) (#set! newline.only)) 6 | -------------------------------------------------------------------------------- /src/language_servers.rs: -------------------------------------------------------------------------------- 1 | mod emmet; 2 | mod intelephense; 3 | mod phpactor; 4 | mod phptools; 5 | 6 | pub use emmet::*; 7 | pub use intelephense::*; 8 | pub use phpactor::*; 9 | pub use phptools::*; 10 | -------------------------------------------------------------------------------- /languages/php_only/injections.scm: -------------------------------------------------------------------------------- 1 | (heredoc 2 | (heredoc_body) @injection.content 3 | (heredoc_end) @injection.language) 4 | 5 | (nowdoc 6 | (nowdoc_body) @injection.content 7 | (heredoc_end) @injection.language) 8 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "zed-laravel-blade" 3 | version = "0.1.2" 4 | edition = "2021" 5 | 6 | [lib] 7 | path = "src/lsp.rs" 8 | crate-type = ["cdylib"] 9 | 10 | [dependencies] 11 | zed_extension_api = "0.7.0" 12 | -------------------------------------------------------------------------------- /languages/blade/indents.scm: -------------------------------------------------------------------------------- 1 | (directive_start) @indent.begin 2 | 3 | (directive_end) @indent.end 4 | 5 | 6 | ; html 7 | (start_tag ">" @end) @indent 8 | (self_closing_tag "/>" @end) @indent 9 | 10 | (element 11 | (start_tag) @start 12 | (end_tag)? @end) @indent 13 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | tags: 4 | - "v*" 5 | 6 | jobs: 7 | homebrew: 8 | name: Release Zed Extension 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: huacnlee/zed-extension-action@v1 12 | with: 13 | extension-name: blade 14 | push-to: bajrangCoder/extensions 15 | env: 16 | COMMITTER_TOKEN: ${{ secrets.COMMITTER_TOKEN }} 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # zed-laravel-blade 2 | 3 | Laravel Blade templating language support for [Zed](https://zed.dev). 4 | 5 | > [!Important] 6 | > Add this in your zed setting to automatically select Blade mode for `.blade.php` files instead of php. 7 | > ```json 8 | > "file_types": { 9 | > "Blade": ["*.blade.php"] 10 | > } 11 | > ``` 12 | 13 | ## Grammar 14 | 15 | - [tree-sitter-blade](https://github.com/EmranMR/tree-sitter-blade) 16 | -------------------------------------------------------------------------------- /languages/php_only/folds.scm: -------------------------------------------------------------------------------- 1 | [ 2 | (if_statement) 3 | (switch_statement) 4 | (while_statement) 5 | (do_statement) 6 | (for_statement) 7 | (foreach_statement) 8 | (try_statement) 9 | (function_definition) 10 | (class_declaration) 11 | (interface_declaration) 12 | (trait_declaration) 13 | (enum_declaration) 14 | (function_static_declaration) 15 | (method_declaration) 16 | (namespace_use_declaration)+ 17 | ] @fold 18 | -------------------------------------------------------------------------------- /languages/blade/highlights.scm: -------------------------------------------------------------------------------- 1 | ; html 2 | (tag_name) @tag 3 | (doctype) @tag.doctype 4 | (attribute_name) @attribute 5 | [ 6 | "\"" 7 | "'" 8 | (attribute_value) 9 | ] @string 10 | (comment) @comment 11 | 12 | "=" @punctuation.delimiter.html 13 | 14 | [ 15 | "<" 16 | ">" 17 | "" 20 | ] @punctuation.bracket.html 21 | 22 | ; blade 23 | (directive) @tag 24 | (directive_start) @tag 25 | (directive_end) @tag 26 | (comment) @comment 27 | (attribute (directive) @attribute) 28 | (keyword) @function 29 | [ 30 | "{{" 31 | "}}" 32 | "{!!" 33 | "!!}" 34 | "(" 35 | ")" 36 | ] @punctuation.bracket 37 | -------------------------------------------------------------------------------- /languages/php_only/config.toml: -------------------------------------------------------------------------------- 1 | name = "php_only" 2 | grammar = "php_only" 3 | autoclose_before = ";:.,=}])>" 4 | brackets = [ 5 | { start = "{", end = "}", close = true, newline = true }, 6 | { start = "[", end = "]", close = true, newline = true }, 7 | { start = "(", end = ")", close = true, newline = true }, 8 | { start = "\"", end = "\"", close = true, newline = false, not_in = [ 9 | "string", 10 | ] }, 11 | { start = "'", end = "'", close = true, newline = false, not_in = [ 12 | "string", 13 | ] }, 14 | ] 15 | scope_opt_in_language_servers = ["tailwindcss-language-server"] 16 | 17 | [overrides.string] 18 | completion_query_characters = ["-"] 19 | opt_into_language_servers = ["tailwindcss-language-server"] 20 | -------------------------------------------------------------------------------- /languages/blade/config.toml: -------------------------------------------------------------------------------- 1 | name = "Blade" 2 | grammar = "blade" 3 | path_suffixes = ["blade.php"] 4 | block_comment = ["{{-- ", " --}}"] 5 | autoclose_before = ";:.,=}])>" 6 | brackets = [ 7 | { start = "{", end = "}", close = true, newline = true }, 8 | { start = "[", end = "]", close = true, newline = true }, 9 | { start = "(", end = ")", close = true, newline = true }, 10 | { start = "\"", end = "\"", close = true, newline = false, not_in = [ 11 | "string", 12 | ] }, 13 | { start = "'", end = "'", close = true, newline = false, not_in = [ 14 | "string", 15 | ] }, 16 | ] 17 | wrap_characters = { start_prefix = "<", start_suffix = ">", end_prefix = "" } 18 | scope_opt_in_language_servers = ["tailwindcss-language-server"] 19 | prettier_plugins = ["@shufo/prettier-plugin-blade"] 20 | prettier_parser_name = "blade" 21 | 22 | [overrides.string] 23 | completion_query_characters = ["-"] 24 | opt_into_language_servers = ["tailwindcss-language-server"] 25 | -------------------------------------------------------------------------------- /extension.toml: -------------------------------------------------------------------------------- 1 | id = "blade" 2 | name = "Blade" 3 | description = "Laravel Blade templating language support." 4 | version = "0.2.3" 5 | schema_version = 1 6 | authors = ["Raunak Raj "] 7 | repository = "https://github.com/bajrangCoder/zed-laravel-blade" 8 | 9 | [grammars.blade] 10 | repository = "https://github.com/EmranMR/tree-sitter-blade" 11 | commit = "cc764dadcbbceb3f259396fef66f970c72e94f96" 12 | 13 | [grammars.php_only] 14 | repository = "https://github.com/tree-sitter/tree-sitter-php" 15 | commit = "b2278dbac9d58b02653fe6a8530ccebc492e4ed4" 16 | path = "php_only" 17 | 18 | [language_servers.emmet] 19 | name = "Emmet Language Server" 20 | language = "Blade" 21 | 22 | [language_servers.intelephense] 23 | name = "Intelephense" 24 | language = "Blade" 25 | language_ids = { Blade = "blade" } 26 | 27 | [language_servers.phptools] 28 | name = "PhpTools" 29 | language = "Blade" 30 | language_ids = { Blade = "blade" } 31 | 32 | [language_servers.phpactor] 33 | name = "Phpactor" 34 | language = "Blade" 35 | -------------------------------------------------------------------------------- /languages/php_only/tags.scm: -------------------------------------------------------------------------------- 1 | (namespace_definition 2 | name: (namespace_name) @name) @module 3 | 4 | (interface_declaration 5 | name: (name) @name) @definition.interface 6 | 7 | (trait_declaration 8 | name: (name) @name) @definition.interface 9 | 10 | (class_declaration 11 | name: (name) @name) @definition.class 12 | 13 | (class_interface_clause [(name) (qualified_name)] @name) @impl 14 | 15 | (property_declaration 16 | (property_element (variable_name (name) @name))) @definition.field 17 | 18 | (function_definition 19 | name: (name) @name) @definition.function 20 | 21 | (method_declaration 22 | name: (name) @name) @definition.function 23 | 24 | (object_creation_expression 25 | [ 26 | (qualified_name (name) @name) 27 | (variable_name (name) @name) 28 | ]) @reference.class 29 | 30 | (function_call_expression 31 | function: [ 32 | (qualified_name (name) @name) 33 | (variable_name (name)) @name 34 | ]) @reference.call 35 | 36 | (scoped_call_expression 37 | name: (name) @name) @reference.call 38 | 39 | (member_call_expression 40 | name: (name) @name) @reference.call 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Raunak Raj 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /languages/blade/injections.scm: -------------------------------------------------------------------------------- 1 | ((php_only) @injection.content 2 | (#set! injection.language "php_only")) 3 | 4 | ((parameter) @injection.content 5 | (#set! injection.include-children) 6 | (#set! injection.language "php_only")) 7 | 8 | ; Livewire attributes 9 | ;
10 | (attribute 11 | (attribute_name) @_attr 12 | (#any-of? @_attr "wire:model" 13 | "wire:click" 14 | "wire:stream" 15 | "wire:text" 16 | "wire:show") 17 | (quoted_attribute_value 18 | (attribute_value) @injection.content) 19 | (#set! injection.language "javascript")) 20 | 21 | 22 | ; AlpineJS attributes 23 | ;
24 | (attribute 25 | (attribute_name) @_attr 26 | (#match? @_attr "^x-[a-z]+") 27 | (#not-any-of? @_attr "x-teleport" "x-ref" "x-transition") 28 | (quoted_attribute_value 29 | (attribute_value) @injection.content) 30 | (#set! injection.language "javascript")) 31 | ;
32 | (attribute 33 | (attribute_name) @_attr 34 | (#match? @_attr "^[:@][a-z]+") 35 | (quoted_attribute_value 36 | (attribute_value) @injection.content) 37 | (#set! injection.language "javascript")) 38 | 39 | ; Blade escaped JS attributes 40 | ; 41 | (element 42 | (_ 43 | (tag_name) @_tag 44 | (#match? @_tag "^x-[a-z]+") 45 | (attribute 46 | (attribute_name) @_attr 47 | (#match? @_attr "^::[a-z]+") 48 | (quoted_attribute_value 49 | (attribute_value) @injection.content) 50 | (#set! injection.language "javascript")))) 51 | 52 | ; Blade PHP attributes 53 | ; 54 | (element 55 | (_ 56 | (tag_name) @_tag 57 | (#match? @_tag "^x-[a-z]+") 58 | (attribute 59 | (attribute_name) @_attr 60 | (#match? @_attr "^:[a-z]+") 61 | (quoted_attribute_value 62 | (attribute_value) @injection.content) 63 | (#set! injection.language "php_only")))) 64 | 65 | 66 | ; html 67 | (script_element 68 | (raw_text) @injection.content 69 | (#set! injection.language "javascript")) 70 | 71 | (style_element 72 | (raw_text) @injection.content 73 | (#set! injection.language "css")) 74 | 75 | (attribute 76 | (attribute_name) @_attribute_name (#match? @_attribute_name "^style$") 77 | (quoted_attribute_value (attribute_value) @injection.content) 78 | (#set! injection.language "css")) 79 | -------------------------------------------------------------------------------- /src/language_servers/emmet.rs: -------------------------------------------------------------------------------- 1 | use std::{env, fs}; 2 | use zed_extension_api::{self as zed, Result}; 3 | 4 | pub struct Emmet { 5 | did_find_server: bool, 6 | } 7 | 8 | const SERVER_PATH: &str = "node_modules/.bin/emmet-language-server"; 9 | const PACKAGE_NAME: &str = "@olrtg/emmet-language-server"; 10 | 11 | impl Emmet { 12 | pub const LANGUAGE_SERVER_ID: &'static str = "emmet"; 13 | 14 | pub fn new() -> Self { 15 | Self { 16 | did_find_server: false, 17 | } 18 | } 19 | 20 | fn server_exists(&self) -> bool { 21 | fs::metadata(SERVER_PATH).map_or(false, |stat| stat.is_file()) 22 | } 23 | 24 | pub fn language_server_command( 25 | &mut self, 26 | language_server_id: &zed::LanguageServerId, 27 | ) -> Result { 28 | let server_path = self.server_script_path(language_server_id)?; 29 | Ok(zed::Command { 30 | command: zed::node_binary_path()?, 31 | args: vec![ 32 | env::current_dir() 33 | .unwrap() 34 | .join(&server_path) 35 | .to_string_lossy() 36 | .to_string(), 37 | "--stdio".to_string(), 38 | ], 39 | env: Default::default(), 40 | }) 41 | } 42 | 43 | fn server_script_path(&mut self, language_server_id: &zed::LanguageServerId) -> Result { 44 | let server_exists = self.server_exists(); 45 | if self.did_find_server && server_exists { 46 | return Ok(SERVER_PATH.to_string()); 47 | } 48 | 49 | zed::set_language_server_installation_status( 50 | language_server_id, 51 | &zed::LanguageServerInstallationStatus::CheckingForUpdate, 52 | ); 53 | let version = zed::npm_package_latest_version(PACKAGE_NAME)?; 54 | 55 | if !server_exists 56 | || zed::npm_package_installed_version(PACKAGE_NAME)?.as_ref() != Some(&version) 57 | { 58 | zed::set_language_server_installation_status( 59 | language_server_id, 60 | &zed::LanguageServerInstallationStatus::Downloading, 61 | ); 62 | let result = zed::npm_install_package(PACKAGE_NAME, &version); 63 | match result { 64 | Ok(()) => { 65 | if !self.server_exists() { 66 | Err(format!( 67 | "installed package '{PACKAGE_NAME}' did not contain expected path '{SERVER_PATH}'", 68 | ))?; 69 | } 70 | } 71 | Err(error) => { 72 | if !self.server_exists() { 73 | Err(error)?; 74 | } 75 | } 76 | } 77 | } 78 | 79 | self.did_find_server = true; 80 | Ok(SERVER_PATH.to_string()) 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/language_servers/phpactor.rs: -------------------------------------------------------------------------------- 1 | use std::fs; 2 | 3 | use zed_extension_api::{self as zed, LanguageServerId, Result}; 4 | 5 | // Some of the code are based on PHP extension. 6 | 7 | pub struct Phpactor { 8 | cached_binary_path: Option, 9 | } 10 | 11 | impl Phpactor { 12 | pub const LANGUAGE_SERVER_ID: &'static str = "phpactor"; 13 | 14 | pub fn new() -> Self { 15 | Self { 16 | cached_binary_path: None, 17 | } 18 | } 19 | 20 | pub fn language_server_binary_path( 21 | &mut self, 22 | language_server_id: &LanguageServerId, 23 | worktree: &zed::Worktree, 24 | ) -> Result { 25 | if let Some(path) = worktree.which("phpactor") { 26 | return Ok(path); 27 | } 28 | 29 | if let Some(path) = &self.cached_binary_path { 30 | if fs::metadata(path).map_or(false, |stat| stat.is_file()) { 31 | return Ok(path.clone()); 32 | } 33 | } 34 | 35 | zed::set_language_server_installation_status( 36 | language_server_id, 37 | &zed::LanguageServerInstallationStatus::CheckingForUpdate, 38 | ); 39 | let release = zed::latest_github_release( 40 | "phpactor/phpactor", 41 | zed::GithubReleaseOptions { 42 | require_assets: true, 43 | pre_release: false, 44 | }, 45 | )?; 46 | 47 | let asset_name = "phpactor.phar"; 48 | let asset = release 49 | .assets 50 | .iter() 51 | .find(|asset| asset.name == asset_name) 52 | .ok_or_else(|| format!("no asset found matching {:?}", asset_name))?; 53 | 54 | let version_dir = format!("phpactor-{}", release.version); 55 | fs::create_dir_all(&version_dir).map_err(|e| format!("failed to create directory: {e}"))?; 56 | 57 | let binary_path = format!("{version_dir}/phpactor.phar"); 58 | 59 | if !fs::metadata(&binary_path).map_or(false, |stat| stat.is_file()) { 60 | zed::set_language_server_installation_status( 61 | language_server_id, 62 | &zed::LanguageServerInstallationStatus::Downloading, 63 | ); 64 | 65 | zed::download_file( 66 | &asset.download_url, 67 | &binary_path, 68 | zed::DownloadedFileType::Uncompressed, 69 | ) 70 | .map_err(|e| format!("failed to download file: {e}"))?; 71 | 72 | zed::make_file_executable(&binary_path)?; 73 | 74 | let entries = 75 | fs::read_dir(".").map_err(|e| format!("failed to list working directory {e}"))?; 76 | for entry in entries { 77 | let entry = entry.map_err(|e| format!("failed to load directory entry {e}"))?; 78 | if entry.file_name().to_str() != Some(&version_dir) { 79 | fs::remove_dir_all(entry.path()).ok(); 80 | } 81 | } 82 | } 83 | 84 | self.cached_binary_path = Some(binary_path.clone()); 85 | Ok(binary_path) 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/lsp.rs: -------------------------------------------------------------------------------- 1 | mod language_servers; 2 | 3 | use zed::CodeLabel; 4 | use zed_extension_api::{self as zed, serde_json, LanguageServerId, Result}; 5 | 6 | use crate::language_servers::{Emmet, Intelephense, PhpTools, Phpactor}; 7 | 8 | struct BladeExtension { 9 | intelephense: Option, 10 | phpactor: Option, 11 | emmet: Option, 12 | phptools: Option, 13 | } 14 | 15 | impl zed::Extension for BladeExtension { 16 | fn new() -> Self { 17 | Self { 18 | intelephense: None, 19 | phpactor: None, 20 | emmet: None, 21 | phptools: None, 22 | } 23 | } 24 | 25 | fn language_server_command( 26 | &mut self, 27 | language_server_id: &LanguageServerId, 28 | worktree: &zed::Worktree, 29 | ) -> Result { 30 | match language_server_id.as_ref() { 31 | Intelephense::LANGUAGE_SERVER_ID => { 32 | let intelephense = self.intelephense.get_or_insert_with(Intelephense::new); 33 | intelephense.language_server_command(language_server_id, worktree) 34 | } 35 | Phpactor::LANGUAGE_SERVER_ID => { 36 | let phpactor = self.phpactor.get_or_insert_with(Phpactor::new); 37 | 38 | Ok(zed::Command { 39 | command: phpactor.language_server_binary_path(language_server_id, worktree)?, 40 | args: vec!["language-server".into()], 41 | env: Default::default(), 42 | }) 43 | } 44 | Emmet::LANGUAGE_SERVER_ID => { 45 | let emmet = self.emmet.get_or_insert_with(Emmet::new); 46 | emmet.language_server_command(language_server_id) 47 | } 48 | PhpTools::LANGUAGE_SERVER_ID => { 49 | let phptools = self.phptools.get_or_insert_with(PhpTools::new); 50 | phptools.language_server_command(language_server_id, worktree) 51 | } 52 | language_server_id => Err(format!("unknown language server: {language_server_id}")), 53 | } 54 | } 55 | 56 | fn language_server_workspace_configuration( 57 | &mut self, 58 | language_server_id: &LanguageServerId, 59 | worktree: &zed::Worktree, 60 | ) -> Result> { 61 | if language_server_id.as_ref() == Intelephense::LANGUAGE_SERVER_ID { 62 | if let Some(intelephense) = self.intelephense.as_mut() { 63 | return intelephense.language_server_workspace_configuration(worktree); 64 | } 65 | } 66 | 67 | if language_server_id.as_ref() == PhpTools::LANGUAGE_SERVER_ID { 68 | if let Some(phptools) = self.phptools.as_mut() { 69 | return phptools.language_server_workspace_configuration(worktree); 70 | } 71 | } 72 | 73 | Ok(None) 74 | } 75 | 76 | fn label_for_completion( 77 | &self, 78 | language_server_id: &zed::LanguageServerId, 79 | completion: zed::lsp::Completion, 80 | ) -> Option { 81 | match language_server_id.as_ref() { 82 | Intelephense::LANGUAGE_SERVER_ID => { 83 | self.intelephense.as_ref()?.label_for_completion(completion) 84 | } 85 | _ => None, 86 | } 87 | } 88 | } 89 | 90 | zed::register_extension!(BladeExtension); 91 | -------------------------------------------------------------------------------- /src/language_servers/phptools.rs: -------------------------------------------------------------------------------- 1 | use std::fs; 2 | use zed::{Architecture, Os}; 3 | use zed_extension_api::settings::LspSettings; 4 | use zed_extension_api::{self as zed, serde_json, LanguageServerId, Result}; 5 | 6 | const PACKAGE_NAME: &str = "devsense-php-ls"; 7 | 8 | pub struct PhpTools { 9 | did_find_server: bool, 10 | } 11 | 12 | impl PhpTools { 13 | pub const LANGUAGE_SERVER_ID: &'static str = "phptools"; 14 | 15 | pub fn new() -> Self { 16 | Self { 17 | did_find_server: false, 18 | } 19 | } 20 | 21 | pub fn language_server_command( 22 | &mut self, 23 | language_server_id: &LanguageServerId, 24 | worktree: &zed::Worktree, 25 | ) -> Result { 26 | if let Some(path) = worktree.which("phptools") { 27 | return Ok(zed::Command { 28 | command: path, 29 | args: vec!["--stdio".to_string()], 30 | env: Default::default(), 31 | }); 32 | } 33 | 34 | let server_path = self.server_script_path(language_server_id)?; 35 | Ok(zed::Command { 36 | command: server_path, 37 | args: vec![ 38 | "--composerNodes".into(), 39 | "false".into(), // disable /vendor/ caching 40 | ], 41 | env: Default::default(), 42 | }) 43 | } 44 | 45 | fn server_file_path(&self) -> std::string::String { 46 | let (os, arch) = zed::current_platform(); 47 | 48 | let os_str = match os { 49 | Os::Mac => "darwin", 50 | Os::Linux => "linux", 51 | Os::Windows => "win32", 52 | }; 53 | 54 | let arch_str = match arch { 55 | Architecture::Aarch64 => "arm64", 56 | Architecture::X86 | Architecture::X8664 => "x64", 57 | }; 58 | 59 | let ext_str = match os { 60 | Os::Windows => ".exe", 61 | _ => "", 62 | }; 63 | // 64 | format!( 65 | "node_modules/devsense-php-ls-{0}-{1}/dist/devsense.php.ls{2}", 66 | os_str, arch_str, ext_str 67 | ) 68 | } 69 | 70 | fn server_exists(&self) -> bool { 71 | fs::metadata(self.server_file_path()).map_or(false, |stat| stat.is_file()) 72 | } 73 | 74 | fn server_script_path(&mut self, language_server_id: &LanguageServerId) -> Result { 75 | let server_exists = self.server_exists(); 76 | let server_path = self.server_file_path(); 77 | if self.did_find_server && server_exists { 78 | return Ok(server_path); 79 | } 80 | 81 | zed::set_language_server_installation_status( 82 | language_server_id, 83 | &zed::LanguageServerInstallationStatus::CheckingForUpdate, 84 | ); 85 | let version = zed::npm_package_latest_version(PACKAGE_NAME)?; 86 | 87 | if !server_exists 88 | || zed::npm_package_installed_version(PACKAGE_NAME)?.as_ref() != Some(&version) 89 | { 90 | zed::set_language_server_installation_status( 91 | language_server_id, 92 | &zed::LanguageServerInstallationStatus::Downloading, 93 | ); 94 | let result = zed::npm_install_package(PACKAGE_NAME, &version); 95 | match result { 96 | Ok(()) => { 97 | if !self.server_exists() { 98 | Err(format!( 99 | "installed package '{PACKAGE_NAME}' did not contain expected path '{server_path}'", 100 | ))?; 101 | } 102 | } 103 | Err(error) => { 104 | if !self.server_exists() { 105 | Err(error)?; 106 | } 107 | } 108 | } 109 | } 110 | 111 | self.did_find_server = true; 112 | Ok(server_path) 113 | } 114 | 115 | pub fn language_server_workspace_configuration( 116 | &mut self, 117 | worktree: &zed::Worktree, 118 | ) -> Result> { 119 | let settings = LspSettings::for_worktree("phptools", worktree) 120 | .ok() 121 | .and_then(|lsp_settings| lsp_settings.settings.clone()) 122 | .unwrap_or_default(); 123 | 124 | Ok(Some(serde_json::json!({ 125 | "phptools": settings 126 | }))) 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /src/language_servers/intelephense.rs: -------------------------------------------------------------------------------- 1 | use std::{env, fs}; 2 | 3 | use zed::{CodeLabel, CodeLabelSpan}; 4 | use zed_extension_api::settings::LspSettings; 5 | use zed_extension_api::{self as zed, serde_json, LanguageServerId, Result}; 6 | 7 | const SERVER_PATH: &str = "node_modules/intelephense/lib/intelephense.js"; 8 | const PACKAGE_NAME: &str = "intelephense"; 9 | 10 | // Some of the code are based on PHP extension. 11 | 12 | pub struct Intelephense { 13 | did_find_server: bool, 14 | } 15 | 16 | impl Intelephense { 17 | pub const LANGUAGE_SERVER_ID: &'static str = "intelephense"; 18 | 19 | pub fn new() -> Self { 20 | Self { 21 | did_find_server: false, 22 | } 23 | } 24 | 25 | pub fn language_server_command( 26 | &mut self, 27 | language_server_id: &LanguageServerId, 28 | worktree: &zed::Worktree, 29 | ) -> Result { 30 | if let Some(path) = worktree.which("intelephense") { 31 | return Ok(zed::Command { 32 | command: path, 33 | args: vec!["--stdio".to_string()], 34 | env: Default::default(), 35 | }); 36 | } 37 | 38 | let server_path = self.server_script_path(language_server_id)?; 39 | Ok(zed::Command { 40 | command: zed::node_binary_path()?, 41 | args: vec![ 42 | env::current_dir() 43 | .unwrap() 44 | .join(&server_path) 45 | .to_string_lossy() 46 | .to_string(), 47 | "--stdio".to_string(), 48 | ], 49 | env: Default::default(), 50 | }) 51 | } 52 | 53 | fn server_exists(&self) -> bool { 54 | fs::metadata(SERVER_PATH).map_or(false, |stat| stat.is_file()) 55 | } 56 | 57 | fn server_script_path(&mut self, language_server_id: &LanguageServerId) -> Result { 58 | let server_exists = self.server_exists(); 59 | if self.did_find_server && server_exists { 60 | return Ok(SERVER_PATH.to_string()); 61 | } 62 | 63 | zed::set_language_server_installation_status( 64 | language_server_id, 65 | &zed::LanguageServerInstallationStatus::CheckingForUpdate, 66 | ); 67 | let version = zed::npm_package_latest_version(PACKAGE_NAME)?; 68 | 69 | if !server_exists 70 | || zed::npm_package_installed_version(PACKAGE_NAME)?.as_ref() != Some(&version) 71 | { 72 | zed::set_language_server_installation_status( 73 | language_server_id, 74 | &zed::LanguageServerInstallationStatus::Downloading, 75 | ); 76 | let result = zed::npm_install_package(PACKAGE_NAME, &version); 77 | match result { 78 | Ok(()) => { 79 | if !self.server_exists() { 80 | Err(format!( 81 | "installed package '{PACKAGE_NAME}' did not contain expected path '{SERVER_PATH}'", 82 | ))?; 83 | } 84 | } 85 | Err(error) => { 86 | if !self.server_exists() { 87 | Err(error)?; 88 | } 89 | } 90 | } 91 | } 92 | 93 | self.did_find_server = true; 94 | Ok(SERVER_PATH.to_string()) 95 | } 96 | 97 | pub fn language_server_workspace_configuration( 98 | &mut self, 99 | worktree: &zed::Worktree, 100 | ) -> Result> { 101 | let settings = LspSettings::for_worktree("intelephense", worktree) 102 | .ok() 103 | .and_then(|lsp_settings| lsp_settings.settings.clone()) 104 | .unwrap_or_default(); 105 | 106 | Ok(Some(serde_json::json!({ 107 | "intelephense": settings 108 | }))) 109 | } 110 | 111 | pub fn label_for_completion(&self, completion: zed::lsp::Completion) -> Option { 112 | let label = &completion.label; 113 | 114 | match completion.kind? { 115 | zed::lsp::CompletionKind::Method => { 116 | // __construct method doesn't have a detail 117 | if let Some(ref detail) = completion.detail { 118 | if detail.is_empty() { 119 | return Some(CodeLabel { 120 | spans: vec![ 121 | CodeLabelSpan::literal(label, Some("function.method".to_string())), 122 | CodeLabelSpan::literal("()", None), 123 | ], 124 | filter_range: (0..label.len()).into(), 125 | code: completion.label, 126 | }); 127 | } 128 | } 129 | 130 | let mut parts = completion.detail.as_ref()?.split(":"); 131 | // E.g., `foo(string $var)` 132 | let name_and_params = parts.next()?; 133 | let return_type = parts.next()?.trim(); 134 | 135 | let (_, params) = name_and_params.split_once("(")?; 136 | let params = params.trim_end_matches(")"); 137 | 138 | Some(CodeLabel { 139 | spans: vec![ 140 | CodeLabelSpan::literal(label, Some("function.method".to_string())), 141 | CodeLabelSpan::literal("(", None), 142 | CodeLabelSpan::literal(params, Some("comment".to_string())), 143 | CodeLabelSpan::literal("): ", None), 144 | CodeLabelSpan::literal(return_type, Some("type".to_string())), 145 | ], 146 | filter_range: (0..label.len()).into(), 147 | code: completion.label, 148 | }) 149 | } 150 | zed::lsp::CompletionKind::Constant | zed::lsp::CompletionKind::EnumMember => { 151 | if let Some(ref detail) = completion.detail { 152 | if !detail.is_empty() { 153 | return Some(CodeLabel { 154 | spans: vec![ 155 | CodeLabelSpan::literal(label, Some("constant".to_string())), 156 | CodeLabelSpan::literal(" ", None), 157 | CodeLabelSpan::literal(detail, Some("comment".to_string())), 158 | ], 159 | filter_range: (0..label.len()).into(), 160 | code: completion.label, 161 | }); 162 | } 163 | } 164 | 165 | Some(CodeLabel { 166 | spans: vec![CodeLabelSpan::literal(label, Some("constant".to_string()))], 167 | filter_range: (0..label.len()).into(), 168 | code: completion.label, 169 | }) 170 | } 171 | zed::lsp::CompletionKind::Property => { 172 | let return_type = completion.detail?; 173 | Some(CodeLabel { 174 | spans: vec![ 175 | CodeLabelSpan::literal(label, Some("attribute".to_string())), 176 | CodeLabelSpan::literal(": ", None), 177 | CodeLabelSpan::literal(return_type, Some("type".to_string())), 178 | ], 179 | filter_range: (0..label.len()).into(), 180 | code: completion.label, 181 | }) 182 | } 183 | zed::lsp::CompletionKind::Variable => { 184 | // See https://www.php.net/manual/en/reserved.variables.php 185 | const SYSTEM_VAR_NAMES: &[&str] = 186 | &["argc", "argv", "php_errormsg", "http_response_header"]; 187 | 188 | let var_name = completion.label.trim_start_matches("$"); 189 | let is_uppercase = var_name 190 | .chars() 191 | .filter(|c| c.is_alphabetic()) 192 | .all(|c| c.is_uppercase()); 193 | let is_system_constant = var_name.starts_with("_"); 194 | let is_reserved = SYSTEM_VAR_NAMES.contains(&var_name); 195 | 196 | let highlight = if is_uppercase || is_system_constant || is_reserved { 197 | Some("comment".to_string()) 198 | } else { 199 | None 200 | }; 201 | 202 | Some(CodeLabel { 203 | spans: vec![CodeLabelSpan::literal(label, highlight)], 204 | filter_range: (0..label.len()).into(), 205 | code: completion.label, 206 | }) 207 | } 208 | _ => None, 209 | } 210 | } 211 | } 212 | -------------------------------------------------------------------------------- /languages/php_only/highlights.scm: -------------------------------------------------------------------------------- 1 | ; Keywords 2 | [ 3 | "and" 4 | "as" 5 | "instanceof" 6 | "or" 7 | "xor" 8 | ] @keyword.operator 9 | 10 | [ 11 | "fn" 12 | "function" 13 | ] @function 14 | 15 | [ 16 | "clone" 17 | "declare" 18 | "default" 19 | "echo" 20 | "enddeclare" 21 | "extends" 22 | "global" 23 | "goto" 24 | "implements" 25 | "insteadof" 26 | "print" 27 | "new" 28 | "unset" 29 | ] @keyword 30 | 31 | [ 32 | "enum" 33 | "class" 34 | "interface" 35 | "namespace" 36 | "trait" 37 | ] @type 38 | 39 | [ 40 | "abstract" 41 | "const" 42 | "final" 43 | "private" 44 | "protected" 45 | "public" 46 | "readonly" 47 | (static_modifier) 48 | ] @keyword.modifier 49 | 50 | (function_static_declaration 51 | "static" @keyword.modifier) 52 | 53 | [ 54 | "return" 55 | "exit" 56 | "yield" 57 | ] @keyword.return 58 | 59 | (yield_expression 60 | "from" @keyword.return) 61 | 62 | [ 63 | "case" 64 | "else" 65 | "elseif" 66 | "endif" 67 | "endswitch" 68 | "if" 69 | "switch" 70 | "match" 71 | "??" 72 | ] @keyword.conditional 73 | 74 | [ 75 | "break" 76 | "continue" 77 | "do" 78 | "endfor" 79 | "endforeach" 80 | "endwhile" 81 | "for" 82 | "foreach" 83 | "while" 84 | ] @keyword.repeat 85 | 86 | [ 87 | "catch" 88 | "finally" 89 | "throw" 90 | "try" 91 | ] @keyword.exception 92 | 93 | [ 94 | "include_once" 95 | "include" 96 | "require_once" 97 | "require" 98 | "use" 99 | ] @keyword.import 100 | 101 | [ 102 | "," 103 | ";" 104 | ":" 105 | "\\" 106 | ] @punctuation.delimiter 107 | 108 | [ 109 | (php_tag) 110 | "?>" 111 | "(" 112 | ")" 113 | "[" 114 | "]" 115 | "{" 116 | "}" 117 | "#[" 118 | ] @punctuation.bracket 119 | 120 | [ 121 | "=" 122 | "." 123 | "-" 124 | "*" 125 | "/" 126 | "+" 127 | "%" 128 | "**" 129 | "~" 130 | "|" 131 | "^" 132 | "&" 133 | "<<" 134 | ">>" 135 | "<<<" 136 | "->" 137 | "?->" 138 | "=>" 139 | "<" 140 | "<=" 141 | ">=" 142 | ">" 143 | "<>" 144 | "<=>" 145 | "==" 146 | "!=" 147 | "===" 148 | "!==" 149 | "!" 150 | "&&" 151 | "||" 152 | ".=" 153 | "-=" 154 | "+=" 155 | "*=" 156 | "/=" 157 | "%=" 158 | "**=" 159 | "&=" 160 | "|=" 161 | "^=" 162 | "<<=" 163 | ">>=" 164 | "??=" 165 | "--" 166 | "++" 167 | "@" 168 | "::" 169 | ] @operator 170 | 171 | ; Variables 172 | (variable_name) @variable 173 | 174 | ; Constants 175 | ((name) @constant 176 | (#lua-match? @constant "^_?[A-Z][A-Z%d_]*$")) 177 | 178 | ((name) @constant.builtin 179 | (#lua-match? @constant.builtin "^__[A-Z][A-Z%d_]+__$")) 180 | 181 | (const_declaration 182 | (const_element 183 | (name) @constant)) 184 | 185 | ; Types 186 | [ 187 | (primitive_type) 188 | (cast_type) 189 | (bottom_type) 190 | ] @type.builtin 191 | 192 | (named_type 193 | [ 194 | (name) @type 195 | (qualified_name 196 | (name) @type) 197 | (relative_name 198 | (name) @type) 199 | ]) 200 | 201 | (named_type 202 | (name) @type.builtin 203 | (#any-of? @type.builtin "static" "self")) 204 | 205 | (class_declaration 206 | name: (name) @type) 207 | 208 | (base_clause 209 | [ 210 | (name) @type 211 | (qualified_name 212 | (name) @type) 213 | (relative_name 214 | (name) @type) 215 | ]) 216 | 217 | (enum_declaration 218 | name: (name) @type) 219 | 220 | (interface_declaration 221 | name: (name) @type) 222 | 223 | (namespace_use_clause 224 | [ 225 | (name) @type 226 | (qualified_name 227 | (name) @type) 228 | alias: (name) @type.definition 229 | ]) 230 | 231 | (namespace_use_clause 232 | type: "function" 233 | [ 234 | (name) @function 235 | (qualified_name 236 | (name) @function) 237 | alias: (name) @function 238 | ]) 239 | 240 | (namespace_use_declaration 241 | type: "function" 242 | body: (namespace_use_group 243 | (namespace_use_clause 244 | [ 245 | (name) @function 246 | (qualified_name 247 | (name) @function) 248 | alias: (name) @function 249 | ]))) 250 | 251 | (namespace_use_clause 252 | type: "const" 253 | [ 254 | (name) @constant 255 | (qualified_name 256 | (name) @constant) 257 | alias: (name) @constant 258 | ]) 259 | 260 | (namespace_use_declaration 261 | type: "const" 262 | body: (namespace_use_group 263 | (namespace_use_clause 264 | [ 265 | (name) @constant 266 | (qualified_name 267 | (name) @constant) 268 | alias: (name) @constant 269 | ]))) 270 | 271 | (class_interface_clause 272 | [ 273 | (name) @type 274 | (qualified_name 275 | (name) @type) 276 | (relative_name 277 | (name) @type) 278 | ]) 279 | 280 | (scoped_call_expression 281 | scope: [ 282 | (name) @type 283 | (qualified_name 284 | (name) @type) 285 | (relative_name 286 | (name) @type) 287 | ]) 288 | 289 | (class_constant_access_expression 290 | . 291 | [ 292 | (name) @type 293 | (qualified_name 294 | (name) @type) 295 | (relative_name 296 | (name) @type) 297 | ] 298 | (name) @constant) 299 | 300 | (scoped_property_access_expression 301 | scope: [ 302 | (name) @type 303 | (qualified_name 304 | (name) @type) 305 | (relative_name 306 | (name) @type) 307 | ]) 308 | 309 | (scoped_property_access_expression 310 | name: (variable_name) @variable.member) 311 | 312 | (trait_declaration 313 | name: (name) @type) 314 | 315 | (use_declaration 316 | (name) @type) 317 | 318 | (binary_expression 319 | operator: "instanceof" 320 | right: [ 321 | (name) @type 322 | (qualified_name 323 | (name) @type) 324 | (relative_name 325 | (name) @type) 326 | ]) 327 | 328 | ; Functions, methods, constructors 329 | (array_creation_expression 330 | "array" @function.builtin) 331 | 332 | (list_literal 333 | "list" @function.builtin) 334 | 335 | (exit_statement 336 | "exit" @function.builtin 337 | "(") 338 | 339 | (method_declaration 340 | name: (name) @function.method) 341 | 342 | (function_call_expression 343 | function: [ 344 | (name) @function.call 345 | (qualified_name 346 | (name) @function.call) 347 | (relative_name 348 | (name) @function.call) 349 | ]) 350 | 351 | (scoped_call_expression 352 | name: (name) @function.call) 353 | 354 | (member_call_expression 355 | name: (name) @function.method.call) 356 | 357 | (function_definition 358 | name: (name) @function) 359 | 360 | (nullsafe_member_call_expression 361 | name: (name) @function.method) 362 | 363 | (use_instead_of_clause 364 | (class_constant_access_expression 365 | (_) 366 | (name) @function.method) 367 | (name) @type) 368 | 369 | (use_as_clause 370 | (class_constant_access_expression 371 | (_) 372 | (name) @function.method)* 373 | (name) @function.method) 374 | 375 | (method_declaration 376 | name: (name) @constructor 377 | (#eq? @constructor "__construct")) 378 | 379 | (object_creation_expression 380 | [ 381 | (name) @constructor 382 | (qualified_name 383 | (name) @constructor) 384 | (relative_name 385 | (name) @constructor) 386 | ]) 387 | 388 | ; Parameters 389 | (variadic_parameter 390 | "..." @operator 391 | name: (variable_name) @variable.parameter) 392 | 393 | (simple_parameter 394 | name: (variable_name) @variable.parameter) 395 | 396 | (argument 397 | (name) @variable.parameter) 398 | 399 | ; Member 400 | (property_element 401 | (variable_name) @property) 402 | 403 | (member_access_expression 404 | name: (variable_name 405 | (name)) @variable.member) 406 | 407 | (member_access_expression 408 | name: (name) @variable.member) 409 | 410 | (nullsafe_member_access_expression 411 | name: (variable_name 412 | (name)) @variable.member) 413 | 414 | (nullsafe_member_access_expression 415 | name: (name) @variable.member) 416 | 417 | ; Variables 418 | (relative_scope) @variable.builtin 419 | 420 | ((variable_name) @variable.builtin 421 | (#eq? @variable.builtin "$this")) 422 | 423 | ; Namespace 424 | (namespace_definition 425 | name: (namespace_name 426 | (name) @module)) 427 | 428 | (namespace_name 429 | (name) @module) 430 | 431 | (relative_name 432 | "namespace" @module.builtin) 433 | 434 | ; Attributes 435 | (attribute_list) @attribute 436 | 437 | ; Conditions ( ? : ) 438 | (conditional_expression 439 | "?" @keyword.conditional.ternary 440 | ":" @keyword.conditional.ternary) 441 | 442 | ; Directives 443 | (declare_directive 444 | [ 445 | "strict_types" 446 | "ticks" 447 | "encoding" 448 | ] @variable.parameter) 449 | 450 | ; Basic tokens 451 | [ 452 | (string) 453 | (encapsed_string) 454 | (heredoc_body) 455 | (nowdoc_body) 456 | (shell_command_expression) ; backtick operator: `ls -la` 457 | ] @string 458 | 459 | (escape_sequence) @string.escape 460 | 461 | [ 462 | (heredoc_start) 463 | (heredoc_end) 464 | ] @label 465 | 466 | (nowdoc 467 | "'" @label) 468 | 469 | (boolean) @boolean 470 | 471 | (null) @constant.builtin 472 | 473 | (integer) @number 474 | 475 | (float) @number.float 476 | 477 | (comment) @comment @spell 478 | 479 | (named_label_statement) @label 480 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "adler2" 7 | version = "2.0.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 10 | 11 | [[package]] 12 | name = "anyhow" 13 | version = "1.0.96" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" 16 | 17 | [[package]] 18 | name = "auditable-serde" 19 | version = "0.8.0" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "5c7bf8143dfc3c0258df908843e169b5cc5fcf76c7718bd66135ef4a9cd558c5" 22 | dependencies = [ 23 | "semver", 24 | "serde", 25 | "serde_json", 26 | "topological-sort", 27 | ] 28 | 29 | [[package]] 30 | name = "autocfg" 31 | version = "1.4.0" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 34 | 35 | [[package]] 36 | name = "bitflags" 37 | version = "2.8.0" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 40 | 41 | [[package]] 42 | name = "cfg-if" 43 | version = "1.0.0" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 46 | 47 | [[package]] 48 | name = "crc32fast" 49 | version = "1.4.2" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 52 | dependencies = [ 53 | "cfg-if", 54 | ] 55 | 56 | [[package]] 57 | name = "displaydoc" 58 | version = "0.2.5" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 61 | dependencies = [ 62 | "proc-macro2", 63 | "quote", 64 | "syn", 65 | ] 66 | 67 | [[package]] 68 | name = "equivalent" 69 | version = "1.0.2" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 72 | 73 | [[package]] 74 | name = "flate2" 75 | version = "1.1.1" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" 78 | dependencies = [ 79 | "crc32fast", 80 | "miniz_oxide", 81 | ] 82 | 83 | [[package]] 84 | name = "foldhash" 85 | version = "0.1.5" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 88 | 89 | [[package]] 90 | name = "form_urlencoded" 91 | version = "1.2.1" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 94 | dependencies = [ 95 | "percent-encoding", 96 | ] 97 | 98 | [[package]] 99 | name = "futures" 100 | version = "0.3.31" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 103 | dependencies = [ 104 | "futures-channel", 105 | "futures-core", 106 | "futures-executor", 107 | "futures-io", 108 | "futures-sink", 109 | "futures-task", 110 | "futures-util", 111 | ] 112 | 113 | [[package]] 114 | name = "futures-channel" 115 | version = "0.3.31" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 118 | dependencies = [ 119 | "futures-core", 120 | "futures-sink", 121 | ] 122 | 123 | [[package]] 124 | name = "futures-core" 125 | version = "0.3.31" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 128 | 129 | [[package]] 130 | name = "futures-executor" 131 | version = "0.3.31" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 134 | dependencies = [ 135 | "futures-core", 136 | "futures-task", 137 | "futures-util", 138 | ] 139 | 140 | [[package]] 141 | name = "futures-io" 142 | version = "0.3.31" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 145 | 146 | [[package]] 147 | name = "futures-macro" 148 | version = "0.3.31" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 151 | dependencies = [ 152 | "proc-macro2", 153 | "quote", 154 | "syn", 155 | ] 156 | 157 | [[package]] 158 | name = "futures-sink" 159 | version = "0.3.31" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 162 | 163 | [[package]] 164 | name = "futures-task" 165 | version = "0.3.31" 166 | source = "registry+https://github.com/rust-lang/crates.io-index" 167 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 168 | 169 | [[package]] 170 | name = "futures-util" 171 | version = "0.3.31" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 174 | dependencies = [ 175 | "futures-channel", 176 | "futures-core", 177 | "futures-io", 178 | "futures-macro", 179 | "futures-sink", 180 | "futures-task", 181 | "memchr", 182 | "pin-project-lite", 183 | "pin-utils", 184 | "slab", 185 | ] 186 | 187 | [[package]] 188 | name = "hashbrown" 189 | version = "0.15.2" 190 | source = "registry+https://github.com/rust-lang/crates.io-index" 191 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 192 | dependencies = [ 193 | "foldhash", 194 | ] 195 | 196 | [[package]] 197 | name = "heck" 198 | version = "0.5.0" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 201 | 202 | [[package]] 203 | name = "icu_collections" 204 | version = "2.0.0" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 207 | dependencies = [ 208 | "displaydoc", 209 | "potential_utf", 210 | "yoke", 211 | "zerofrom", 212 | "zerovec", 213 | ] 214 | 215 | [[package]] 216 | name = "icu_locale_core" 217 | version = "2.0.0" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 220 | dependencies = [ 221 | "displaydoc", 222 | "litemap", 223 | "tinystr", 224 | "writeable", 225 | "zerovec", 226 | ] 227 | 228 | [[package]] 229 | name = "icu_normalizer" 230 | version = "2.0.0" 231 | source = "registry+https://github.com/rust-lang/crates.io-index" 232 | checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 233 | dependencies = [ 234 | "displaydoc", 235 | "icu_collections", 236 | "icu_normalizer_data", 237 | "icu_properties", 238 | "icu_provider", 239 | "smallvec", 240 | "zerovec", 241 | ] 242 | 243 | [[package]] 244 | name = "icu_normalizer_data" 245 | version = "2.0.0" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 248 | 249 | [[package]] 250 | name = "icu_properties" 251 | version = "2.0.1" 252 | source = "registry+https://github.com/rust-lang/crates.io-index" 253 | checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 254 | dependencies = [ 255 | "displaydoc", 256 | "icu_collections", 257 | "icu_locale_core", 258 | "icu_properties_data", 259 | "icu_provider", 260 | "potential_utf", 261 | "zerotrie", 262 | "zerovec", 263 | ] 264 | 265 | [[package]] 266 | name = "icu_properties_data" 267 | version = "2.0.1" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 270 | 271 | [[package]] 272 | name = "icu_provider" 273 | version = "2.0.0" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 276 | dependencies = [ 277 | "displaydoc", 278 | "icu_locale_core", 279 | "stable_deref_trait", 280 | "tinystr", 281 | "writeable", 282 | "yoke", 283 | "zerofrom", 284 | "zerotrie", 285 | "zerovec", 286 | ] 287 | 288 | [[package]] 289 | name = "id-arena" 290 | version = "2.2.1" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" 293 | 294 | [[package]] 295 | name = "idna" 296 | version = "1.0.3" 297 | source = "registry+https://github.com/rust-lang/crates.io-index" 298 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 299 | dependencies = [ 300 | "idna_adapter", 301 | "smallvec", 302 | "utf8_iter", 303 | ] 304 | 305 | [[package]] 306 | name = "idna_adapter" 307 | version = "1.2.1" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 310 | dependencies = [ 311 | "icu_normalizer", 312 | "icu_properties", 313 | ] 314 | 315 | [[package]] 316 | name = "indexmap" 317 | version = "2.7.1" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 320 | dependencies = [ 321 | "equivalent", 322 | "hashbrown", 323 | "serde", 324 | ] 325 | 326 | [[package]] 327 | name = "itoa" 328 | version = "1.0.14" 329 | source = "registry+https://github.com/rust-lang/crates.io-index" 330 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 331 | 332 | [[package]] 333 | name = "leb128fmt" 334 | version = "0.1.0" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" 337 | 338 | [[package]] 339 | name = "litemap" 340 | version = "0.8.0" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 343 | 344 | [[package]] 345 | name = "log" 346 | version = "0.4.26" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" 349 | 350 | [[package]] 351 | name = "memchr" 352 | version = "2.7.4" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 355 | 356 | [[package]] 357 | name = "miniz_oxide" 358 | version = "0.8.8" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 361 | dependencies = [ 362 | "adler2", 363 | ] 364 | 365 | [[package]] 366 | name = "once_cell" 367 | version = "1.21.3" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 370 | 371 | [[package]] 372 | name = "percent-encoding" 373 | version = "2.3.1" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 376 | 377 | [[package]] 378 | name = "pin-project-lite" 379 | version = "0.2.16" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 382 | 383 | [[package]] 384 | name = "pin-utils" 385 | version = "0.1.0" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 388 | 389 | [[package]] 390 | name = "potential_utf" 391 | version = "0.1.2" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 394 | dependencies = [ 395 | "zerovec", 396 | ] 397 | 398 | [[package]] 399 | name = "prettyplease" 400 | version = "0.2.33" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" 403 | dependencies = [ 404 | "proc-macro2", 405 | "syn", 406 | ] 407 | 408 | [[package]] 409 | name = "proc-macro2" 410 | version = "1.0.93" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 413 | dependencies = [ 414 | "unicode-ident", 415 | ] 416 | 417 | [[package]] 418 | name = "quote" 419 | version = "1.0.38" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 422 | dependencies = [ 423 | "proc-macro2", 424 | ] 425 | 426 | [[package]] 427 | name = "ryu" 428 | version = "1.0.19" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" 431 | 432 | [[package]] 433 | name = "semver" 434 | version = "1.0.25" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" 437 | dependencies = [ 438 | "serde", 439 | ] 440 | 441 | [[package]] 442 | name = "serde" 443 | version = "1.0.218" 444 | source = "registry+https://github.com/rust-lang/crates.io-index" 445 | checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" 446 | dependencies = [ 447 | "serde_derive", 448 | ] 449 | 450 | [[package]] 451 | name = "serde_derive" 452 | version = "1.0.218" 453 | source = "registry+https://github.com/rust-lang/crates.io-index" 454 | checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" 455 | dependencies = [ 456 | "proc-macro2", 457 | "quote", 458 | "syn", 459 | ] 460 | 461 | [[package]] 462 | name = "serde_json" 463 | version = "1.0.139" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" 466 | dependencies = [ 467 | "itoa", 468 | "memchr", 469 | "ryu", 470 | "serde", 471 | ] 472 | 473 | [[package]] 474 | name = "slab" 475 | version = "0.4.9" 476 | source = "registry+https://github.com/rust-lang/crates.io-index" 477 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 478 | dependencies = [ 479 | "autocfg", 480 | ] 481 | 482 | [[package]] 483 | name = "smallvec" 484 | version = "1.14.0" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" 487 | 488 | [[package]] 489 | name = "spdx" 490 | version = "0.10.8" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "58b69356da67e2fc1f542c71ea7e654a361a79c938e4424392ecf4fa065d2193" 493 | dependencies = [ 494 | "smallvec", 495 | ] 496 | 497 | [[package]] 498 | name = "stable_deref_trait" 499 | version = "1.2.0" 500 | source = "registry+https://github.com/rust-lang/crates.io-index" 501 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 502 | 503 | [[package]] 504 | name = "syn" 505 | version = "2.0.98" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" 508 | dependencies = [ 509 | "proc-macro2", 510 | "quote", 511 | "unicode-ident", 512 | ] 513 | 514 | [[package]] 515 | name = "synstructure" 516 | version = "0.13.2" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 519 | dependencies = [ 520 | "proc-macro2", 521 | "quote", 522 | "syn", 523 | ] 524 | 525 | [[package]] 526 | name = "tinystr" 527 | version = "0.8.1" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 530 | dependencies = [ 531 | "displaydoc", 532 | "zerovec", 533 | ] 534 | 535 | [[package]] 536 | name = "topological-sort" 537 | version = "0.2.2" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" 540 | 541 | [[package]] 542 | name = "unicode-ident" 543 | version = "1.0.17" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" 546 | 547 | [[package]] 548 | name = "unicode-xid" 549 | version = "0.2.6" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 552 | 553 | [[package]] 554 | name = "url" 555 | version = "2.5.4" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 558 | dependencies = [ 559 | "form_urlencoded", 560 | "idna", 561 | "percent-encoding", 562 | ] 563 | 564 | [[package]] 565 | name = "utf8_iter" 566 | version = "1.0.4" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 569 | 570 | [[package]] 571 | name = "wasm-encoder" 572 | version = "0.227.1" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "80bb72f02e7fbf07183443b27b0f3d4144abf8c114189f2e088ed95b696a7822" 575 | dependencies = [ 576 | "leb128fmt", 577 | "wasmparser", 578 | ] 579 | 580 | [[package]] 581 | name = "wasm-metadata" 582 | version = "0.227.1" 583 | source = "registry+https://github.com/rust-lang/crates.io-index" 584 | checksum = "ce1ef0faabbbba6674e97a56bee857ccddf942785a336c8b47b42373c922a91d" 585 | dependencies = [ 586 | "anyhow", 587 | "auditable-serde", 588 | "flate2", 589 | "indexmap", 590 | "serde", 591 | "serde_derive", 592 | "serde_json", 593 | "spdx", 594 | "url", 595 | "wasm-encoder", 596 | "wasmparser", 597 | ] 598 | 599 | [[package]] 600 | name = "wasmparser" 601 | version = "0.227.1" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "0f51cad774fb3c9461ab9bccc9c62dfb7388397b5deda31bf40e8108ccd678b2" 604 | dependencies = [ 605 | "bitflags", 606 | "hashbrown", 607 | "indexmap", 608 | "semver", 609 | ] 610 | 611 | [[package]] 612 | name = "wit-bindgen" 613 | version = "0.41.0" 614 | source = "registry+https://github.com/rust-lang/crates.io-index" 615 | checksum = "10fb6648689b3929d56bbc7eb1acf70c9a42a29eb5358c67c10f54dbd5d695de" 616 | dependencies = [ 617 | "wit-bindgen-rt", 618 | "wit-bindgen-rust-macro", 619 | ] 620 | 621 | [[package]] 622 | name = "wit-bindgen-core" 623 | version = "0.41.0" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "92fa781d4f2ff6d3f27f3cc9b74a73327b31ca0dc4a3ef25a0ce2983e0e5af9b" 626 | dependencies = [ 627 | "anyhow", 628 | "heck", 629 | "wit-parser", 630 | ] 631 | 632 | [[package]] 633 | name = "wit-bindgen-rt" 634 | version = "0.41.0" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | checksum = "c4db52a11d4dfb0a59f194c064055794ee6564eb1ced88c25da2cf76e50c5621" 637 | dependencies = [ 638 | "bitflags", 639 | "futures", 640 | "once_cell", 641 | ] 642 | 643 | [[package]] 644 | name = "wit-bindgen-rust" 645 | version = "0.41.0" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "9d0809dc5ba19e2e98661bf32fc0addc5a3ca5bf3a6a7083aa6ba484085ff3ce" 648 | dependencies = [ 649 | "anyhow", 650 | "heck", 651 | "indexmap", 652 | "prettyplease", 653 | "syn", 654 | "wasm-metadata", 655 | "wit-bindgen-core", 656 | "wit-component", 657 | ] 658 | 659 | [[package]] 660 | name = "wit-bindgen-rust-macro" 661 | version = "0.41.0" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | checksum = "ad19eec017904e04c60719592a803ee5da76cb51c81e3f6fbf9457f59db49799" 664 | dependencies = [ 665 | "anyhow", 666 | "prettyplease", 667 | "proc-macro2", 668 | "quote", 669 | "syn", 670 | "wit-bindgen-core", 671 | "wit-bindgen-rust", 672 | ] 673 | 674 | [[package]] 675 | name = "wit-component" 676 | version = "0.227.1" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | checksum = "635c3adc595422cbf2341a17fb73a319669cc8d33deed3a48368a841df86b676" 679 | dependencies = [ 680 | "anyhow", 681 | "bitflags", 682 | "indexmap", 683 | "log", 684 | "serde", 685 | "serde_derive", 686 | "serde_json", 687 | "wasm-encoder", 688 | "wasm-metadata", 689 | "wasmparser", 690 | "wit-parser", 691 | ] 692 | 693 | [[package]] 694 | name = "wit-parser" 695 | version = "0.227.1" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | checksum = "ddf445ed5157046e4baf56f9138c124a0824d4d1657e7204d71886ad8ce2fc11" 698 | dependencies = [ 699 | "anyhow", 700 | "id-arena", 701 | "indexmap", 702 | "log", 703 | "semver", 704 | "serde", 705 | "serde_derive", 706 | "serde_json", 707 | "unicode-xid", 708 | "wasmparser", 709 | ] 710 | 711 | [[package]] 712 | name = "writeable" 713 | version = "0.6.1" 714 | source = "registry+https://github.com/rust-lang/crates.io-index" 715 | checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 716 | 717 | [[package]] 718 | name = "yoke" 719 | version = "0.8.0" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 722 | dependencies = [ 723 | "serde", 724 | "stable_deref_trait", 725 | "yoke-derive", 726 | "zerofrom", 727 | ] 728 | 729 | [[package]] 730 | name = "yoke-derive" 731 | version = "0.8.0" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 734 | dependencies = [ 735 | "proc-macro2", 736 | "quote", 737 | "syn", 738 | "synstructure", 739 | ] 740 | 741 | [[package]] 742 | name = "zed-laravel-blade" 743 | version = "0.1.2" 744 | dependencies = [ 745 | "zed_extension_api", 746 | ] 747 | 748 | [[package]] 749 | name = "zed_extension_api" 750 | version = "0.7.0" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "0729d50b4ca0a7e28e590bbe32e3ca0194d97ef654961451a424c661a366fca0" 753 | dependencies = [ 754 | "serde", 755 | "serde_json", 756 | "wit-bindgen", 757 | ] 758 | 759 | [[package]] 760 | name = "zerofrom" 761 | version = "0.1.6" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 764 | dependencies = [ 765 | "zerofrom-derive", 766 | ] 767 | 768 | [[package]] 769 | name = "zerofrom-derive" 770 | version = "0.1.6" 771 | source = "registry+https://github.com/rust-lang/crates.io-index" 772 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 773 | dependencies = [ 774 | "proc-macro2", 775 | "quote", 776 | "syn", 777 | "synstructure", 778 | ] 779 | 780 | [[package]] 781 | name = "zerotrie" 782 | version = "0.2.2" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 785 | dependencies = [ 786 | "displaydoc", 787 | "yoke", 788 | "zerofrom", 789 | ] 790 | 791 | [[package]] 792 | name = "zerovec" 793 | version = "0.11.2" 794 | source = "registry+https://github.com/rust-lang/crates.io-index" 795 | checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 796 | dependencies = [ 797 | "yoke", 798 | "zerofrom", 799 | "zerovec-derive", 800 | ] 801 | 802 | [[package]] 803 | name = "zerovec-derive" 804 | version = "0.11.1" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 807 | dependencies = [ 808 | "proc-macro2", 809 | "quote", 810 | "syn", 811 | ] 812 | --------------------------------------------------------------------------------