@@ -47,31 +47,33 @@ pub fn get_root_path<'a>(
4747 }
4848
4949 match language_id {
50- "rust" => traverse_up ( path, |dir| dir . join ( "Cargo.toml" ) . exists ( ) ) ,
51- "php" => traverse_up ( path, |dir| dir . join ( "composer.json" ) . exists ( ) ) ,
50+ "rust" => traverse_up ( path, dir_has_one ( & [ "Cargo.toml" ] ) ) ,
51+ "php" => traverse_up ( path, dir_has_one ( & [ "composer.json" ] ) ) ,
5252 "javascript" | "typescript" | "javascript.jsx" | "typescript.tsx" => {
53- traverse_up ( path, |dir| dir . join ( "package.json" ) . exists ( ) )
53+ traverse_up ( path, dir_has_one ( & [ "package.json" ] ) )
5454 }
55- "python" => traverse_up ( path, |dir| {
56- dir. join ( "setup.py" ) . exists ( )
57- || dir. join ( "Pipfile" ) . exists ( )
58- || dir. join ( "requirements.txt" ) . exists ( )
59- || dir. join ( "pyproject.toml" ) . exists ( )
60- } ) ,
61- "c" | "cpp" => traverse_up ( path, |dir| dir. join ( "compile_commands.json" ) . exists ( ) ) ,
55+ "python" => traverse_up (
56+ path,
57+ dir_has_one ( & [ "setup.py" , "Pipfile" , "requirements.txt" , "pyproject.toml" ] ) ,
58+ ) ,
59+ "c" | "cpp" => traverse_up ( path, dir_has_one ( & [ "compile_commands.json" ] ) ) ,
6260 "cs" => traverse_up ( path, is_dotnet_root) ,
63- "java" => traverse_up ( path, |dir| {
64- dir. join ( ".project" ) . exists ( )
65- || dir. join ( "pom.xml" ) . exists ( )
66- || dir. join ( "build.gradle" ) . exists ( )
67- } ) ,
68- "scala" => traverse_up ( path, |dir| dir. join ( "build.sbt" ) . exists ( ) ) ,
69- "haskell" => traverse_up ( path, |dir| dir. join ( "stack.yaml" ) . exists ( ) ) . or_else ( |_| {
61+ "java" => traverse_up (
62+ path,
63+ dir_has_one ( & [
64+ "pom.xml" ,
65+ "settings.gradle" ,
66+ "settings.gradle.kts" ,
67+ "WORKSPACE" ,
68+ ] ) ,
69+ ) ,
70+ "scala" => traverse_up ( path, dir_has_one ( & [ "build.sbt" ] ) ) ,
71+ "haskell" => traverse_up ( path, dir_has_one ( & [ "stack.yaml" ] ) ) . or_else ( |_| {
7072 traverse_up ( path, |dir| {
7173 dir_contains_file ( dir, |f| has_extension ( f, "cabal" ) )
7274 } )
7375 } ) ,
74- "go" => traverse_up ( path, |dir| dir . join ( "go.mod" ) . exists ( ) ) ,
76+ "go" => traverse_up ( path, dir_has_one ( & [ "go.mod" ] ) ) ,
7577 _ => Err ( anyhow ! ( "Unknown languageId: {}" , language_id) ) ,
7678 }
7779 . or_else ( |_| {
@@ -91,6 +93,10 @@ pub fn get_root_path<'a>(
9193 } )
9294}
9395
96+ fn dir_has_one < ' a > ( files : & ' a [ & str ] ) -> impl Fn ( & ' a Path ) -> bool {
97+ move |dir| files. iter ( ) . any ( |file| dir. join ( file) . exists ( ) )
98+ }
99+
94100/// If iterating the directory fails (e.g. because it is not a directory), returns false; if a
95101/// file cannot be inspected, that file is considered nonexistent.
96102fn dir_contains_file < F > ( path : & Path , predicate : F ) -> bool
@@ -117,9 +123,9 @@ fn has_extension(path: &Path, ext: &str) -> bool {
117123 }
118124}
119125
120- fn traverse_up < F > ( path : & Path , predicate : F ) -> Result < & Path >
126+ fn traverse_up < ' a , F > ( path : & ' a Path , predicate : F ) -> Result < & ' a Path >
121127where
122- F : Fn ( & Path ) -> bool ,
128+ F : Fn ( & ' a Path ) -> bool ,
123129{
124130 if predicate ( path) {
125131 return Ok ( path) ;
0 commit comments