@@ -15,6 +15,7 @@ import {
1515 CancellationTokenSource , 
1616 Uri , 
1717 EventEmitter , 
18+  TextDocument , 
1819}  from  'vscode' ; 
1920import  {  IExtensionSingleActivationService  }  from  '../../activation/types' ; 
2021import  {  ICommandManager ,  IWorkspaceService  }  from  '../../common/application/types' ; 
@@ -48,6 +49,7 @@ import { WorkspaceTestAdapter } from './workspaceTestAdapter';
4849import  {  ITestDebugLauncher  }  from  '../common/types' ; 
4950import  {  IServiceContainer  }  from  '../../ioc/types' ; 
5051import  {  PythonResultResolver  }  from  './common/resultResolver' ; 
52+ import  {  onDidSaveTextDocument  }  from  '../../common/vscodeApis/workspaceApis' ; 
5153
5254// Types gymnastics to make sure that sendTriggerTelemetry only accepts the correct types. 
5355type  EventPropertyType  =  IEventNamePropertyMapping [ EventName . UNITTEST_DISCOVERY_TRIGGER ] ; 
@@ -209,7 +211,7 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
209211 if  ( settings . testing . autoTestDiscoverOnSaveEnabled )  { 
210212 traceVerbose ( `Testing: Setting up watcher for ${ workspace . uri . fsPath }  ) ; 
211213 this . watchForSettingsChanges ( workspace ) ; 
212-  this . watchForTestContentChanges ( workspace ) ; 
214+  this . watchForTestContentChangeOnSave ( ) ; 
213215 } 
214216 } ) ; 
215217 } 
@@ -493,12 +495,23 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
493495 this . disposables . push ( watcher ) ; 
494496
495497 this . disposables . push ( 
496-  watcher . onDidChange ( ( uri )  =>  { 
497-  traceVerbose ( `Testing: Trigger refresh after change in ${ uri . fsPath }  ) ; 
498-  this . sendTriggerTelemetry ( 'watching' ) ; 
499-  this . refreshData . trigger ( uri ,  false ) ; 
498+  onDidSaveTextDocument ( async  ( doc : TextDocument )  =>  { 
499+  const  file  =  doc . fileName ; 
500+  // refresh on any settings file save 
501+  if  ( 
502+  file . includes ( 'settings.json' )  || 
503+  file . includes ( 'pytest.ini' )  || 
504+  file . includes ( 'setup.cfg' )  || 
505+  file . includes ( 'pyproject.toml' ) 
506+  )  { 
507+  traceVerbose ( `Testing: Trigger refresh after saving ${ doc . uri . fsPath }  ) ; 
508+  this . sendTriggerTelemetry ( 'watching' ) ; 
509+  this . refreshData . trigger ( doc . uri ,  false ) ; 
510+  } 
500511 } ) , 
501512 ) ; 
513+  /* Keep both watchers for create and delete since config files can change test behavior without content 
514+  due to their impact on pythonPath. */ 
502515 this . disposables . push ( 
503516 watcher . onDidCreate ( ( uri )  =>  { 
504517 traceVerbose ( `Testing: Trigger refresh after creating ${ uri . fsPath }  ) ; 
@@ -515,31 +528,14 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
515528 ) ; 
516529 } 
517530
518-  private  watchForTestContentChanges ( workspace : WorkspaceFolder ) : void { 
519-  const  pattern  =  new  RelativePattern ( workspace ,  '**/*.py' ) ; 
520-  const  watcher  =  this . workspaceService . createFileSystemWatcher ( pattern ) ; 
521-  this . disposables . push ( watcher ) ; 
522- 
523-  this . disposables . push ( 
524-  watcher . onDidChange ( ( uri )  =>  { 
525-  traceVerbose ( `Testing: Trigger refresh after change in ${ uri . fsPath }  ) ; 
526-  this . sendTriggerTelemetry ( 'watching' ) ; 
527-  // We want to invalidate tests for code change 
528-  this . refreshData . trigger ( uri ,  true ) ; 
529-  } ) , 
530-  ) ; 
531-  this . disposables . push ( 
532-  watcher . onDidCreate ( ( uri )  =>  { 
533-  traceVerbose ( `Testing: Trigger refresh after creating ${ uri . fsPath }  ) ; 
534-  this . sendTriggerTelemetry ( 'watching' ) ; 
535-  this . refreshData . trigger ( uri ,  false ) ; 
536-  } ) , 
537-  ) ; 
531+  private  watchForTestContentChangeOnSave ( ) : void { 
538532 this . disposables . push ( 
539-  watcher . onDidDelete ( ( uri )  =>  { 
540-  traceVerbose ( `Testing: Trigger refresh after deleting in ${ uri . fsPath }  ) ; 
541-  this . sendTriggerTelemetry ( 'watching' ) ; 
542-  this . refreshData . trigger ( uri ,  false ) ; 
533+  onDidSaveTextDocument ( async  ( doc : TextDocument )  =>  { 
534+  if  ( doc . fileName . endsWith ( '.py' ) )  { 
535+  traceVerbose ( `Testing: Trigger refresh after saving ${ doc . uri . fsPath }  ) ; 
536+  this . sendTriggerTelemetry ( 'watching' ) ; 
537+  this . refreshData . trigger ( doc . uri ,  false ) ; 
538+  } 
543539 } ) , 
544540 ) ; 
545541 } 
0 commit comments