pub trait LanguagePlugin {
// Required methods
fn name(&self) -> &str;
fn detect(&self, workspace: &Path, input: &PluginInput) -> bool;
fn levels(&self) -> Vec<Level>;
fn analyze(
&self,
workspace: &Path,
level: &str,
input: &PluginInput,
) -> Result<Graph>;
// Provided methods
fn metrics(&self, _graph: &mut Graph) -> usize { ... }
fn is_test_path(&self, _rel_path: &str) -> bool { ... }
fn versions(
&self,
_workspace: &Path,
_input: &PluginInput,
) -> Vec<(String, String)> { ... }
fn roots(&self, _workspace: &Path) -> Vec<(String, String)> { ... }
fn presets(
&self,
defaults: Vec<Preset>,
_input: &PluginInput,
) -> Vec<Preset> { ... }
fn metric_specs(
&self,
defaults: BTreeMap<String, AttributeSpec>,
) -> BTreeMap<String, AttributeSpec> { ... }
fn thresholds(&self) -> BTreeMap<String, Thresholds> { ... }
}Required Methods§
Sourcefn name(&self) -> &str
fn name(&self) -> &str
Canonical name, e.g. "rust". Used by --plugin and recorded in the
snapshot. Each plugin has exactly one name (js and ts are separate).
Sourcefn detect(&self, workspace: &Path, input: &PluginInput) -> bool
fn detect(&self, workspace: &Path, input: &PluginInput) -> bool
Can this plugin parse workspace (honoring input)?
Sourcefn levels(&self) -> Vec<Level>
fn levels(&self) -> Vec<Level>
Levels this plugin can produce, each carrying its edge-kind / attribute / node-kind / cycle-kind semantics.
Sourcefn analyze(
&self,
workspace: &Path,
level: &str,
input: &PluginInput,
) -> Result<Graph>
fn analyze( &self, workspace: &Path, level: &str, input: &PluginInput, ) -> Result<Graph>
Parse the workspace into a graph AT level (by name). Structure only:
nodes (with their structural attributes) + edges. Metrics are added
downstream. When input.ignore_tests is set, the plugin must drop its
own test files here (it knows the language’s conventions; see
is_test_path).
Provided Methods§
Sourcefn metrics(&self, _graph: &mut Graph) -> usize
fn metrics(&self, _graph: &mut Graph) -> usize
Write this language’s per-file complexity metrics (cyclomatic, cognitive,
Halstead, MI, LOC, …) onto the graph’s file nodes, in place. The plugin
parses each of its own files (by node.id, an absolute path) with its own
grammar and calls the matching code-ranker-complexity engine. Returns the
number of file nodes annotated. Default: none (a plugin that ships no
metric engine).
Sourcefn is_test_path(&self, _rel_path: &str) -> bool
fn is_test_path(&self, _rel_path: &str) -> bool
Does this workspace-relative path (forward-slashed, no leading ./) name
a test file in this language? Used to drop tests during the walk when
PluginInput::ignore_tests is set. Default: nothing is a test.
Sourcefn versions(
&self,
_workspace: &Path,
_input: &PluginInput,
) -> Vec<(String, String)>
fn versions( &self, _workspace: &Path, _input: &PluginInput, ) -> Vec<(String, String)>
Toolchain versions to record in the snapshot, e.g. [("rustc", "1.88.0")].
Sourcefn roots(&self, _workspace: &Path) -> Vec<(String, String)>
fn roots(&self, _workspace: &Path) -> Vec<(String, String)>
Named external-path roots for this language, as (name, absolute_path)
pairs, used to shorten node ids in the snapshot (a path under a root is
rewritten to {name}/…). These are language-specific — e.g. Rust
returns cargo / registry / rustup / rust-src; a Python plugin would
return its virtualenv / site-packages; JS/TS would return node_modules.
The orchestrator always adds the generic target root itself, so a plugin
returns only its own toolchain/dependency locations. Default: none.
This keeps language/toolchain knowledge inside the plugin instead of the
language-agnostic orchestrator (mirrors versions).
Sourcefn presets(&self, defaults: Vec<Preset>, _input: &PluginInput) -> Vec<Preset>
fn presets(&self, defaults: Vec<Preset>, _input: &PluginInput) -> Vec<Preset>
Transform the orchestrator’s generic default presets for this language.
Default: pass them through unchanged. A plugin may reword a prompt,
change a sort_metric, drop a preset, or add language-specific ones.
Sourcefn metric_specs(
&self,
defaults: BTreeMap<String, AttributeSpec>,
) -> BTreeMap<String, AttributeSpec>
fn metric_specs( &self, defaults: BTreeMap<String, AttributeSpec>, ) -> BTreeMap<String, AttributeSpec>
Transform the orchestrator’s language-neutral default complexity metric
specs (key → AttributeSpec, from code-ranker-graph’s metric_specs)
for this language. Default: pass them through unchanged. A plugin may reword
a description to add language-specific nuance (e.g. Rust noting that
sloc / lloc / cloc / blank exclude inline #[cfg(test)] items) — so
the shared catalog stays neutral and each language refines only what differs.
Sourcefn thresholds(&self) -> BTreeMap<String, Thresholds>
fn thresholds(&self) -> BTreeMap<String, Thresholds>
Language-calibrated per-metric thresholds (attribute key → tiers). The orchestrator overlays these onto the attribute specs. Default: none.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".