impl Language {
fn to_index(self) -> usize {
self as usize
}
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn extensions(&self) -> &'static [&'static str] {
LANGUAGE_INFO[(*self).to_index()].extensions
}
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn name(&self) -> &'static str {
LANGUAGE_INFO[(*self).to_index()].name
}
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn from_extension(ext: &str) -> Self {
let ext = ext.to_lowercase();
for &lang in &[
Language::Rust,
Language::C,
Language::Cpp,
Language::Go,
Language::Zig,
Language::Java,
Language::Kotlin,
Language::Scala,
Language::Groovy,
Language::Clojure,
Language::CSharp,
Language::FSharp,
Language::VisualBasic,
Language::Python,
Language::JavaScript,
Language::TypeScript,
Language::Ruby,
Language::PHP,
Language::Perl,
Language::Lua,
Language::Haskell,
Language::Elixir,
Language::Erlang,
Language::OCaml,
Language::ReasonML,
Language::Elm,
Language::PureScript,
Language::Lean,
Language::Swift,
Language::ObjectiveC,
Language::Dart,
Language::Bash,
Language::Zsh,
Language::Fish,
Language::PowerShell,
Language::SQL,
Language::HCL,
Language::YAML,
Language::TOML,
Language::JSON,
Language::XML,
Language::Markdown,
Language::LaTeX,
Language::AsciiDoc,
Language::Makefile,
Language::CMake,
Language::Bazel,
Language::Gradle,
Language::Maven,
Language::Solidity,
Language::VHDL,
Language::Verilog,
Language::R,
Language::Julia,
Language::Matlab,
Language::Assembly,
Language::PTX,
] {
if lang.extensions().contains(&ext.as_str()) {
return lang;
}
}
Language::Unknown
}
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "path_exists")]
pub fn from_path(path: &Path) -> Self {
if let Some(filename) = path.file_name().and_then(|n| n.to_str()) {
match filename.to_lowercase().as_str() {
"makefile" | "gnumakefile" => return Language::Makefile,
"dockerfile" | "dockerfile.dev" => return Language::Bash, "rakefile" => return Language::Ruby,
"gemfile" | "gemfile.lock" => return Language::Ruby,
"cargo.toml" | "cargo.lock" => return Language::TOML,
"package.json" | "package-lock.json" => return Language::JSON,
"tsconfig.json" => return Language::JSON,
"build.gradle" | "settings.gradle" => return Language::Gradle,
"pom.xml" => return Language::Maven,
"requirements.txt" | "setup.py" | "pyproject.toml" => return Language::Python,
"lakefile.lean" | "lean-toolchain" => return Language::Lean,
_ => {}
}
}
if let Some(ext) = path.extension().and_then(|e| e.to_str()) {
Self::from_extension(ext)
} else {
Language::Unknown
}
}
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn has_ast_support(&self) -> bool {
match self {
Language::Rust
| Language::TypeScript
| Language::JavaScript
| Language::Python
| Language::C
| Language::Cpp
| Language::Kotlin
| Language::Makefile => true,
Language::Go
| Language::Java
| Language::CSharp
| Language::Swift
| Language::Ruby
| Language::PHP
| Language::Bash
| Language::SQL
| Language::Lua
| Language::Lean => true,
Language::JSON
| Language::YAML
| Language::TOML
| Language::XML
| Language::Markdown => true,
_ => false,
}
}
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn supports_complexity(&self) -> bool {
match self {
Language::Rust
| Language::C
| Language::Cpp
| Language::Go
| Language::Zig
| Language::Java
| Language::Kotlin
| Language::Scala
| Language::Groovy
| Language::CSharp
| Language::FSharp
| Language::Python
| Language::JavaScript
| Language::TypeScript
| Language::Ruby
| Language::PHP
| Language::Perl
| Language::Haskell
| Language::Elixir
| Language::Swift
| Language::ObjectiveC
| Language::Dart
| Language::Bash
| Language::PowerShell
| Language::R
| Language::Julia
| Language::Matlab
| Language::Lua
| Language::Lean => true,
_ => false,
}
}
}