Add syntax highlighting/auto-indent/outlines for JSON files

Max Brunsfeld and Nathan Sobo created

Co-Authored-By: Nathan Sobo <nathan@zed.dev>

Change summary

Cargo.lock                               | 11 +++++++++++
crates/zed/Cargo.toml                    |  1 +
crates/zed/languages/c/brackets.scm      |  3 +++
crates/zed/languages/json/brackets.scm   |  3 +++
crates/zed/languages/json/config.toml    |  7 +++++++
crates/zed/languages/json/highlights.scm | 12 ++++++++++++
crates/zed/languages/json/indents.scm    |  2 ++
crates/zed/languages/json/outline.scm    |  2 ++
crates/zed/src/language.rs               | 17 +++++++++++++++++
9 files changed, 58 insertions(+)

Detailed changes

Cargo.lock 🔗

@@ -5326,6 +5326,16 @@ dependencies = [
  "tree-sitter",
 ]
 
+[[package]]
+name = "tree-sitter-json"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90b04c4e1a92139535eb9fca4ec8fa9666cc96b618005d3ae35f3c957fa92f92"
+dependencies = [
+ "cc",
+ "tree-sitter",
+]
+
 [[package]]
 name = "tree-sitter-markdown"
 version = "0.0.1"
@@ -5935,6 +5945,7 @@ dependencies = [
  "toml",
  "tree-sitter",
  "tree-sitter-c",
+ "tree-sitter-json",
  "tree-sitter-markdown",
  "tree-sitter-rust",
  "unindent",

crates/zed/Cargo.toml 🔗

@@ -92,6 +92,7 @@ tiny_http = "0.8"
 toml = "0.5"
 tree-sitter = "0.20.4"
 tree-sitter-c = "0.20.1"
+tree-sitter-json = "0.19.0"
 tree-sitter-rust = "0.20.1"
 tree-sitter-markdown = { git = "https://github.com/MDeiml/tree-sitter-markdown", rev = "330ecab87a3e3a7211ac69bbadc19eabecdb1cca" }
 url = "2.2"

crates/zed/languages/json/config.toml 🔗

@@ -0,0 +1,7 @@
+name = "JSON"
+path_suffixes = ["json"]
+brackets = [
+    { start = "{", end = "}", close = true, newline = true },
+    { start = "[", end = "]", close = true, newline = true },
+    { start = "\"", end = "\"", close = true, newline = false },
+]

crates/zed/src/language.rs 🔗

@@ -429,6 +429,7 @@ pub fn build_language_registry() -> LanguageRegistry {
             .join(".zed"),
     );
     languages.add(Arc::new(c()));
+    languages.add(Arc::new(json()));
     languages.add(Arc::new(rust()));
     languages.add(Arc::new(markdown()));
     languages
@@ -455,6 +456,8 @@ fn c() -> Language {
     Language::new(config, Some(grammar))
         .with_highlights_query(load_query("c/highlights.scm").as_ref())
         .unwrap()
+        .with_brackets_query(load_query("c/brackets.scm").as_ref())
+        .unwrap()
         .with_indents_query(load_query("c/indents.scm").as_ref())
         .unwrap()
         .with_outline_query(load_query("c/outline.scm").as_ref())
@@ -462,6 +465,20 @@ fn c() -> Language {
         .with_lsp_ext(CLsp)
 }
 
+fn json() -> Language {
+    let grammar = tree_sitter_json::language();
+    let config = toml::from_slice(&LanguageDir::get("json/config.toml").unwrap().data).unwrap();
+    Language::new(config, Some(grammar))
+        .with_highlights_query(load_query("json/highlights.scm").as_ref())
+        .unwrap()
+        .with_brackets_query(load_query("json/brackets.scm").as_ref())
+        .unwrap()
+        .with_indents_query(load_query("json/indents.scm").as_ref())
+        .unwrap()
+        .with_outline_query(load_query("json/outline.scm").as_ref())
+        .unwrap()
+}
+
 fn markdown() -> Language {
     let grammar = tree_sitter_markdown::language();
     let config = toml::from_slice(&LanguageDir::get("markdown/config.toml").unwrap().data).unwrap();