Skip to content

Commit dd0ffdf

Browse files
committed
feat(scanner): tier-3 type inheritance for Java, C#, Kotlin, Scala, Swift, Ruby
Promotes six languages from catalog plugins (line-based tier 1) to first-class built-ins (full AST tier 3) by adding their tree-sitter grammars and wiring functions, imports, calls, and type heritage extraction. - Cargo.toml: tree-sitter-java, -c-sharp, -kotlin-ng (compatible with tree-sitter 0.26), -scala, -swift, -ruby - facts.rs: extend Language enum + extension matching for .java, .cs, .kt/.kts, .scala/.sc, .swift, .rb - scanner.rs: per-language match arms in extract_functions, extract_imports, extract_calls, extract_tree_sitter_types; recognize each grammar's class-like nodes (interface_declaration, enum_declaration, record_declaration, object_declaration, trait_definition, protocol_declaration, class, module) and pull heritage from the right field/node names per grammar - collect_type_identifiers handles Ruby `constant`, scoped names, and Swift's `inheritance_specifier` direct children - Generic JVM-style import fallback for Java/Kotlin/Scala/Swift, a using-form for C#, and a require/load-form for Ruby - 7 new heritage tests cover all 6 languages plus C++ Tier-3 coverage: Python, TypeScript, C++, Java, C#, Kotlin, Scala, Swift, Ruby (9). Rust and C stay at tier 2 by design - Rust uses traits, C has no class system.
1 parent eb2f434 commit dd0ffdf

5 files changed

Lines changed: 387 additions & 32 deletions

File tree

Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,16 @@ tokio-stream = { version = "0.1", features = ["sync"] }
6969
toml = "1.1.2"
7070
tree-sitter = "0.26.8"
7171
tree-sitter-c = "0.24.2"
72+
tree-sitter-c-sharp = "0.23.5"
7273
tree-sitter-cpp = "0.23.4"
74+
tree-sitter-java = "0.23.5"
75+
tree-sitter-kotlin-ng = "1.1.0"
7376
tree-sitter-language = "0.1"
7477
tree-sitter-python = "0.25.0"
78+
tree-sitter-ruby = "0.23.1"
7579
tree-sitter-rust = "0.24.2"
80+
tree-sitter-scala = "0.26.0"
81+
tree-sitter-swift = "0.7.1"
7682
tree-sitter-typescript = "0.23.2"
7783

7884
# build.rs uses only std + git/make subprocesses; no build-deps.

README.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,13 @@ independent baselines, zero cross-project bleed.
114114
- **Evolution signal** - bus factor per file, change-coupling pairs,
115115
temporal hotspots (churn x complexity), file age windows, and
116116
bug-fix concentration over the last 500 commits
117-
- **68 language profiles out of the box** - Rust, Python, TypeScript,
118-
C, C++ via tree-sitter; 63 more standard profiles (Go, Java,
119-
Kotlin, Swift, Ruby, Elixir, Haskell, Clojure, Zig, GLSL,
120-
Terraform, Dockerfile, ...) via configurable plugins. Add your own
121-
in `.raysense/plugins/`.
117+
- **68 language profiles out of the box** - 11 languages with full
118+
AST analysis (Python, TypeScript, C++, Java, C#, Kotlin, Scala,
119+
Swift, Ruby get type inheritance on top; Rust and C stop at
120+
complexity since their type models don't fit the inheritance
121+
graph). 57 more standard profiles (Go, Elixir, Haskell, Clojure,
122+
Zig, GLSL, Terraform, Dockerfile, ...) via configurable plugins.
123+
Add your own in `.raysense/plugins/`.
122124

123125
## Built on Rayforce
124126

site/index.html

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ <h3>68 languages out of the box</h3>
318318
<div class="section-eyebrow">LANGUAGE COVERAGE</div>
319319
<h2>68 languages, three tiers of analysis depth.</h2>
320320
<p class="section-lead">
321-
Tree-sitter built-ins get the full pipeline: function bodies parsed, cyclomatic and cognitive complexity, type inheritance (Python and TypeScript), and call graphs. The catalog plugins extract functions and imports via configurable prefix patterns, no AST. Every other metric on this page (edit-risk, score drift, bug-density, evolution, blast radius) works at every tier.
321+
Tree-sitter built-ins get the full pipeline: function bodies parsed, cyclomatic and cognitive complexity, type inheritance (9 languages: Python, TypeScript, C++, Java, C#, Kotlin, Scala, Swift, Ruby), and call graphs. The catalog plugins extract functions and imports via configurable prefix patterns, no AST. Every other metric on this page (edit-risk, score drift, bug-density, evolution, blast radius) works at every tier.
322322
</p>
323323

324324
<div class="lang-legend">
@@ -330,8 +330,8 @@ <h2>68 languages, three tiers of analysis depth.</h2>
330330
<div class="lang-grid">
331331
<div class="lang-cell lang-tier-1"><span class="lang-name">Assembly</span></div>
332332
<div class="lang-cell lang-tier-2"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/c/c-original.svg" onerror="this.remove()"><span class="lang-name">C</span></div>
333-
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/csharp/csharp-plain.svg" onerror="this.remove()"><span class="lang-name">C#</span></div>
334-
<div class="lang-cell lang-tier-2"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/cplusplus/cplusplus-plain.svg" onerror="this.remove()"><span class="lang-name">C++</span></div>
333+
<div class="lang-cell lang-tier-3"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/csharp/csharp-plain.svg" onerror="this.remove()"><span class="lang-name">C#</span></div>
334+
<div class="lang-cell lang-tier-3"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/cplusplus/cplusplus-plain.svg" onerror="this.remove()"><span class="lang-name">C++</span></div>
335335
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/clojure/clojure-plain.svg" onerror="this.remove()"><span class="lang-name">Clojure</span></div>
336336
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/cmake/cmake-plain.svg" onerror="this.remove()"><span class="lang-name">CMake</span></div>
337337
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/cobol/cobol-original.svg" onerror="this.remove()"><span class="lang-name">COBOL</span></div>
@@ -355,11 +355,11 @@ <h2>68 languages, three tiers of analysis depth.</h2>
355355
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/haskell/haskell-plain.svg" onerror="this.remove()"><span class="lang-name">Haskell</span></div>
356356
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/terraform/terraform-plain.svg" onerror="this.remove()"><span class="lang-name">HCL</span></div>
357357
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/html5/html5-plain.svg" onerror="this.remove()"><span class="lang-name">HTML</span></div>
358-
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/java/java-plain.svg" onerror="this.remove()"><span class="lang-name">Java</span></div>
358+
<div class="lang-cell lang-tier-3"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/java/java-plain.svg" onerror="this.remove()"><span class="lang-name">Java</span></div>
359359
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/json/json-plain.svg" onerror="this.remove()"><span class="lang-name">JSON</span></div>
360360
<div class="lang-cell lang-tier-1"><span class="lang-name">Jsonnet</span></div>
361361
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/julia/julia-plain.svg" onerror="this.remove()"><span class="lang-name">Julia</span></div>
362-
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/kotlin/kotlin-plain.svg" onerror="this.remove()"><span class="lang-name">Kotlin</span></div>
362+
<div class="lang-cell lang-tier-3"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/kotlin/kotlin-plain.svg" onerror="this.remove()"><span class="lang-name">Kotlin</span></div>
363363
<div class="lang-cell lang-tier-1"><span class="lang-name">Lisp</span></div>
364364
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/lua/lua-plain.svg" onerror="this.remove()"><span class="lang-name">Lua</span></div>
365365
<div class="lang-cell lang-tier-1"><span class="lang-name">Make</span></div>
@@ -376,15 +376,15 @@ <h2>68 languages, three tiers of analysis depth.</h2>
376376
<div class="lang-cell lang-tier-3"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/python/python-plain.svg" onerror="this.remove()"><span class="lang-name">Python</span></div>
377377
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/r/r-plain.svg" onerror="this.remove()"><span class="lang-name">R</span></div>
378378
<div class="lang-cell lang-tier-1"><span class="lang-name">ReScript</span></div>
379-
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/ruby/ruby-plain.svg" onerror="this.remove()"><span class="lang-name">Ruby</span></div>
379+
<div class="lang-cell lang-tier-3"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/ruby/ruby-plain.svg" onerror="this.remove()"><span class="lang-name">Ruby</span></div>
380380
<div class="lang-cell lang-tier-2"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/rust/rust-original.svg" onerror="this.remove()"><span class="lang-name">Rust</span></div>
381-
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/scala/scala-plain.svg" onerror="this.remove()"><span class="lang-name">Scala</span></div>
381+
<div class="lang-cell lang-tier-3"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/scala/scala-plain.svg" onerror="this.remove()"><span class="lang-name">Scala</span></div>
382382
<div class="lang-cell lang-tier-1"><span class="lang-name">Scheme</span></div>
383383
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/bash/bash-plain.svg" onerror="this.remove()"><span class="lang-name">Shell</span></div>
384384
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/solidity/solidity-plain.svg" onerror="this.remove()"><span class="lang-name">Solidity</span></div>
385385
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/mysql/mysql-original.svg" onerror="this.remove()"><span class="lang-name">SQL</span></div>
386386
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/svelte/svelte-plain.svg" onerror="this.remove()"><span class="lang-name">Svelte</span></div>
387-
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/swift/swift-plain.svg" onerror="this.remove()"><span class="lang-name">Swift</span></div>
387+
<div class="lang-cell lang-tier-3"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/swift/swift-plain.svg" onerror="this.remove()"><span class="lang-name">Swift</span></div>
388388
<div class="lang-cell lang-tier-1"><img class="lang-icon" loading="lazy" alt="" src="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.17.0/icons/terraform/terraform-plain.svg" onerror="this.remove()"><span class="lang-name">Terraform</span></div>
389389
<div class="lang-cell lang-tier-1"><span class="lang-name">Thrift</span></div>
390390
<div class="lang-cell lang-tier-1"><span class="lang-name">TOML</span></div>

src/facts.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,14 @@ use std::path::PathBuf;
2828
pub enum Language {
2929
C,
3030
Cpp,
31+
CSharp,
32+
Java,
33+
Kotlin,
3134
Python,
35+
Ruby,
3236
Rust,
37+
Scala,
38+
Swift,
3339
TypeScript,
3440
Unknown,
3541
}
@@ -41,8 +47,14 @@ impl Language {
4147
Some("cc") | Some("cpp") | Some("cxx") | Some("hh") | Some("hpp") | Some("hxx") => {
4248
Self::Cpp
4349
}
50+
Some("cs") => Self::CSharp,
51+
Some("java") => Self::Java,
52+
Some("kt") | Some("kts") => Self::Kotlin,
4453
Some("py") => Self::Python,
54+
Some("rb") => Self::Ruby,
4555
Some("rs") => Self::Rust,
56+
Some("scala") | Some("sc") => Self::Scala,
57+
Some("swift") => Self::Swift,
4658
Some("ts") | Some("tsx") | Some("js") | Some("jsx") => Self::TypeScript,
4759
_ => Self::Unknown,
4860
}

0 commit comments

Comments
 (0)