diff --git a/Cargo.lock b/Cargo.lock index 3d9bc690..9102332d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1167,6 +1167,7 @@ version = "0.2.0" dependencies = [ "erased-serde", "lazy_static", + "maplit 0.1.6", "regex", "serde", "serde_derive", @@ -1722,6 +1723,12 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "maplit" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22593015b8df7747861c69c28acd32589fb96c1686369f3b661d12e409d4cf65" + [[package]] name = "maplit" version = "1.0.2" @@ -2080,7 +2087,7 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" dependencies = [ - "maplit", + "maplit 1.0.2", "pest", "sha-1 0.8.2", ] diff --git a/framework/Cargo.toml b/framework/Cargo.toml index 741471db..4f8e5ca8 100644 --- a/framework/Cargo.toml +++ b/framework/Cargo.toml @@ -31,3 +31,5 @@ lazy_static = "1.2" walkdir = "2" regex = "1" + +maplit="0.1.6" diff --git a/framework/src/framework_detector.rs b/framework/src/framework_detector.rs index cd5ba68f..9073265b 100644 --- a/framework/src/framework_detector.rs +++ b/framework/src/framework_detector.rs @@ -1,10 +1,10 @@ use crate::facet::{Facet, FacetsBuilder}; use crate::lang::LangDetectors; use std::cell::RefCell; -use std::collections::BTreeMap; +use std::collections::{BTreeMap, HashSet}; use std::path::Path; -#[derive(Serialize, PartialEq, Debug, Clone, Ord, PartialOrd, Eq)] +#[derive(Serialize, PartialEq, Debug, Clone)] pub struct Framework { pub name: String, pub path: String, @@ -12,9 +12,9 @@ pub struct Framework { // | languages | files | // |-------------|------------| // | Java | build.gradle, settings.gradle | - pub files: RefCell>, + pub files: RefCell>, // in JVM projects, has different languages, such as Java, Groovy, Kotlin... - pub languages: RefCell>, + pub languages: RefCell>, } #[derive(Serialize)] @@ -36,7 +36,6 @@ impl Frameworks { if !self.frameworks.borrow().contains(&framework) { self.associate_with_source_files(&framework); self.frameworks.borrow_mut().push(framework); - self.frameworks.borrow_mut().sort(); } } @@ -56,7 +55,6 @@ impl Frameworks { fn add_language_to_frameworks(&self, file_path: &str, language: &str) { for framework in self.frameworks.borrow_mut().iter() { if file_path.starts_with(&framework.path) - && !framework.languages.borrow().contains(&language.to_string()) { Frameworks::add_language_to_framework(language.to_string(), framework); } @@ -64,8 +62,7 @@ impl Frameworks { } fn add_language_to_framework(language: String, framework: &Framework) { - framework.languages.borrow_mut().push(language); - framework.languages.borrow_mut().sort(); + framework.languages.borrow_mut().insert(language); } fn cache_source_file(&self, file_path: &str, language: &str) { @@ -84,8 +81,7 @@ impl Frameworks { pub fn add_settings_file(&self, framework_name: &str, file_path: &str, file_name: &str) { for framework in self.frameworks.borrow_mut().iter() { if file_path.starts_with(&framework.path) && framework.name.eq(framework_name) { - framework.files.borrow_mut().push(file_name.to_string()); - framework.files.borrow_mut().sort(); + framework.files.borrow_mut().insert(file_name.to_string()); } } } @@ -256,23 +252,20 @@ mod tests { let files = framework.files.borrow(); let languages = framework.languages.borrow(); assert_eq!(name, "Gradle"); - assert_eq!(files.get(0).unwrap().as_str(), "build.gradle"); - assert_eq!(files.get(1).unwrap().as_str(), "settings.gradle"); - assert_eq!(languages.get(0).unwrap().as_str(), "Groovy"); - assert_eq!(languages.get(1).unwrap().as_str(), "Java"); - assert_eq!(languages.get(2).unwrap().as_str(), "Kotlin"); - assert_eq!(languages.get(3).unwrap().as_str(), "Scala"); + assert_eq!(files.contains("build.gradle"), true); + assert_eq!(files.contains("settings.gradle"), true); + assert_eq!(languages.contains("Groovy"), true); + assert_eq!(languages.contains("Java"), true); + assert_eq!(languages.contains("Kotlin"), true); + assert_eq!(languages.contains("Scala"), true); let framework = frameworks.get(1).unwrap(); let name = framework.name.to_string(); let files = framework.files.borrow(); let languages = framework.languages.borrow(); - for lang in languages.iter() { - println!("{}", lang); - } assert_eq!(name, "Maven"); - assert_eq!(files.get(0).unwrap().as_str(), "pom.xml"); - assert_eq!(languages.get(0).unwrap().as_str(), "Java"); - assert_eq!(languages.get(1).unwrap().as_str(), "Kotlin"); + assert_eq!(files.contains("pom.xml"), true); + assert_eq!(languages.contains("Java"), true); + assert_eq!(languages.contains("Kotlin"), true); } } diff --git a/framework/src/lang/jvm.rs b/framework/src/lang/jvm.rs index 5af964c0..f8f985e8 100644 --- a/framework/src/lang/jvm.rs +++ b/framework/src/lang/jvm.rs @@ -66,8 +66,8 @@ pub fn framework_analysis(entry: &DirEntry, frameworks: &Frameworks) { frameworks.add_framework(Framework { name: ident_framework_name(file_name).to_string(), path: entry.path().parent().unwrap().to_str().unwrap().to_string(), - files: RefCell::new(vec![file_name.to_string()]), - languages: RefCell::new(vec![]), + files: RefCell::new(hashset! {file_name.to_string()}), + languages: RefCell::new(hashset! {}), }); } diff --git a/framework/src/lib.rs b/framework/src/lib.rs index da1c670b..e8fa96e7 100644 --- a/framework/src/lib.rs +++ b/framework/src/lib.rs @@ -3,6 +3,9 @@ #[macro_use] extern crate lazy_static; +#[macro_use] +extern crate maplit; + #[macro_use] extern crate serde_derive; extern crate regex;