pub trait LanguageAdapter: Send + Sync {
Show 43 methods
// Required methods
fn language(&self) -> Language;
fn count_panic_calls(&self, file: &ParsedFile) -> usize;
fn extract_functions(&self, file: &ParsedFile) -> Vec<FunctionNode>;
fn max_nesting_depth(&self, file: &ParsedFile) -> usize;
fn count_naming_violations(&self, file: &ParsedFile) -> usize;
fn count_deeply_nested_blocks(&self, file: &ParsedFile) -> usize;
fn count_debug_calls(&self, file: &ParsedFile) -> usize;
fn count_excessive_params(
&self,
file: &ParsedFile,
threshold: usize,
) -> usize;
// Provided methods
fn count_unsafe_blocks(&self, file: &ParsedFile) -> usize { ... }
fn count_magic_numbers(&self, file: &ParsedFile) -> usize { ... }
fn count_goroutine_spawns(&self, file: &ParsedFile) -> usize { ... }
fn count_defer_in_loop(&self, file: &ParsedFile) -> usize { ... }
fn count_go_convention_violations(&self, file: &ParsedFile) -> usize { ... }
fn count_python_issues(&self, file: &ParsedFile) -> usize { ... }
fn count_java_issues(&self, file: &ParsedFile) -> usize { ... }
fn count_ruby_issues(&self, file: &ParsedFile) -> usize { ... }
fn count_c_issues(&self, file: &ParsedFile) -> usize { ... }
fn count_ts_issues(&self, file: &ParsedFile) -> usize { ... }
fn count_js_issues(&self, file: &ParsedFile) -> usize { ... }
fn count_swift_issues(&self, file: &ParsedFile) -> usize { ... }
fn count_dead_code(&self, file: &ParsedFile) -> usize { ... }
fn count_duplicate_imports(&self, file: &ParsedFile) -> usize { ... }
fn count_commented_out_code(&self, file: &ParsedFile) -> usize { ... }
fn count_todo_markers(&self, file: &ParsedFile) -> usize { ... }
fn query_patterns(&self) -> &[&str] { ... }
fn batch_captures<'a>(
&self,
file: &'a ParsedFile,
) -> Vec<Vec<QueryCapture<'a>>> { ... }
fn compute_all(&self, file: &ParsedFile) -> AdapterCounts { ... }
fn extract_functions_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> Vec<FunctionNode> { ... }
fn count_panic_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_naming_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_debug_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_excessive_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_unsafe_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_magic_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_goroutine_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_go_convention_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_python_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_java_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_ruby_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_c_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_ts_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_js_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
fn count_swift_from_batch<'a>(
&self,
file: &ParsedFile,
_batch: &[Vec<QueryCapture<'a>>],
) -> usize { ... }
}Expand description
LanguageAdapter provides language-specific semantic extraction.
Each supported language has an adapter implementation that knows the tree-sitter query patterns for that language. SignalDetectors use these methods instead of writing per-language queries.
Required Methods§
fn language(&self) -> Language
fn count_panic_calls(&self, file: &ParsedFile) -> usize
fn extract_functions(&self, file: &ParsedFile) -> Vec<FunctionNode>
fn max_nesting_depth(&self, file: &ParsedFile) -> usize
fn count_naming_violations(&self, file: &ParsedFile) -> usize
fn count_deeply_nested_blocks(&self, file: &ParsedFile) -> usize
fn count_debug_calls(&self, file: &ParsedFile) -> usize
fn count_excessive_params(&self, file: &ParsedFile, threshold: usize) -> usize
Provided Methods§
fn count_unsafe_blocks(&self, file: &ParsedFile) -> usize
fn count_magic_numbers(&self, file: &ParsedFile) -> usize
Sourcefn count_goroutine_spawns(&self, file: &ParsedFile) -> usize
fn count_goroutine_spawns(&self, file: &ParsedFile) -> usize
Count goroutine spawns (Go-specific).
Sourcefn count_defer_in_loop(&self, file: &ParsedFile) -> usize
fn count_defer_in_loop(&self, file: &ParsedFile) -> usize
Count defer statements inside for loops (Go-specific).
Sourcefn count_go_convention_violations(&self, file: &ParsedFile) -> usize
fn count_go_convention_violations(&self, file: &ParsedFile) -> usize
Count Go convention violations: uppercase error strings, context.Context not first param, if-else with return.
Sourcefn count_python_issues(&self, file: &ParsedFile) -> usize
fn count_python_issues(&self, file: &ParsedFile) -> usize
Count Python-specific code issues: wildcard imports, redundant bool comparisons, identity comparison violations, type:ignore comments, legacy string formatting, custom dunder methods, import order.
Sourcefn count_java_issues(&self, file: &ParsedFile) -> usize
fn count_java_issues(&self, file: &ParsedFile) -> usize
Count Java-specific code issues: empty catch, missing javadoc, try-finally close, string concat in loop, wildcard imports.
Sourcefn count_ruby_issues(&self, file: &ParsedFile) -> usize
fn count_ruby_issues(&self, file: &ParsedFile) -> usize
Count Ruby-specific code issues: global variables, bare rescue, missing frozen_string_literal, negated if, predicate naming, indent.
Sourcefn count_c_issues(&self, file: &ParsedFile) -> usize
fn count_c_issues(&self, file: &ParsedFile) -> usize
Count C/C++ code issues: goto, new-expression, sizeof-type, free-mismatch, malloc-check.
Sourcefn count_ts_issues(&self, file: &ParsedFile) -> usize
fn count_ts_issues(&self, file: &ParsedFile) -> usize
Count TypeScript code issues: any-type, prefer-interface, no-enum.
Sourcefn count_js_issues(&self, file: &ParsedFile) -> usize
fn count_js_issues(&self, file: &ParsedFile) -> usize
Count JavaScript code issues: eval, with, ==/var, alert.
Sourcefn count_swift_issues(&self, file: &ParsedFile) -> usize
fn count_swift_issues(&self, file: &ParsedFile) -> usize
Count Swift code issues: force-unwrap, try!, implicitly unwrapped optionals.
Sourcefn count_dead_code(&self, file: &ParsedFile) -> usize
fn count_dead_code(&self, file: &ParsedFile) -> usize
Count dead code blocks — unreachable code after return/break/continue/panic.
Sourcefn count_duplicate_imports(&self, file: &ParsedFile) -> usize
fn count_duplicate_imports(&self, file: &ParsedFile) -> usize
Count duplicate import statements in a file (language-specific).
Sourcefn count_commented_out_code(&self, file: &ParsedFile) -> usize
fn count_commented_out_code(&self, file: &ParsedFile) -> usize
Count commented-out code blocks in the file. Default implementation uses content-based detection.
Sourcefn count_todo_markers(&self, file: &ParsedFile) -> usize
fn count_todo_markers(&self, file: &ParsedFile) -> usize
Count TODO/FIXME/BUG/HACK markers in comments. Default implementation uses content-based detection.
Sourcefn query_patterns(&self) -> &[&str]
fn query_patterns(&self) -> &[&str]
Return merged tree-sitter query patterns for this language.
Each pattern must use prefixed capture names (e.g. @pc_method)
to avoid collisions across patterns. Override in each adapter.
Sourcefn batch_captures<'a>(&self, file: &'a ParsedFile) -> Vec<Vec<QueryCapture<'a>>>
fn batch_captures<'a>(&self, file: &'a ParsedFile) -> Vec<Vec<QueryCapture<'a>>>
Run all query patterns in a single cursor traversal.
Default implementation calls collect_captures_multi with
the patterns from query_patterns().
Sourcefn compute_all(&self, file: &ParsedFile) -> AdapterCounts
fn compute_all(&self, file: &ParsedFile) -> AdapterCounts
Compute all adapter counts in a single batch pass.
This is the main entry point for StyleIr::from_parsed().
It calls batch_captures() once and passes the result to
_from_batch helper methods, avoiding redundant traversals.