diff --git a/ast/src/lang/queries/java.rs b/ast/src/lang/queries/java.rs index c985b7f0d..668c2b36b 100644 --- a/ast/src/lang/queries/java.rs +++ b/ast/src/lang/queries/java.rs @@ -125,6 +125,9 @@ impl Stack for Java { ) )? )@{CLASS_DEFINITION} + (enum_declaration + name: (identifier)@{CLASS_NAME} + )@{CLASS_DEFINITION} "# ) } @@ -410,6 +413,9 @@ impl Stack for Java { (record_declaration name: (identifier) @{STRUCT_NAME} ) @{STRUCT} + (enum_declaration + name: (identifier) @{STRUCT_NAME} + ) @{STRUCT} (class_declaration (modifiers) @modifier (#match? @modifier ".final$") name: (identifier) @{STRUCT_NAME} diff --git a/ast/src/testing/coverage/java.rs b/ast/src/testing/coverage/java.rs index 7c6ee159c..0a2ceb64f 100644 --- a/ast/src/testing/coverage/java.rs +++ b/ast/src/testing/coverage/java.rs @@ -83,10 +83,10 @@ async fn test_btreemap_graph_structure() -> Result<()> { assert_eq!(e2e_tests.len(), 0); let classes = graph.find_nodes_by_type(NodeType::Class); - assert_eq!(classes.len(), 20); + assert_eq!(classes.len(), 23); let data_models = graph.find_nodes_by_type(NodeType::DataModel); - assert_eq!(data_models.len(), 2); + assert_eq!(data_models.len(), 5); let traits = graph.find_nodes_by_type(NodeType::Trait); assert_eq!(traits.len(), 2); @@ -111,7 +111,7 @@ async fn test_btreemap_test_to_function_edges() -> Result<()> { assert_eq!(calls_edges, 35); let contains_edges = graph.count_edges_of_type(EdgeType::Contains); - assert_eq!(contains_edges, 252); + assert_eq!(contains_edges, 260); let handler_edges = graph.count_edges_of_type(EdgeType::Handler); assert_eq!(handler_edges, 11); diff --git a/ast/src/testing/java/src/main/java/graph/stakgraph/java/nonweb/DomainTypes.java b/ast/src/testing/java/src/main/java/graph/stakgraph/java/nonweb/DomainTypes.java index 34d7055f3..1a7732ca8 100644 --- a/ast/src/testing/java/src/main/java/graph/stakgraph/java/nonweb/DomainTypes.java +++ b/ast/src/testing/java/src/main/java/graph/stakgraph/java/nonweb/DomainTypes.java @@ -4,6 +4,8 @@ public record InvoiceRecord(String id, long amount) { } +// @ast node: Class "BillingStatus" +// @ast node: DataModel "BillingStatus" enum BillingStatus { PENDING, PAID, diff --git a/ast/src/testing/java/src/main/java/graph/stakgraph/java/nonweb/Enums.java b/ast/src/testing/java/src/main/java/graph/stakgraph/java/nonweb/Enums.java new file mode 100644 index 000000000..183332149 --- /dev/null +++ b/ast/src/testing/java/src/main/java/graph/stakgraph/java/nonweb/Enums.java @@ -0,0 +1,23 @@ +package graph.stakgraph.java.nonweb; + +// Enum types must be captured as BOTH a Class and a DataModel (mirroring how +// records and Rust enums are handled). Covers package-private and public enums. + +// package-private enum +// @ast node: Class "Suit" +// @ast node: DataModel "Suit" +enum Suit { + HEARTS, + DIAMONDS, + CLUBS, + SPADES +} + +// public enum +// @ast node: Class "Priority" +// @ast node: DataModel "Priority" +public enum Priority { + LOW, + MEDIUM, + HIGH +} diff --git a/cli/tests/cli/java.rs b/cli/tests/cli/java.rs index 23b5086a1..3192e650e 100644 --- a/cli/tests/cli/java.rs +++ b/cli/tests/cli/java.rs @@ -41,7 +41,7 @@ fn parse_stats_java_dir() { assert_eq!(out.exit_code, 0, "stderr: {}", out.stderr); assert!(out.stdout.contains("Class 15"), "stdout: {}", out.stdout); - assert!(out.stdout.contains("Import 18"), "stdout: {}", out.stdout); + assert!(out.stdout.contains("Import 19"), "stdout: {}", out.stdout); } // ── search ────────────────────────────────────────────────────────────────────