@@ -15,6 +15,7 @@ import {
15
15
CancellationTokenSource ,
16
16
Uri ,
17
17
EventEmitter ,
18
+ TextDocument ,
18
19
} from 'vscode' ;
19
20
import { IExtensionSingleActivationService } from '../../activation/types' ;
20
21
import { ICommandManager , IWorkspaceService } from '../../common/application/types' ;
@@ -48,6 +49,7 @@ import { WorkspaceTestAdapter } from './workspaceTestAdapter';
48
49
import { ITestDebugLauncher } from '../common/types' ;
49
50
import { IServiceContainer } from '../../ioc/types' ;
50
51
import { PythonResultResolver } from './common/resultResolver' ;
52
+ import { onDidSaveTextDocument } from '../../common/vscodeApis/workspaceApis' ;
51
53
52
54
// Types gymnastics to make sure that sendTriggerTelemetry only accepts the correct types.
53
55
type EventPropertyType = IEventNamePropertyMapping [ EventName . UNITTEST_DISCOVERY_TRIGGER ] ;
@@ -209,7 +211,7 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
209
211
if ( settings . testing . autoTestDiscoverOnSaveEnabled ) {
210
212
traceVerbose ( `Testing: Setting up watcher for ${ workspace . uri . fsPath } ` ) ;
211
213
this . watchForSettingsChanges ( workspace ) ;
212
- this . watchForTestContentChanges ( workspace ) ;
214
+ this . watchForTestContentChangeOnSave ( ) ;
213
215
}
214
216
} ) ;
215
217
}
@@ -493,12 +495,23 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
493
495
this . disposables . push ( watcher ) ;
494
496
495
497
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
+ }
500
511
} ) ,
501
512
) ;
513
+ /* Keep both watchers for create and delete since config files can change test behavior without content
514
+ due to their impact on pythonPath. */
502
515
this . disposables . push (
503
516
watcher . onDidCreate ( ( uri ) => {
504
517
traceVerbose ( `Testing: Trigger refresh after creating ${ uri . fsPath } ` ) ;
@@ -515,31 +528,14 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
515
528
) ;
516
529
}
517
530
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 {
538
532
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
+ }
543
539
} ) ,
544
540
) ;
545
541
}
0 commit comments