Skip to content

Commit 048ec5f

Browse files
authored
Only resolve the code lens when then opened file is on test source path (microsoft#997)
1 parent f882f2d commit 048ec5f

File tree

13 files changed

+262
-26
lines changed

13 files changed

+262
-26
lines changed

extension.bundle.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
export { activate, deactivate } from './src/extension';
55
export * from './src/codelens/TestCodeLensProvider';
6+
export * from './src/codelens/TestCodeLensController';
67
export * from './src/runners/models';
78
export * from './src/testResultManager';
89
export * from './src/protocols';
910
export * from './src/utils/commandUtils';
11+
export * from './src/testFileWatcher';

java-extension/com.microsoft.java.test.plugin/src/main/java/com/microsoft/java/test/plugin/util/TestSearchUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ public static List<TestItem> searchCodeLens(List<Object> arguments, IProgressMon
8888
Job.getJobManager().join(DocumentLifeCycleHandler.DOCUMENT_LIFE_CYCLE_JOBS, monitor);
8989

9090
final ICompilationUnit unit = JDTUtils.resolveCompilationUnit(uri);
91-
if (!isJavaElementExist(unit) || !isInTestScope(unit) || monitor.isCanceled()) {
91+
// whether the file is on test path or not is guarded at client side cache
92+
if (!isJavaElementExist(unit) || monitor.isCanceled()) {
9293
return resultList;
9394
}
9495

package-lock.json

Lines changed: 146 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@
358358
"@types/mocha": "^2.2.48",
359359
"@types/node": "^6.14.10",
360360
"@types/pug": "^2.0.4",
361+
"@types/sinon": "^9.0.3",
361362
"@types/vscode": "1.44.0",
362363
"bootstrap": "^4.4.1",
363364
"filemanager-webpack-plugin": "^2.0.5",
@@ -367,6 +368,7 @@
367368
"gulp-tslint": "^8.1.4",
368369
"mocha": "^7.1.2",
369370
"pug-loader": "^2.4.0",
371+
"sinon": "^9.0.2",
370372
"ts-loader": "^5.4.5",
371373
"tslint": "^5.20.1",
372374
"typescript": "^2.8.3",
@@ -384,4 +386,4 @@
384386
"winston": "^3.2.1",
385387
"winston-transport": "^4.3.0"
386388
}
387-
}
389+
}

src/codelens/TestCodeLensController.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4-
import { ConfigurationChangeEvent, Disposable, languages, workspace } from 'vscode';
4+
import { ConfigurationChangeEvent, Disposable, DocumentSelector, languages, RelativePattern, workspace } from 'vscode';
55
import { ENABLE_EDITOR_SHORTCUTS_KEY } from '../constants/configs';
66
import { TestCodeLensProvider } from './TestCodeLensProvider';
77

@@ -22,6 +22,22 @@ class TestCodeLensController implements Disposable {
2222
this.setCodeLensVisibility();
2323
}
2424

25+
public registerCodeLensProvider(patterns: RelativePattern[]): void {
26+
if (this.registeredProvider) {
27+
this.registeredProvider.dispose();
28+
}
29+
30+
const documentSelector: DocumentSelector = patterns.map((p: RelativePattern) => {
31+
return {
32+
language: 'java',
33+
scheme: 'file',
34+
pattern: p,
35+
};
36+
});
37+
38+
this.registeredProvider = languages.registerCodeLensProvider(documentSelector, this.internalProvider);
39+
}
40+
2541
public refresh(): void {
2642
this.internalProvider.refresh();
2743
}
@@ -35,12 +51,7 @@ class TestCodeLensController implements Disposable {
3551
}
3652

3753
private setCodeLensVisibility(): void {
38-
if (this.isCodeLensEnabled() && !this.registeredProvider) {
39-
this.registeredProvider = languages.registerCodeLensProvider({ scheme: 'file', language: 'java' }, this.internalProvider);
40-
} else if (!this.isCodeLensEnabled() && this.registeredProvider) {
41-
this.registeredProvider.dispose();
42-
this.registeredProvider = undefined;
43-
}
54+
this.internalProvider.setIsActivated(this.isCodeLensEnabled());
4455
}
4556

4657
private isCodeLensEnabled(): boolean {

src/codelens/TestCodeLensProvider.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,26 @@ import { testResultManager } from '../testResultManager';
1111

1212
export class TestCodeLensProvider implements CodeLensProvider, Disposable {
1313
private onDidChangeCodeLensesEmitter: EventEmitter<void> = new EventEmitter<void>();
14+
private isActivated: boolean = true;
1415

1516
get onDidChangeCodeLenses(): Event<void> {
1617
return this.onDidChangeCodeLensesEmitter.event;
1718
}
1819

20+
public setIsActivated(isActivated: boolean): void {
21+
this.isActivated = isActivated;
22+
this.refresh();
23+
}
24+
1925
public refresh(): void {
2026
this.onDidChangeCodeLensesEmitter.fire();
2127
}
2228

2329
public async provideCodeLenses(document: TextDocument, _token: CancellationToken): Promise<CodeLens[]> {
30+
if (!this.isActivated) {
31+
return [];
32+
}
33+
2434
try {
2535
const items: ITestItem[] = await testItemModel.getItemsForCodeLens(document.uri);
2636
return this.getCodeLenses(items);

src/explorer/testExplorer.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Command, Disposable, Event, EventEmitter, ExtensionContext, Range, Them
66
import { JavaTestRunnerCommands } from '../constants/commands';
77
import { ITestItem, TestKind, TestLevel } from '../protocols';
88
import { ITestResult, TestStatus } from '../runners/models';
9+
import { testFileWatcher } from '../testFileWatcher';
910
import { testItemModel } from '../testItemModel';
1011
import { testResultManager } from '../testResultManager';
1112

@@ -44,6 +45,9 @@ export class TestExplorer implements TreeDataProvider<ITestItem>, Disposable {
4445

4546
public refresh(element?: ITestItem): void {
4647
this.onDidChangeTreeDataEventEmitter.fire(element);
48+
if (!element) {
49+
testFileWatcher.registerListeners();
50+
}
4751
}
4852

4953
public dispose(): void {

src/extension.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import * as fse from 'fs-extra';
55
import * as os from 'os';
66
import * as path from 'path';
7-
import { DebugConfiguration, ExtensionContext, Range, Uri, window } from 'vscode';
7+
import { DebugConfiguration, Event, Extension, ExtensionContext, extensions, Range, Uri, window } from 'vscode';
88
import { dispose as disposeTelemetryWrapper, initializeFromJsonFile, instrumentOperation, instrumentOperationAsVsCodeCommand } from 'vscode-extension-telemetry-wrapper';
99
import { testCodeLensController } from './codelens/TestCodeLensController';
1010
import { debugTestsFromExplorer, openTextDocument, runTestsFromExplorer } from './commands/explorerCommands';
@@ -34,7 +34,7 @@ export async function deactivate(): Promise<void> {
3434
}
3535

3636
async function doActivate(_operationId: string, context: ExtensionContext): Promise<void> {
37-
testFileWatcher.registerListeners();
37+
await testFileWatcher.registerListeners();
3838
testExplorer.initialize(context);
3939
runnerScheduler.initialize(context);
4040
testReportProvider.initialize(context);
@@ -67,4 +67,16 @@ async function doActivate(_operationId: string, context: ExtensionContext): Prom
6767
instrumentOperationAsVsCodeCommand(JavaTestRunnerCommands.JAVA_TEST_CANCEL, async () => await runnerScheduler.cleanUp(true /* isCancel */)),
6868
instrumentOperationAsVsCodeCommand(JavaTestRunnerCommands.JAVA_CONFIG_MIGRATE, async () => await migrateTestConfig()),
6969
);
70+
71+
// refetch the test source path on projectss classpath updated.
72+
const extension: Extension<any> | undefined = extensions.getExtension('redhat.java');
73+
if (extension && extension.isActive) {
74+
const extensionApi: any = extension.exports;
75+
if (extensionApi && extensionApi.onDidClasspathUpdate) {
76+
const onDidClasspathUpdate: Event<Uri> = extensionApi.onDidClasspathUpdate;
77+
context.subscriptions.push(onDidClasspathUpdate(async () => {
78+
await testFileWatcher.registerListeners(true /*enableDebounce*/);
79+
}));
80+
}
81+
}
7082
}

0 commit comments

Comments
 (0)