From e3aba219818ee7335e080aac33e03572dd95055c Mon Sep 17 00:00:00 2001 From: Dan Johnson Date: Wed, 13 May 2026 09:57:36 -0500 Subject: [PATCH] feat(highlight): add Java highlighting support --- Cargo.lock | 11 +++++++++++ Cargo.toml | 1 + src/command/diff/highlight/config.rs | 11 +++++++++++ src/command/diff/highlight/mod.rs | 17 +++++++++++++++++ 4 files changed, 40 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 7aacde39..d33eafd5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2577,6 +2577,7 @@ dependencies = [ "tree-sitter-go", "tree-sitter-highlight", "tree-sitter-html", + "tree-sitter-java", "tree-sitter-javascript", "tree-sitter-json", "tree-sitter-md", @@ -4247,6 +4248,16 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-java" +version = "0.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa6cbcdc8c679b214e616fd3300da67da0e492e066df01bcf5a5921a71e90d6" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "tree-sitter-javascript" version = "0.23.1" diff --git a/Cargo.toml b/Cargo.toml index 3f5e9507..1929d725 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,6 +42,7 @@ tree-sitter-md = "0.3" tree-sitter-c-sharp = "0.23" tree-sitter-ruby = "0.23" tree-sitter-elixir = "0.3" +tree-sitter-java = "0.23" once_cell = "1.20" arboard = "3.4" tui-textarea = "0.7" diff --git a/src/command/diff/highlight/config.rs b/src/command/diff/highlight/config.rs index db6b15ae..c46ac334 100644 --- a/src/command/diff/highlight/config.rs +++ b/src/command/diff/highlight/config.rs @@ -6,6 +6,9 @@ use super::queries::*; // Elixir uses the bundled highlight queries from tree-sitter-elixir const ELIXIR_HIGHLIGHTS: &str = tree_sitter_elixir::HIGHLIGHTS_QUERY; +// Java uses the bundled highlight queries from tree-sitter-java +const JAVA_HIGHLIGHTS: &str = tree_sitter_java::HIGHLIGHTS_QUERY; + pub const HIGHLIGHT_NAMES: &[&str] = &[ "attribute", "comment", @@ -214,5 +217,13 @@ pub static CONFIGS: Lazy> = Lazy::new(|| { &mut configs, ); + load_config( + tree_sitter_java::LANGUAGE.into(), + "java", + JAVA_HIGHLIGHTS, + "java", + &mut configs, + ); + configs }); diff --git a/src/command/diff/highlight/mod.rs b/src/command/diff/highlight/mod.rs index 0a33b05c..97d3e5f6 100644 --- a/src/command/diff/highlight/mod.rs +++ b/src/command/diff/highlight/mod.rs @@ -238,6 +238,7 @@ mod tests { assert!(extensions.contains(&"json"), "JSON config should be loaded"); assert!(extensions.contains(&"ex"), "Elixir config should be loaded"); assert!(extensions.contains(&"exs"), "Elixir script config should be loaded"); + assert!(extensions.contains(&"java"), "Java config should be loaded"); } #[test] @@ -302,6 +303,22 @@ end assert!(has_highlights, "Elixir code should have syntax highlights"); } + #[test] + fn test_java_highlighting() { + let code = r#"package com.example; + +public class Hello { + public static void main(String[] args) { + System.out.println("Hello, Java!"); + } +} +"#; + let result = highlight_code(code, "test.java"); + assert!(!result.is_empty(), "Java highlighting should produce output"); + let has_highlights = result.iter().any(|(_, h)| h.is_some()); + assert!(has_highlights, "Java code should have syntax highlights"); + } + #[test] fn test_rust_comment_highlighting() { use config::HIGHLIGHT_NAMES;