@@ -593,14 +593,18 @@ fn expand_configure_directory_patterns(kind: &str, patterns: Vec<PathBuf>) -> Ve
593593 . collect ( )
594594}
595595
596+ fn recursive_environment_patterns ( patterns : & [ PathBuf ] ) -> impl Iterator < Item = & PathBuf > {
597+ patterns
598+ . iter ( )
599+ . filter ( |pattern| is_recursive_glob_pattern ( & pattern. to_string_lossy ( ) ) )
600+ }
601+
596602fn warn_for_recursive_environment_patterns ( patterns : & [ PathBuf ] ) {
597- for pattern in patterns {
598- if is_recursive_glob_pattern ( & pattern. to_string_lossy ( ) ) {
599- warn ! (
600- "Recursive environmentDirectories pattern '{}' can make configure slow; prefer bounded patterns such as '.venv' or '*/.venv'" ,
601- pattern. display( )
602- ) ;
603- }
603+ for pattern in recursive_environment_patterns ( patterns) {
604+ warn ! (
605+ "Recursive environmentDirectories pattern '{}' can make configure slow; prefer bounded patterns such as '.venv' or '*/.venv'" ,
606+ pattern. display( )
607+ ) ;
604608 }
605609}
606610pub fn handle_configure ( context : Arc < Context > , id : u32 , params : Value ) {
@@ -631,7 +635,6 @@ pub fn handle_configure(context: Arc<Context>, id: u32, params: Value) {
631635 . environment_directories
632636 . take ( )
633637 . map ( |patterns| {
634- warn_for_recursive_environment_patterns ( & patterns) ;
635638 expand_configure_directory_patterns ( "environmentDirectories" , patterns)
636639 } ) ;
637640 let glob_elapsed = now. elapsed ( ) ;
@@ -1434,6 +1437,42 @@ mod tests {
14341437 use std:: sync:: { mpsc, Barrier , Mutex } ;
14351438 use std:: thread;
14361439
1440+ #[ test]
1441+ fn recursive_environment_pattern_filter_only_returns_recursive_globs ( ) {
1442+ let patterns = vec ! [
1443+ PathBuf :: from( ".venv" ) ,
1444+ PathBuf :: from( "*/.venv" ) ,
1445+ PathBuf :: from( "**/.venv" ) ,
1446+ PathBuf :: from( "/workspace/**/venv" ) ,
1447+ ] ;
1448+
1449+ assert_eq ! (
1450+ recursive_environment_patterns( & patterns)
1451+ . cloned( )
1452+ . collect:: <Vec <_>>( ) ,
1453+ vec![
1454+ PathBuf :: from( "**/.venv" ) ,
1455+ PathBuf :: from( "/workspace/**/venv" )
1456+ ]
1457+ ) ;
1458+ }
1459+
1460+ #[ test]
1461+ fn configure_pattern_expansion_filters_non_directories ( ) {
1462+ let temp = tempfile:: tempdir ( ) . unwrap ( ) ;
1463+ let directory = temp. path ( ) . join ( "env" ) ;
1464+ let file = temp. path ( ) . join ( "python.exe" ) ;
1465+ std:: fs:: create_dir ( & directory) . unwrap ( ) ;
1466+ std:: fs:: write ( & file, "" ) . unwrap ( ) ;
1467+
1468+ assert_eq ! (
1469+ expand_configure_directory_patterns(
1470+ "environmentDirectories" ,
1471+ vec![ temp. path( ) . join( "*" ) ] ,
1472+ ) ,
1473+ vec![ directory]
1474+ ) ;
1475+ }
14371476 #[ derive( Default ) ]
14381477 struct RecordingReporter {
14391478 environments : Mutex < Vec < PythonEnvironment > > ,
0 commit comments