Skip to content

Commit 43d7669

Browse files
authored
Provide client-side snippet until language server is ready (#2240)
* Provide client-side snippet until language server is ready Signed-off-by: sheche <[email protected]>
1 parent 33888e8 commit 43d7669

File tree

4 files changed

+28
-10
lines changed

4 files changed

+28
-10
lines changed

src/extension.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { registerClientProviders } from './providerDispatcher';
2222
import * as fileEventHandler from './fileEventHandler';
2323
import { StandardLanguageClient } from './standardLanguageClient';
2424
import { apiManager } from './apiManager';
25-
import { SnippetCompletionProvider } from './snippetCompletionProvider';
25+
import { snippetCompletionProvider } from './snippetCompletionProvider';
2626
import { runtimeStatusBarProvider } from './runtimeStatusBarProvider';
2727
import { serverStatusBarProvider } from './serverStatusBarProvider';
2828
import { markdownPreviewProvider } from "./markdownPreviewProvider";
@@ -408,8 +408,7 @@ export function activate(context: ExtensionContext): Promise<ExtensionAPI> {
408408
}
409409
});
410410

411-
const snippetProvider: SnippetCompletionProvider = new SnippetCompletionProvider();
412-
context.subscriptions.push(languages.registerCompletionItemProvider({ scheme: 'file', language: 'java' }, snippetProvider));
411+
context.subscriptions.push(snippetCompletionProvider.initialize());
413412
context.subscriptions.push(serverStatusBarProvider);
414413
context.subscriptions.push(runtimeStatusBarProvider);
415414

src/snippetCompletionProvider.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
11
'use strict';
22

3-
import { CompletionItemProvider, TextDocument, Position, CancellationToken, CompletionContext, CompletionItem, CompletionItemKind, SnippetString, MarkdownString } from "vscode";
3+
import { CompletionItemProvider, TextDocument, Position, CancellationToken, CompletionContext, CompletionItem, CompletionItemKind, SnippetString, MarkdownString, languages, Disposable } from "vscode";
44
import * as fse from 'fs-extra';
55
import * as path from 'path';
6-
import { apiManager } from "./apiManager";
7-
import { ClientStatus } from "./extension.api";
86

9-
export class SnippetCompletionProvider implements CompletionItemProvider {
7+
class SnippetCompletionProvider implements Disposable {
8+
9+
private providerImpl: Disposable;
10+
11+
public initialize(): SnippetCompletionProvider {
12+
this.providerImpl = languages.registerCompletionItemProvider({ scheme: 'file', language: 'java' }, new SnippetCompletionProviderImpl());
13+
return this;
14+
}
15+
16+
public dispose(): void {
17+
if (this.providerImpl) {
18+
this.providerImpl.dispose();
19+
}
20+
}
21+
}
22+
23+
class SnippetCompletionProviderImpl implements CompletionItemProvider {
1024

1125
private snippets: {};
1226

@@ -15,9 +29,6 @@ export class SnippetCompletionProvider implements CompletionItemProvider {
1529
}
1630

1731
public async provideCompletionItems(_document: TextDocument, _position: Position, _token: CancellationToken, _context: CompletionContext): Promise<CompletionItem[]> {
18-
if (apiManager.getApiInstance().status === ClientStatus.Started) {
19-
return [];
20-
}
2132

2233
const snippetItems: CompletionItem[] = [];
2334
for (const label of Object.keys(this.snippets)) {
@@ -48,3 +59,5 @@ export function beautifyDocument(raw: string): MarkdownString {
4859
const escapedString = raw.replace(/\$\{\d:?(.*?)\}/gm, '$1').replace(/\$\d/gm, '');
4960
return new MarkdownString().appendCodeblock(escapedString, "java");
5061
}
62+
63+
export const snippetCompletionProvider: SnippetCompletionProvider = new SnippetCompletionProvider();

src/standardLanguageClient.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { TypeHierarchyDirection, TypeHierarchyItem } from "./typeHierarchy/proto
3333
import { buildFilePatterns } from './plugin';
3434
import { pomCodeActionMetadata, PomCodeActionProvider } from "./pom/pomCodeActionProvider";
3535
import { findRuntimes, IJavaRuntime } from "jdk-utils";
36+
import { snippetCompletionProvider } from "./snippetCompletionProvider";
3637

3738
const extensionName = 'Language Support for Java';
3839
const GRADLE_CHECKSUM = "gradle/checksum/prompt";
@@ -110,6 +111,8 @@ export class StandardLanguageClient {
110111
if (!hasImported) {
111112
showImportFinishNotification(context);
112113
}
114+
// Disable the client-side snippet provider since LS is ready.
115+
snippetCompletionProvider.dispose();
113116
break;
114117
case 'Started':
115118
this.status = ClientStatus.Started;

src/syntaxLanguageClient.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { ServerMode } from "./settings";
99
import { StatusNotification } from "./protocol";
1010
import { apiManager } from "./apiManager";
1111
import { ExtensionAPI, ClientStatus } from "./extension.api";
12+
import { snippetCompletionProvider } from "./snippetCompletionProvider";
1213

1314
const extensionName = "Language Support for Java (Syntax Server)";
1415

@@ -61,6 +62,8 @@ export class SyntaxLanguageClient {
6162
case 'Started':
6263
this.status = ClientStatus.Started;
6364
apiManager.updateStatus(ClientStatus.Started);
65+
// Disable the client-side snippet provider since LS is ready.
66+
snippetCompletionProvider.dispose();
6467
break;
6568
case 'Error':
6669
this.status = ClientStatus.Error;

0 commit comments

Comments
 (0)