Add protobuf support (#6748)

Derrick Laird created

Release Notes:

- Added protobuf syntax highlighting
([#5160](https://github.com/zed-industries/zed/issues/5160)).

Change summary

Cargo.lock                                    | 10 +++
Cargo.toml                                    |  1 
crates/zed/Cargo.toml                         |  1 
crates/zed/src/languages.rs                   |  1 
crates/zed/src/languages/proto/config.toml    | 12 ++++
crates/zed/src/languages/proto/highlights.scm | 61 +++++++++++++++++++++
crates/zed/src/languages/proto/outline.scm    | 19 ++++++
docs/src/languages/proto.md                   |  4 +
8 files changed, 109 insertions(+)

Detailed changes

Cargo.lock 🔗

@@ -8665,6 +8665,15 @@ dependencies = [
  "tree-sitter",
 ]
 
+[[package]]
+name = "tree-sitter-proto"
+version = "0.0.2"
+source = "git+https://github.com/rewinfrey/tree-sitter-proto?rev=36d54f288aee112f13a67b550ad32634d0c2cb52#36d54f288aee112f13a67b550ad32634d0c2cb52"
+dependencies = [
+ "cc",
+ "tree-sitter",
+]
+
 [[package]]
 name = "tree-sitter-purescript"
 version = "1.0.0"
@@ -9876,6 +9885,7 @@ dependencies = [
  "tree-sitter-nix",
  "tree-sitter-nu",
  "tree-sitter-php",
+ "tree-sitter-proto",
  "tree-sitter-purescript",
  "tree-sitter-python",
  "tree-sitter-racket",

Cargo.toml 🔗

@@ -149,6 +149,7 @@ tree-sitter-json = { git = "https://github.com/tree-sitter/tree-sitter-json", re
 tree-sitter-rust = "0.20.3"
 tree-sitter-markdown = { git = "https://github.com/MDeiml/tree-sitter-markdown", rev = "330ecab87a3e3a7211ac69bbadc19eabecdb1cca" }
 tree-sitter-php = "0.21.1"
+tree-sitter-proto = {git = "https://github.com/rewinfrey/tree-sitter-proto", rev = "36d54f288aee112f13a67b550ad32634d0c2cb52"}
 tree-sitter-purescript = { git = "https://github.com/ivanmoreau/tree-sitter-purescript", rev = "a37140f0c7034977b90faa73c94fcb8a5e45ed08" }
 tree-sitter-python = "0.20.2"
 tree-sitter-toml = { git = "https://github.com/tree-sitter/tree-sitter-toml", rev = "342d9be207c2dba869b9967124c679b5e6fd0ebe" }

crates/zed/Cargo.toml 🔗

@@ -127,6 +127,7 @@ tree-sitter-heex.workspace = true
 tree-sitter-json.workspace = true
 tree-sitter-rust.workspace = true
 tree-sitter-markdown.workspace = true
+tree-sitter-proto.workspace = true
 tree-sitter-python.workspace = true
 tree-sitter-toml.workspace = true
 tree-sitter-typescript.workspace = true

crates/zed/src/languages.rs 🔗

@@ -295,6 +295,7 @@ pub fn init(
         tree_sitter_uiua::language(),
         vec![Arc::new(uiua::UiuaLanguageServer {})],
     );
+    language("proto", tree_sitter_proto::language(), vec![]);
 
     if let Ok(children) = std::fs::read_dir(&*PLUGINS_DIR) {
         for child in children {

crates/zed/src/languages/proto/config.toml 🔗

@@ -0,0 +1,12 @@
+name = "proto"
+path_suffixes = ["proto"]
+line_comments = ["// "]
+autoclose_before = ";:.,=}])>"
+brackets = [
+    { start = "{", end = "}", close = true, newline = true },
+    { start = "[", end = "]", close = true, newline = true },
+    { start = "(", end = ")", close = true, newline = true },
+    { start = "\"", end = "\"", close = true, newline = false, not_in = ["comment", "string"] },
+    { start = "'", end = "'", close = true, newline = false, not_in = ["comment", "string"] },
+    { start = "/*", end = " */", close = true, newline = false, not_in = ["comment", "string"] },
+]

crates/zed/src/languages/proto/highlights.scm 🔗

@@ -0,0 +1,61 @@
+[
+  "syntax"
+  "package"
+  "option"
+  "optional"
+  "import"
+  "service"
+  "rpc"
+  "returns"
+  "message"
+  "enum"
+  "oneof"
+  "repeated"
+  "reserved"
+  "to"
+] @keyword
+
+[
+  (key_type)
+  (type)
+  (message_name)
+  (enum_name)
+  (service_name)
+  (rpc_name)
+  (message_or_enum_type)
+] @type
+
+(enum_field
+  (identifier) @constant)
+
+[
+  (string)
+  "\"proto3\""
+] @string
+
+(int_lit) @number
+
+[
+  (true)
+  (false)
+] @boolean
+
+(comment) @comment
+
+[
+  "("
+  ")"
+  "["
+  "]"
+  "{"
+  "}"
+  "<"
+  ">"
+]  @punctuation.bracket
+
+[
+ ";"
+ ","
+] @punctuation.delimiter
+
+"=" @operator

crates/zed/src/languages/proto/outline.scm 🔗

@@ -0,0 +1,19 @@
+(message
+    "message" @context
+    (message_name
+        (identifier) @name)) @item
+
+(service
+    "service" @context
+    (service_name
+        (identifier) @name)) @item
+
+(rpc
+    "rpc" @context
+    (rpc_name
+        (identifier) @name)) @item
+
+(enum
+    "enum" @context
+    (enum_name
+        (identifier) @name)) @item

docs/src/languages/proto.md 🔗

@@ -0,0 +1,4 @@
+# Proto
+
+- Tree-Sitter: [tree-sitter-proto](https://github.com/rewinfrey/tree-sitter-proto)
+- Language-Server: N/A