├── .cargo └── config.toml ├── languages └── just │ ├── outline.scm │ ├── runnables.scm │ ├── tasks.json │ ├── folds.scm │ ├── config.toml │ ├── indents.scm │ ├── textobjects.scm │ ├── locals.scm │ ├── highlights.scm │ └── injections.scm ├── .envrc ├── tests ├── just ├── foo.just ├── justfile ├── foo.justfile └── test_attributes.justfile ├── .gitignore ├── Cargo.toml ├── README.md ├── extension.toml ├── flake.nix ├── LICENSE ├── flake.lock ├── src └── lib.rs └── Cargo.lock /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | target = "wasm32-wasip2" 3 | -------------------------------------------------------------------------------- /languages/just/outline.scm: -------------------------------------------------------------------------------- 1 | (recipe_header name: (_) @name) @item 2 | -------------------------------------------------------------------------------- /.envrc: -------------------------------------------------------------------------------- 1 | if hash nix 2>/dev/null; then 2 | use flake 3 | fi 4 | 5 | source_env_if_exists .envrc.local 6 | -------------------------------------------------------------------------------- /tests/just: -------------------------------------------------------------------------------- 1 | default := "Hello, World!" 2 | 3 | # Comment 4 | echo msg=default: 5 | @echo {{ msg }} 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /grammars/* 2 | justfile 3 | !tests/justfile 4 | .DS_Store 5 | .direnv/ 6 | *.wasm 7 | /target 8 | -------------------------------------------------------------------------------- /languages/just/runnables.scm: -------------------------------------------------------------------------------- 1 | ( 2 | (recipe_header name: (_) @run) 3 | (#set! tag just-recipe) 4 | ) 5 | -------------------------------------------------------------------------------- /tests/foo.just: -------------------------------------------------------------------------------- 1 | default := "Hello, World!" 2 | 3 | # Comment 4 | echo msg=default: 5 | @echo {{ msg }} 6 | -------------------------------------------------------------------------------- /tests/justfile: -------------------------------------------------------------------------------- 1 | default := "Hello, World!" 2 | 3 | # Comment 4 | echo msg=default: 5 | @echo {{ msg }} 6 | -------------------------------------------------------------------------------- /tests/foo.justfile: -------------------------------------------------------------------------------- 1 | default := "Hello, World!" 2 | 3 | # Comment 4 | echo msg=default: 5 | @echo {{ msg }} 6 | -------------------------------------------------------------------------------- /languages/just/tasks.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "label": "$ZED_SYMBOL", 4 | "command": "cd \"$ZED_DIRNAME\" && just \"$ZED_SYMBOL\"", 5 | "tags": ["just-recipe"] 6 | } 7 | ] 8 | -------------------------------------------------------------------------------- /languages/just/folds.scm: -------------------------------------------------------------------------------- 1 | ; File autogenerated by build-queries-nvim.py; do not edit 2 | 3 | ; Define collapse points 4 | 5 | ([ 6 | (recipe) 7 | (string) 8 | (external_command) 9 | ] @fold 10 | (#trim! @fold)) 11 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "just" 3 | version = "0.2.0" 4 | edition = "2024" 5 | 6 | [lib] 7 | crate-type = ["cdylib"] 8 | 9 | [dependencies] 10 | zed_extension_api = "0.7.0" 11 | 12 | [profile.release] 13 | opt-level = "z" 14 | lto = true 15 | strip = true 16 | -------------------------------------------------------------------------------- /languages/just/config.toml: -------------------------------------------------------------------------------- 1 | name = "Just" 2 | grammar = "just" 3 | path_suffixes = ["justfile", "Justfile", "JUSTFILE", "just"] 4 | line_comments = ["# "] 5 | brackets = [{ start = "(", end = ")", close = true, newline = true }] 6 | 7 | [formatter] 8 | language_servers = ["just-lsp"] 9 | -------------------------------------------------------------------------------- /languages/just/indents.scm: -------------------------------------------------------------------------------- 1 | ; File autogenerated by build-queries-nvim.py; do not edit 2 | 3 | ; This query specifies how to auto-indent logical blocks. 4 | ; 5 | ; Better documentation with diagrams is in https://docs.helix-editor.com/guides/indent.html 6 | 7 | [ 8 | (recipe) 9 | (string) 10 | (external_command) 11 | ] @indent @extend 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # zed-just 2 | 3 | [Just](https://github.com/casey/just) language support for the [Zed](https://zed.dev) editor. 4 | 5 | ## Features 6 | 7 | - Syntax highlighting via tree-sitter 8 | - Language server support with [just-lsp](https://github.com/terror/just-lsp) 9 | - Hover documentation 10 | - Diagnostics 11 | - Formatting 12 | - Run recipes directly from the editor 13 | 14 | The LSP server is automatically downloaded if not already installed. 15 | -------------------------------------------------------------------------------- /extension.toml: -------------------------------------------------------------------------------- 1 | id = "just" 2 | name = "Justfile" 3 | description = "Justfile language support" 4 | version = "0.2.0" 5 | schema_version = 1 6 | authors = [ 7 | "Jack Taylor ", 8 | "Matt Robenolt ", 9 | ] 10 | repository = "https://github.com/jackTabsCode/zed-just" 11 | 12 | [grammars.just] 13 | repository = "https://github.com/IndianBoy42/tree-sitter-just" 14 | commit = "bb0c898a80644de438e6efe5d88d30bf092935cd" 15 | 16 | [language_servers.just-lsp] 17 | name = "just-lsp" 18 | languages = ["Just"] 19 | -------------------------------------------------------------------------------- /languages/just/textobjects.scm: -------------------------------------------------------------------------------- 1 | ; File autogenerated by build-queries-nvim.py; do not edit 2 | 3 | ; Specify how to navigate around logical blocks in code 4 | 5 | (recipe 6 | (recipe_body) @function.inside) @function.around 7 | 8 | (parameters 9 | ((_) @parameter.inside . ","? @parameter.around)) @parameter.around 10 | 11 | (dependency_expression 12 | (_) @parameter.inside) @parameter.around 13 | 14 | (function_call 15 | arguments: (sequence 16 | (expression) @parameter.inside) @parameter.around) @function.around 17 | 18 | (comment) @comment.around 19 | -------------------------------------------------------------------------------- /languages/just/locals.scm: -------------------------------------------------------------------------------- 1 | ; File autogenerated by build-queries-nvim.py; do not edit 2 | 3 | ; This file tells us about the scope of variables so e.g. local 4 | ; variables override global functions with the same name 5 | 6 | ; Scope 7 | 8 | (recipe) @local.scope 9 | 10 | ; Definitions 11 | 12 | (alias 13 | left: (identifier) @local.definition) 14 | 15 | (assignment 16 | left: (identifier) @local.definition) 17 | 18 | (module 19 | name: (identifier) @local.definition) 20 | 21 | (parameter 22 | name: (identifier) @local.definition) 23 | 24 | (recipe_header 25 | name: (identifier) @local.definition) 26 | 27 | ; References 28 | 29 | (alias 30 | right: (identifier) @local.reference) 31 | 32 | (function_call 33 | name: (identifier) @local.reference) 34 | 35 | (dependency 36 | name: (identifier) @local.reference) 37 | 38 | (dependency_expression 39 | name: (identifier) @local.reference) 40 | 41 | (value 42 | (identifier) @local.reference) 43 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | inputs = { 3 | nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; 4 | flake-utils.url = "github:numtide/flake-utils"; 5 | rust-overlay = { 6 | url = "github:oxalica/rust-overlay"; 7 | inputs.nixpkgs.follows = "nixpkgs"; 8 | }; 9 | }; 10 | 11 | outputs = 12 | { 13 | nixpkgs, 14 | flake-utils, 15 | rust-overlay, 16 | ... 17 | }: 18 | flake-utils.lib.eachDefaultSystem ( 19 | system: 20 | let 21 | overlays = [ (import rust-overlay) ]; 22 | pkgs = import nixpkgs { 23 | inherit system overlays; 24 | }; 25 | in 26 | { 27 | devShells.default = pkgs.mkShell { 28 | packages = with pkgs; [ 29 | just 30 | (rust-bin.stable.latest.default.override { 31 | extensions = [ 32 | "rust-src" 33 | "rust-analyzer" 34 | ]; 35 | targets = [ "wasm32-wasip2" ]; 36 | }) 37 | ]; 38 | }; 39 | } 40 | ); 41 | } 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Jack Taylor 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 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "flake-utils": { 4 | "inputs": { 5 | "systems": "systems" 6 | }, 7 | "locked": { 8 | "lastModified": 1731533236, 9 | "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 10 | "owner": "numtide", 11 | "repo": "flake-utils", 12 | "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 13 | "type": "github" 14 | }, 15 | "original": { 16 | "owner": "numtide", 17 | "repo": "flake-utils", 18 | "type": "github" 19 | } 20 | }, 21 | "nixpkgs": { 22 | "locked": { 23 | "lastModified": 1765186076, 24 | "narHash": "sha256-hM20uyap1a0M9d344I692r+ik4gTMyj60cQWO+hAYP8=", 25 | "owner": "NixOS", 26 | "repo": "nixpkgs", 27 | "rev": "addf7cf5f383a3101ecfba091b98d0a1263dc9b8", 28 | "type": "github" 29 | }, 30 | "original": { 31 | "owner": "NixOS", 32 | "ref": "nixos-unstable", 33 | "repo": "nixpkgs", 34 | "type": "github" 35 | } 36 | }, 37 | "root": { 38 | "inputs": { 39 | "flake-utils": "flake-utils", 40 | "nixpkgs": "nixpkgs", 41 | "rust-overlay": "rust-overlay" 42 | } 43 | }, 44 | "rust-overlay": { 45 | "inputs": { 46 | "nixpkgs": [ 47 | "nixpkgs" 48 | ] 49 | }, 50 | "locked": { 51 | "lastModified": 1765248027, 52 | "narHash": "sha256-ngar+yP06x3+2k2Iey29uU0DWx5ur06h3iPBQXlU+yI=", 53 | "owner": "oxalica", 54 | "repo": "rust-overlay", 55 | "rev": "7b50ad68415ae5be7ee4cc68fa570c420741b644", 56 | "type": "github" 57 | }, 58 | "original": { 59 | "owner": "oxalica", 60 | "repo": "rust-overlay", 61 | "type": "github" 62 | } 63 | }, 64 | "systems": { 65 | "locked": { 66 | "lastModified": 1681028828, 67 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 68 | "owner": "nix-systems", 69 | "repo": "default", 70 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 71 | "type": "github" 72 | }, 73 | "original": { 74 | "owner": "nix-systems", 75 | "repo": "default", 76 | "type": "github" 77 | } 78 | } 79 | }, 80 | "root": "root", 81 | "version": 7 82 | } 83 | -------------------------------------------------------------------------------- /tests/test_attributes.justfile: -------------------------------------------------------------------------------- 1 | set unstable := true 2 | 3 | # Simple attribute 4 | [private] 5 | hidden-recipe: 6 | echo "This recipe won't show in --list" 7 | 8 | # Attribute with parentheses (string argument) 9 | [group('dev')] 10 | test-parens: 11 | echo "Testing parentheses syntax" 12 | 13 | # Attribute with colon syntax 14 | [working-directory('/tmp')] 15 | test-colon: 16 | echo "Testing colon syntax - working in /tmp" 17 | 18 | [doc('Build the project')] 19 | [group('build')] 20 | build: 21 | echo "Building..." 22 | 23 | # Confirmation attributes 24 | [confirm] 25 | dangerous-task: 26 | echo "This requires confirmation" 27 | 28 | [confirm('Are you absolutely sure?')] 29 | very-dangerous: 30 | echo "Custom confirmation prompt" 31 | 32 | # Platform-specific attributes 33 | [linux] 34 | linux-only: 35 | echo "Only runs on Linux" 36 | 37 | [macos] 38 | macos-only: 39 | echo "Only runs on macOS" 40 | 41 | [windows] 42 | windows-only: 43 | echo "Only runs on Windows" 44 | 45 | [unix] 46 | unix-only: 47 | echo "Runs on Unix-like systems (Linux, macOS, BSD)" 48 | 49 | [openbsd] 50 | openbsd-only: 51 | echo "Only runs on OpenBSD" 52 | 53 | # Working directory control 54 | [no-cd] 55 | stay-here: 56 | echo "Don't change directory for this recipe" 57 | 58 | # Error message control 59 | [no-exit-message] 60 | quiet-failure: 61 | false 62 | 63 | # Script execution (shebang recipes run as scripts automatically) 64 | script-recipe: 65 | #!/usr/bin/env bash 66 | echo "Running as a script" 67 | 68 | [script('python3')] 69 | python-recipe: 70 | print("Hello from Python!") 71 | 72 | # Other attributes 73 | [no-quiet] 74 | always-verbose: 75 | echo "This ignores global quiet setting" 76 | 77 | [positional-arguments] 78 | with-args *args: 79 | echo "Args: $@" 80 | 81 | [parallel] 82 | parallel-deps: dep1 dep2 83 | echo "Dependencies run in parallel" 84 | 85 | dep1: 86 | echo "Dependency 1" 87 | 88 | dep2: 89 | echo "Dependency 2" 90 | 91 | [extension('py')] 92 | python-shebang: 93 | #!/usr/bin/env python3 94 | print("File will have .py extension") 95 | 96 | [metadata('author: test')] 97 | with-metadata: 98 | echo "Has custom metadata" 99 | 100 | [default] 101 | default-recipe: 102 | @just --list 103 | 104 | # Combined attributes on one line 105 | [no-cd] 106 | [private] 107 | combined: 108 | echo "Multiple attributes on one line" 109 | -------------------------------------------------------------------------------- /languages/just/highlights.scm: -------------------------------------------------------------------------------- 1 | ; File autogenerated by build-queries-nvim.py; do not edit 2 | 3 | ; This file specifies how matched syntax patterns should be highlighted 4 | 5 | [ 6 | "export" 7 | "import" 8 | ] @keyword.control.import 9 | 10 | "mod" @keyword.directive 11 | 12 | [ 13 | "alias" 14 | "set" 15 | "shell" 16 | ] @keyword 17 | 18 | [ 19 | "if" 20 | "else" 21 | ] @keyword.control.conditional 22 | 23 | ; Variables 24 | 25 | (value 26 | (identifier) @variable) 27 | 28 | (alias 29 | left: (identifier) @variable) 30 | 31 | (assignment 32 | left: (identifier) @variable) 33 | 34 | ; Functions 35 | 36 | (recipe_header 37 | name: (identifier) @function) 38 | 39 | (dependency 40 | name: (identifier) @function) 41 | 42 | (dependency_expression 43 | name: (identifier) @function) 44 | 45 | (function_call 46 | name: (identifier) @function) 47 | 48 | ; Parameters 49 | 50 | (parameter 51 | name: (identifier) @variable.parameter) 52 | 53 | ; Namespaces 54 | 55 | (module 56 | name: (identifier) @namespace) 57 | 58 | ; Operators 59 | 60 | [ 61 | ":=" 62 | "?" 63 | "==" 64 | "!=" 65 | "=~" 66 | "@" 67 | "=" 68 | "$" 69 | "*" 70 | "+" 71 | "&&" 72 | "@-" 73 | "-@" 74 | "-" 75 | "/" 76 | ":" 77 | ] @operator 78 | 79 | ; Punctuation 80 | 81 | "," @punctuation.delimiter 82 | 83 | [ 84 | "{" 85 | "}" 86 | "[" 87 | "]" 88 | "(" 89 | ")" 90 | "{{" 91 | "}}" 92 | ] @punctuation.bracket 93 | 94 | [ "`" "```" ] @punctuation.special 95 | 96 | ; Literals 97 | 98 | (boolean) @constant.builtin.boolean 99 | 100 | [ 101 | (string) 102 | (external_command) 103 | ] @string 104 | 105 | (escape_sequence) @constant.character.escape 106 | 107 | ; Comments 108 | 109 | (comment) @comment.line 110 | 111 | (shebang) @keyword.directive 112 | 113 | ; highlight known settings (filtering does not always work) 114 | (setting 115 | left: (identifier) @keyword 116 | (#any-of? @keyword 117 | "allow-duplicate-recipes" 118 | "dotenv-filename" 119 | "dotenv-load" 120 | "dotenv-path" 121 | "export" 122 | "fallback" 123 | "ignore-comments" 124 | "positional-arguments" 125 | "shell" 126 | "tempdi" 127 | "windows-powershell" 128 | "windows-shell")) 129 | 130 | ; highlight known attributes (filtering does not always work) 131 | (attribute 132 | (identifier) @attribute 133 | (#any-of? @attribute 134 | "allow-duplicate-recipes" 135 | "confirm" 136 | "default" 137 | "doc" 138 | "dotenv-filename" 139 | "dotenv-load" 140 | "dotenv-path" 141 | "exit-message" 142 | "export" 143 | "extension" 144 | "fallback" 145 | "group" 146 | "ignore-comments" 147 | "linux" 148 | "macos" 149 | "metadata" 150 | "no-cd" 151 | "no-exit-message" 152 | "no-quiet" 153 | "openbsd" 154 | "parallel" 155 | "positional-arguments" 156 | "private" 157 | "script" 158 | "shell" 159 | "tempdi" 160 | "unix" 161 | "windows" 162 | "windows-powershell" 163 | "windows-shell" 164 | "working-directory")) 165 | 166 | ; Numbers are part of the syntax tree, even if disallowed 167 | (numeric_error) @error 168 | -------------------------------------------------------------------------------- /languages/just/injections.scm: -------------------------------------------------------------------------------- 1 | ; File autogenerated by build-queries-nvim.py; do not edit 2 | 3 | ; Specify nested languages that live within a `justfile` 4 | 5 | ; FIXME: these are not compatible with helix due to precedence 6 | 7 | ; ================ Always applicable ================ 8 | 9 | ((comment) @injection.content 10 | (#set! injection.language "comment")) 11 | 12 | ; Highlight the RHS of `=~` as regex 13 | ((regex_literal 14 | (_) @injection.content) 15 | (#set! injection.language "regex")) 16 | 17 | ; ================ Global defaults ================ 18 | 19 | ; Default everything to be bash 20 | (recipe_body 21 | !shebang 22 | (#set! injection.language "bash") 23 | (#set! injection.include-children)) @injection.content 24 | 25 | (external_command 26 | (command_body) @injection.content 27 | (#set! injection.language "bash")) 28 | 29 | ; ================ Global language specified ================ 30 | ; Global language is set with something like one of the following: 31 | ; 32 | ; set shell := ["bash", "-c", ...] 33 | ; set shell := ["pwsh.exe"] 34 | ; 35 | ; We can extract the first item of the array, but we can't extract the language 36 | ; name from the string with something like regex. So instead we special case 37 | ; two things: powershell, which is likely to come with a `.exe` attachment that 38 | ; we need to strip, and everything else which hopefully has no extension. We 39 | ; separate this with a `#match?`. 40 | ; 41 | ; Unfortunately, there also isn't a way to allow arbitrary nesting or 42 | ; alternatively set "global" capture variables. So we can set this for item- 43 | ; level external commands, but not for e.g. external commands within an 44 | ; expression without getting _really_ annoying. Should at least look fine since 45 | ; they default to bash. Limitations... 46 | ; See https://github.com/tree-sitter/tree-sitter/issues/880 for more on that. 47 | 48 | (source_file 49 | (setting "shell" ":=" "[" (string) @_langstr 50 | (#match? @_langstr ".*(powershell|pwsh|cmd).*") 51 | (#set! injection.language "powershell")) 52 | [ 53 | (recipe 54 | (recipe_body 55 | !shebang 56 | (#set! injection.include-children)) @injection.content) 57 | 58 | (assignment 59 | (expression 60 | (value 61 | (external_command 62 | (command_body) @injection.content)))) 63 | ]) 64 | 65 | (source_file 66 | (setting "shell" ":=" "[" (string) @injection.language 67 | (#not-match? @injection.language ".*(powershell|pwsh|cmd).*")) 68 | [ 69 | (recipe 70 | (recipe_body 71 | !shebang 72 | (#set! injection.include-children)) @injection.content) 73 | 74 | (assignment 75 | (expression 76 | (value 77 | (external_command 78 | (command_body) @injection.content)))) 79 | ]) 80 | 81 | ; ================ Recipe language specified ================ 82 | 83 | ; Set highlighting for recipes that specify a language, using the exact name by default 84 | (recipe_body ; 85 | (shebang ; 86 | (language) @injection.language) 87 | (#not-any-of? @injection.language "python3" "nodejs" "node") 88 | (#set! injection.include-children)) @injection.content 89 | 90 | ; Transform some known executables 91 | 92 | ; python3 -> python 93 | (recipe_body 94 | (shebang 95 | (language) @_lang) 96 | (#eq? @_lang "python3") 97 | (#set! injection.language "python") 98 | (#set! injection.include-children)) @injection.content 99 | 100 | ; node/nodejs -> javascript 101 | (recipe_body 102 | (shebang 103 | (language) @_lang) 104 | (#any-of? @_lang "node" "nodejs") 105 | (#set! injection.language "javascript") 106 | (#set! injection.include-children)) @injection.content 107 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | use std::fs; 2 | 3 | use zed_extension_api::{ 4 | Architecture, Command, DownloadedFileType, Extension, GithubReleaseOptions, LanguageServerId, 5 | Os, Result, Worktree, current_platform, download_file, latest_github_release, 6 | make_file_executable, register_extension, 7 | }; 8 | 9 | struct JustExtension { 10 | cached_binary_path: Option, 11 | } 12 | 13 | impl JustExtension { 14 | fn language_server_binary_path( 15 | &mut self, 16 | _language_server_id: &LanguageServerId, 17 | worktree: &Worktree, 18 | ) -> Result { 19 | // Check if already cached 20 | if let Some(path) = &self.cached_binary_path 21 | && fs::metadata(path).is_ok_and(|stat| stat.is_file()) 22 | { 23 | return Ok(path.clone()); 24 | } 25 | 26 | // Check if just-lsp is on PATH 27 | if let Some(path) = worktree.which("just-lsp") { 28 | self.cached_binary_path = Some(path.clone()); 29 | return Ok(path); 30 | } 31 | 32 | // Download and install just-lsp 33 | let release = latest_github_release( 34 | "terror/just-lsp", 35 | GithubReleaseOptions { 36 | require_assets: true, 37 | pre_release: false, 38 | }, 39 | )?; 40 | 41 | let (os, arch) = current_platform(); 42 | let asset_name = format!( 43 | "just-lsp-{version}-{target}.{extension}", 44 | version = release.version, 45 | target = match (os, arch) { 46 | (Os::Mac, Architecture::Aarch64) => "aarch64-apple-darwin", 47 | (Os::Mac, Architecture::X8664) => "x86_64-apple-darwin", 48 | (Os::Linux, Architecture::Aarch64) => "aarch64-unknown-linux-gnu", 49 | (Os::Linux, Architecture::X8664) => "x86_64-unknown-linux-gnu", 50 | (Os::Windows, Architecture::Aarch64) => "aarch64-pc-windows-msvc", 51 | (Os::Windows, Architecture::X8664) => "x86_64-pc-windows-msvc", 52 | _ => return Err(format!("Unsupported platform: {:?} {:?}", os, arch)), 53 | }, 54 | extension = match os { 55 | Os::Windows => "zip", 56 | _ => "tar.gz", 57 | } 58 | ); 59 | 60 | let asset = release 61 | .assets 62 | .iter() 63 | .find(|asset| asset.name == asset_name) 64 | .ok_or_else(|| format!("Asset {} not found in release", asset_name))?; 65 | 66 | let version_dir = format!("just-lsp-{}", release.version); 67 | let binary_path = format!( 68 | "{}/just-lsp{}", 69 | version_dir, 70 | match os { 71 | Os::Windows => ".exe", 72 | _ => "", 73 | } 74 | ); 75 | 76 | // Check if already downloaded 77 | if !fs::metadata(&binary_path).is_ok_and(|stat| stat.is_file()) { 78 | download_file( 79 | &asset.download_url, 80 | &version_dir, 81 | match os { 82 | Os::Windows => DownloadedFileType::Zip, 83 | _ => DownloadedFileType::GzipTar, 84 | }, 85 | ) 86 | .map_err(|e| format!("Failed to download just-lsp: {}", e))?; 87 | 88 | make_file_executable(&binary_path)?; 89 | } 90 | 91 | self.cached_binary_path = Some(binary_path.clone()); 92 | Ok(binary_path) 93 | } 94 | } 95 | 96 | impl Extension for JustExtension { 97 | fn new() -> Self { 98 | Self { 99 | cached_binary_path: None, 100 | } 101 | } 102 | 103 | fn language_server_command( 104 | &mut self, 105 | language_server_id: &LanguageServerId, 106 | worktree: &Worktree, 107 | ) -> Result { 108 | let path = self.language_server_binary_path(language_server_id, worktree)?; 109 | 110 | Ok(Command { 111 | command: path, 112 | args: vec![], 113 | env: Default::default(), 114 | }) 115 | } 116 | } 117 | 118 | register_extension!(JustExtension); 119 | -------------------------------------------------------------------------------- /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.1" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 10 | 11 | [[package]] 12 | name = "anyhow" 13 | version = "1.0.100" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 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 = "bitflags" 31 | version = "2.10.0" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 34 | 35 | [[package]] 36 | name = "cfg-if" 37 | version = "1.0.4" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 40 | 41 | [[package]] 42 | name = "crc32fast" 43 | version = "1.5.0" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" 46 | dependencies = [ 47 | "cfg-if", 48 | ] 49 | 50 | [[package]] 51 | name = "displaydoc" 52 | version = "0.2.5" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 55 | dependencies = [ 56 | "proc-macro2", 57 | "quote", 58 | "syn", 59 | ] 60 | 61 | [[package]] 62 | name = "equivalent" 63 | version = "1.0.2" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 66 | 67 | [[package]] 68 | name = "flate2" 69 | version = "1.1.5" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" 72 | dependencies = [ 73 | "crc32fast", 74 | "miniz_oxide", 75 | ] 76 | 77 | [[package]] 78 | name = "foldhash" 79 | version = "0.1.5" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 82 | 83 | [[package]] 84 | name = "form_urlencoded" 85 | version = "1.2.2" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 88 | dependencies = [ 89 | "percent-encoding", 90 | ] 91 | 92 | [[package]] 93 | name = "futures" 94 | version = "0.3.31" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 97 | dependencies = [ 98 | "futures-channel", 99 | "futures-core", 100 | "futures-executor", 101 | "futures-io", 102 | "futures-sink", 103 | "futures-task", 104 | "futures-util", 105 | ] 106 | 107 | [[package]] 108 | name = "futures-channel" 109 | version = "0.3.31" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 112 | dependencies = [ 113 | "futures-core", 114 | "futures-sink", 115 | ] 116 | 117 | [[package]] 118 | name = "futures-core" 119 | version = "0.3.31" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 122 | 123 | [[package]] 124 | name = "futures-executor" 125 | version = "0.3.31" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 128 | dependencies = [ 129 | "futures-core", 130 | "futures-task", 131 | "futures-util", 132 | ] 133 | 134 | [[package]] 135 | name = "futures-io" 136 | version = "0.3.31" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 139 | 140 | [[package]] 141 | name = "futures-macro" 142 | version = "0.3.31" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 145 | dependencies = [ 146 | "proc-macro2", 147 | "quote", 148 | "syn", 149 | ] 150 | 151 | [[package]] 152 | name = "futures-sink" 153 | version = "0.3.31" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 156 | 157 | [[package]] 158 | name = "futures-task" 159 | version = "0.3.31" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 162 | 163 | [[package]] 164 | name = "futures-util" 165 | version = "0.3.31" 166 | source = "registry+https://github.com/rust-lang/crates.io-index" 167 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 168 | dependencies = [ 169 | "futures-channel", 170 | "futures-core", 171 | "futures-io", 172 | "futures-macro", 173 | "futures-sink", 174 | "futures-task", 175 | "memchr", 176 | "pin-project-lite", 177 | "pin-utils", 178 | "slab", 179 | ] 180 | 181 | [[package]] 182 | name = "hashbrown" 183 | version = "0.15.5" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 186 | dependencies = [ 187 | "foldhash", 188 | ] 189 | 190 | [[package]] 191 | name = "hashbrown" 192 | version = "0.16.1" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" 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.1.1" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 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.1.1" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 220 | dependencies = [ 221 | "displaydoc", 222 | "litemap", 223 | "tinystr", 224 | "writeable", 225 | "zerovec", 226 | ] 227 | 228 | [[package]] 229 | name = "icu_normalizer" 230 | version = "2.1.1" 231 | source = "registry+https://github.com/rust-lang/crates.io-index" 232 | checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 233 | dependencies = [ 234 | "icu_collections", 235 | "icu_normalizer_data", 236 | "icu_properties", 237 | "icu_provider", 238 | "smallvec", 239 | "zerovec", 240 | ] 241 | 242 | [[package]] 243 | name = "icu_normalizer_data" 244 | version = "2.1.1" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 247 | 248 | [[package]] 249 | name = "icu_properties" 250 | version = "2.1.2" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" 253 | dependencies = [ 254 | "icu_collections", 255 | "icu_locale_core", 256 | "icu_properties_data", 257 | "icu_provider", 258 | "zerotrie", 259 | "zerovec", 260 | ] 261 | 262 | [[package]] 263 | name = "icu_properties_data" 264 | version = "2.1.2" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" 267 | 268 | [[package]] 269 | name = "icu_provider" 270 | version = "2.1.1" 271 | source = "registry+https://github.com/rust-lang/crates.io-index" 272 | checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 273 | dependencies = [ 274 | "displaydoc", 275 | "icu_locale_core", 276 | "writeable", 277 | "yoke", 278 | "zerofrom", 279 | "zerotrie", 280 | "zerovec", 281 | ] 282 | 283 | [[package]] 284 | name = "id-arena" 285 | version = "2.2.1" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" 288 | 289 | [[package]] 290 | name = "idna" 291 | version = "1.1.0" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 294 | dependencies = [ 295 | "idna_adapter", 296 | "smallvec", 297 | "utf8_iter", 298 | ] 299 | 300 | [[package]] 301 | name = "idna_adapter" 302 | version = "1.2.1" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 305 | dependencies = [ 306 | "icu_normalizer", 307 | "icu_properties", 308 | ] 309 | 310 | [[package]] 311 | name = "indexmap" 312 | version = "2.12.1" 313 | source = "registry+https://github.com/rust-lang/crates.io-index" 314 | checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" 315 | dependencies = [ 316 | "equivalent", 317 | "hashbrown 0.16.1", 318 | "serde", 319 | "serde_core", 320 | ] 321 | 322 | [[package]] 323 | name = "itoa" 324 | version = "1.0.15" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 327 | 328 | [[package]] 329 | name = "just" 330 | version = "0.2.0" 331 | dependencies = [ 332 | "zed_extension_api", 333 | ] 334 | 335 | [[package]] 336 | name = "leb128fmt" 337 | version = "0.1.0" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" 340 | 341 | [[package]] 342 | name = "litemap" 343 | version = "0.8.1" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 346 | 347 | [[package]] 348 | name = "log" 349 | version = "0.4.29" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" 352 | 353 | [[package]] 354 | name = "memchr" 355 | version = "2.7.6" 356 | source = "registry+https://github.com/rust-lang/crates.io-index" 357 | checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 358 | 359 | [[package]] 360 | name = "miniz_oxide" 361 | version = "0.8.9" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 364 | dependencies = [ 365 | "adler2", 366 | "simd-adler32", 367 | ] 368 | 369 | [[package]] 370 | name = "once_cell" 371 | version = "1.21.3" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 374 | 375 | [[package]] 376 | name = "percent-encoding" 377 | version = "2.3.2" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 380 | 381 | [[package]] 382 | name = "pin-project-lite" 383 | version = "0.2.16" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 386 | 387 | [[package]] 388 | name = "pin-utils" 389 | version = "0.1.0" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 392 | 393 | [[package]] 394 | name = "potential_utf" 395 | version = "0.1.4" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 398 | dependencies = [ 399 | "zerovec", 400 | ] 401 | 402 | [[package]] 403 | name = "prettyplease" 404 | version = "0.2.37" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 407 | dependencies = [ 408 | "proc-macro2", 409 | "syn", 410 | ] 411 | 412 | [[package]] 413 | name = "proc-macro2" 414 | version = "1.0.103" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" 417 | dependencies = [ 418 | "unicode-ident", 419 | ] 420 | 421 | [[package]] 422 | name = "quote" 423 | version = "1.0.42" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" 426 | dependencies = [ 427 | "proc-macro2", 428 | ] 429 | 430 | [[package]] 431 | name = "ryu" 432 | version = "1.0.20" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 435 | 436 | [[package]] 437 | name = "semver" 438 | version = "1.0.27" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 441 | dependencies = [ 442 | "serde", 443 | "serde_core", 444 | ] 445 | 446 | [[package]] 447 | name = "serde" 448 | version = "1.0.228" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 451 | dependencies = [ 452 | "serde_core", 453 | "serde_derive", 454 | ] 455 | 456 | [[package]] 457 | name = "serde_core" 458 | version = "1.0.228" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 461 | dependencies = [ 462 | "serde_derive", 463 | ] 464 | 465 | [[package]] 466 | name = "serde_derive" 467 | version = "1.0.228" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 470 | dependencies = [ 471 | "proc-macro2", 472 | "quote", 473 | "syn", 474 | ] 475 | 476 | [[package]] 477 | name = "serde_json" 478 | version = "1.0.145" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 481 | dependencies = [ 482 | "itoa", 483 | "memchr", 484 | "ryu", 485 | "serde", 486 | "serde_core", 487 | ] 488 | 489 | [[package]] 490 | name = "simd-adler32" 491 | version = "0.3.8" 492 | source = "registry+https://github.com/rust-lang/crates.io-index" 493 | checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" 494 | 495 | [[package]] 496 | name = "slab" 497 | version = "0.4.11" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 500 | 501 | [[package]] 502 | name = "smallvec" 503 | version = "1.15.1" 504 | source = "registry+https://github.com/rust-lang/crates.io-index" 505 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 506 | 507 | [[package]] 508 | name = "spdx" 509 | version = "0.10.9" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "c3e17e880bafaeb362a7b751ec46bdc5b61445a188f80e0606e68167cd540fa3" 512 | dependencies = [ 513 | "smallvec", 514 | ] 515 | 516 | [[package]] 517 | name = "stable_deref_trait" 518 | version = "1.2.1" 519 | source = "registry+https://github.com/rust-lang/crates.io-index" 520 | checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 521 | 522 | [[package]] 523 | name = "syn" 524 | version = "2.0.111" 525 | source = "registry+https://github.com/rust-lang/crates.io-index" 526 | checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" 527 | dependencies = [ 528 | "proc-macro2", 529 | "quote", 530 | "unicode-ident", 531 | ] 532 | 533 | [[package]] 534 | name = "synstructure" 535 | version = "0.13.2" 536 | source = "registry+https://github.com/rust-lang/crates.io-index" 537 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 538 | dependencies = [ 539 | "proc-macro2", 540 | "quote", 541 | "syn", 542 | ] 543 | 544 | [[package]] 545 | name = "tinystr" 546 | version = "0.8.2" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 549 | dependencies = [ 550 | "displaydoc", 551 | "zerovec", 552 | ] 553 | 554 | [[package]] 555 | name = "topological-sort" 556 | version = "0.2.2" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" 559 | 560 | [[package]] 561 | name = "unicode-ident" 562 | version = "1.0.22" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 565 | 566 | [[package]] 567 | name = "unicode-xid" 568 | version = "0.2.6" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 571 | 572 | [[package]] 573 | name = "url" 574 | version = "2.5.7" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 577 | dependencies = [ 578 | "form_urlencoded", 579 | "idna", 580 | "percent-encoding", 581 | "serde", 582 | ] 583 | 584 | [[package]] 585 | name = "utf8_iter" 586 | version = "1.0.4" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 589 | 590 | [[package]] 591 | name = "wasm-encoder" 592 | version = "0.227.1" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "80bb72f02e7fbf07183443b27b0f3d4144abf8c114189f2e088ed95b696a7822" 595 | dependencies = [ 596 | "leb128fmt", 597 | "wasmparser", 598 | ] 599 | 600 | [[package]] 601 | name = "wasm-metadata" 602 | version = "0.227.1" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "ce1ef0faabbbba6674e97a56bee857ccddf942785a336c8b47b42373c922a91d" 605 | dependencies = [ 606 | "anyhow", 607 | "auditable-serde", 608 | "flate2", 609 | "indexmap", 610 | "serde", 611 | "serde_derive", 612 | "serde_json", 613 | "spdx", 614 | "url", 615 | "wasm-encoder", 616 | "wasmparser", 617 | ] 618 | 619 | [[package]] 620 | name = "wasmparser" 621 | version = "0.227.1" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "0f51cad774fb3c9461ab9bccc9c62dfb7388397b5deda31bf40e8108ccd678b2" 624 | dependencies = [ 625 | "bitflags", 626 | "hashbrown 0.15.5", 627 | "indexmap", 628 | "semver", 629 | ] 630 | 631 | [[package]] 632 | name = "wit-bindgen" 633 | version = "0.41.0" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "10fb6648689b3929d56bbc7eb1acf70c9a42a29eb5358c67c10f54dbd5d695de" 636 | dependencies = [ 637 | "wit-bindgen-rt", 638 | "wit-bindgen-rust-macro", 639 | ] 640 | 641 | [[package]] 642 | name = "wit-bindgen-core" 643 | version = "0.41.0" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "92fa781d4f2ff6d3f27f3cc9b74a73327b31ca0dc4a3ef25a0ce2983e0e5af9b" 646 | dependencies = [ 647 | "anyhow", 648 | "heck", 649 | "wit-parser", 650 | ] 651 | 652 | [[package]] 653 | name = "wit-bindgen-rt" 654 | version = "0.41.0" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "c4db52a11d4dfb0a59f194c064055794ee6564eb1ced88c25da2cf76e50c5621" 657 | dependencies = [ 658 | "bitflags", 659 | "futures", 660 | "once_cell", 661 | ] 662 | 663 | [[package]] 664 | name = "wit-bindgen-rust" 665 | version = "0.41.0" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | checksum = "9d0809dc5ba19e2e98661bf32fc0addc5a3ca5bf3a6a7083aa6ba484085ff3ce" 668 | dependencies = [ 669 | "anyhow", 670 | "heck", 671 | "indexmap", 672 | "prettyplease", 673 | "syn", 674 | "wasm-metadata", 675 | "wit-bindgen-core", 676 | "wit-component", 677 | ] 678 | 679 | [[package]] 680 | name = "wit-bindgen-rust-macro" 681 | version = "0.41.0" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "ad19eec017904e04c60719592a803ee5da76cb51c81e3f6fbf9457f59db49799" 684 | dependencies = [ 685 | "anyhow", 686 | "prettyplease", 687 | "proc-macro2", 688 | "quote", 689 | "syn", 690 | "wit-bindgen-core", 691 | "wit-bindgen-rust", 692 | ] 693 | 694 | [[package]] 695 | name = "wit-component" 696 | version = "0.227.1" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "635c3adc595422cbf2341a17fb73a319669cc8d33deed3a48368a841df86b676" 699 | dependencies = [ 700 | "anyhow", 701 | "bitflags", 702 | "indexmap", 703 | "log", 704 | "serde", 705 | "serde_derive", 706 | "serde_json", 707 | "wasm-encoder", 708 | "wasm-metadata", 709 | "wasmparser", 710 | "wit-parser", 711 | ] 712 | 713 | [[package]] 714 | name = "wit-parser" 715 | version = "0.227.1" 716 | source = "registry+https://github.com/rust-lang/crates.io-index" 717 | checksum = "ddf445ed5157046e4baf56f9138c124a0824d4d1657e7204d71886ad8ce2fc11" 718 | dependencies = [ 719 | "anyhow", 720 | "id-arena", 721 | "indexmap", 722 | "log", 723 | "semver", 724 | "serde", 725 | "serde_derive", 726 | "serde_json", 727 | "unicode-xid", 728 | "wasmparser", 729 | ] 730 | 731 | [[package]] 732 | name = "writeable" 733 | version = "0.6.2" 734 | source = "registry+https://github.com/rust-lang/crates.io-index" 735 | checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 736 | 737 | [[package]] 738 | name = "yoke" 739 | version = "0.8.1" 740 | source = "registry+https://github.com/rust-lang/crates.io-index" 741 | checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 742 | dependencies = [ 743 | "stable_deref_trait", 744 | "yoke-derive", 745 | "zerofrom", 746 | ] 747 | 748 | [[package]] 749 | name = "yoke-derive" 750 | version = "0.8.1" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 753 | dependencies = [ 754 | "proc-macro2", 755 | "quote", 756 | "syn", 757 | "synstructure", 758 | ] 759 | 760 | [[package]] 761 | name = "zed_extension_api" 762 | version = "0.7.0" 763 | source = "registry+https://github.com/rust-lang/crates.io-index" 764 | checksum = "0729d50b4ca0a7e28e590bbe32e3ca0194d97ef654961451a424c661a366fca0" 765 | dependencies = [ 766 | "serde", 767 | "serde_json", 768 | "wit-bindgen", 769 | ] 770 | 771 | [[package]] 772 | name = "zerofrom" 773 | version = "0.1.6" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 776 | dependencies = [ 777 | "zerofrom-derive", 778 | ] 779 | 780 | [[package]] 781 | name = "zerofrom-derive" 782 | version = "0.1.6" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 785 | dependencies = [ 786 | "proc-macro2", 787 | "quote", 788 | "syn", 789 | "synstructure", 790 | ] 791 | 792 | [[package]] 793 | name = "zerotrie" 794 | version = "0.2.3" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 797 | dependencies = [ 798 | "displaydoc", 799 | "yoke", 800 | "zerofrom", 801 | ] 802 | 803 | [[package]] 804 | name = "zerovec" 805 | version = "0.11.5" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 808 | dependencies = [ 809 | "yoke", 810 | "zerofrom", 811 | "zerovec-derive", 812 | ] 813 | 814 | [[package]] 815 | name = "zerovec-derive" 816 | version = "0.11.2" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 819 | dependencies = [ 820 | "proc-macro2", 821 | "quote", 822 | "syn", 823 | ] 824 | --------------------------------------------------------------------------------