use crate::detection::FunctionDetectionMarkers;
pub struct ComplexityMarkers {
pub keywords: &'static [&'static str],
pub operators: &'static [&'static str],
pub function_markers: &'static [&'static str],
pub brace_scoped: bool,
pub line_comments: &'static [&'static str],
}
static RUST: ComplexityMarkers = ComplexityMarkers {
keywords: &["else if", "if", "for", "while", "loop", "match"],
operators: &["&&", "||"],
function_markers: &["fn "],
brace_scoped: true,
line_comments: &["//"],
};
static PYTHON: ComplexityMarkers = ComplexityMarkers {
keywords: &["elif", "if", "for", "while", "except", "and", "or"],
operators: &[],
function_markers: &["async def ", "def "],
brace_scoped: false,
line_comments: &["#"],
};
static JAVASCRIPT: ComplexityMarkers = ComplexityMarkers {
keywords: &[
"else if", "if", "for", "while", "do", "switch", "case", "catch",
],
operators: &["&&", "||", "??"],
function_markers: &["function "],
brace_scoped: true,
line_comments: &["//"],
};
static C_FAMILY: ComplexityMarkers = ComplexityMarkers {
keywords: &[
"else if", "if", "for", "while", "do", "switch", "case", "catch",
],
operators: &["&&", "||"],
function_markers: &[],
brace_scoped: true,
line_comments: &["//"],
};
static GO: ComplexityMarkers = ComplexityMarkers {
keywords: &["else if", "if", "for", "switch", "case", "select"],
operators: &["&&", "||"],
function_markers: &["func "],
brace_scoped: true,
line_comments: &["//"],
};
static RUBY: ComplexityMarkers = ComplexityMarkers {
keywords: &[
"elsif", "if", "unless", "for", "while", "until", "when", "rescue",
],
operators: &["&&", "||"],
function_markers: &["def "],
brace_scoped: false,
line_comments: &["#"],
};
static KOTLIN: ComplexityMarkers = ComplexityMarkers {
keywords: &["else if", "if", "for", "while", "when", "catch"],
operators: &["&&", "||"],
function_markers: &["fun "],
brace_scoped: true,
line_comments: &["//"],
};
static SWIFT: ComplexityMarkers = ComplexityMarkers {
keywords: &[
"else if", "if", "for", "while", "switch", "case", "catch", "guard",
],
operators: &["&&", "||"],
function_markers: &["func "],
brace_scoped: true,
line_comments: &["//"],
};
static SCALA: ComplexityMarkers = ComplexityMarkers {
keywords: &["else if", "if", "for", "while", "match", "case", "catch"],
operators: &["&&", "||"],
function_markers: &["def "],
brace_scoped: true,
line_comments: &["//"],
};
static SHELL: ComplexityMarkers = ComplexityMarkers {
keywords: &["elif", "if", "for", "while", "until", "case"],
operators: &["&&", "||"],
function_markers: &[],
brace_scoped: false,
line_comments: &["#"],
};
static HASKELL: ComplexityMarkers = ComplexityMarkers {
keywords: &["if", "case"],
operators: &[],
function_markers: &[],
brace_scoped: false,
line_comments: &["--"],
};
static ELIXIR: ComplexityMarkers = ComplexityMarkers {
keywords: &["if", "cond", "case", "for", "rescue"],
operators: &[],
function_markers: &["defp ", "def "],
brace_scoped: false,
line_comments: &["#"],
};
static LUA: ComplexityMarkers = ComplexityMarkers {
keywords: &["elseif", "if", "for", "while"],
operators: &[],
function_markers: &["function "],
brace_scoped: false,
line_comments: &["--"],
};
static PERL: ComplexityMarkers = ComplexityMarkers {
keywords: &["elsif", "if", "for", "foreach", "while", "unless"],
operators: &["&&", "||"],
function_markers: &["sub "],
brace_scoped: true,
line_comments: &["#"],
};
static ERLANG: ComplexityMarkers = ComplexityMarkers {
keywords: &["if", "case", "receive"],
operators: &[],
function_markers: &[],
brace_scoped: false,
line_comments: &["%"],
};
static OCAML: ComplexityMarkers = ComplexityMarkers {
keywords: &["if", "match", "with"],
operators: &[],
function_markers: &["let "],
brace_scoped: false,
line_comments: &[],
};
static R: ComplexityMarkers = ComplexityMarkers {
keywords: &["else if", "if", "for", "while", "repeat"],
operators: &["&&", "||"],
function_markers: &[],
brace_scoped: true,
line_comments: &["#"],
};
static JULIA: ComplexityMarkers = ComplexityMarkers {
keywords: &["elseif", "if", "for", "while"],
operators: &["&&", "||"],
function_markers: &["function "],
brace_scoped: false,
line_comments: &["#"],
};
static NIM: ComplexityMarkers = ComplexityMarkers {
keywords: &["elif", "if", "for", "while", "case", "except"],
operators: &[],
function_markers: &["proc ", "func "],
brace_scoped: false,
line_comments: &["#"],
};
static ZIG: ComplexityMarkers = ComplexityMarkers {
keywords: &["else", "if", "for", "while", "switch"],
operators: &[],
function_markers: &["fn "],
brace_scoped: true,
line_comments: &["//"],
};
static CLOJURE: ComplexityMarkers = ComplexityMarkers {
keywords: &["if", "cond", "case", "when"],
operators: &[],
function_markers: &["defn "],
brace_scoped: false,
line_comments: &[";"],
};
pub fn markers_for(language_name: &str) -> Option<&'static ComplexityMarkers> {
match language_name {
"Rust" => Some(&RUST),
"Python" => Some(&PYTHON),
"JavaScript" | "TypeScript" => Some(&JAVASCRIPT),
"Java" | "C#" | "C" | "C++" | "Objective-C" | "PHP" | "Dart" => Some(&C_FAMILY),
"Go" => Some(&GO),
"Ruby" => Some(&RUBY),
"Kotlin" => Some(&KOTLIN),
"Swift" => Some(&SWIFT),
"Scala" => Some(&SCALA),
"Bourne Shell" | "Bourne Again Shell" | "Zsh" => Some(&SHELL),
"Haskell" => Some(&HASKELL),
"Elixir" | "Elixir Script" => Some(&ELIXIR),
"Lua" => Some(&LUA),
"Perl" => Some(&PERL),
"Erlang" => Some(&ERLANG),
"OCaml" | "F#" => Some(&OCAML),
"R" => Some(&R),
"Julia" => Some(&JULIA),
"Nim" => Some(&NIM),
"Zig" => Some(&ZIG),
"Clojure" => Some(&CLOJURE),
_ => None,
}
}
impl FunctionDetectionMarkers for ComplexityMarkers {
fn function_markers(&self) -> &[&str] {
self.function_markers
}
fn brace_scoped(&self) -> bool {
self.brace_scoped
}
fn line_comments(&self) -> &[&str] {
self.line_comments
}
}
#[cfg(test)]
#[path = "markers_test.rs"]
mod tests;