diff --git a/src/extension.ts b/src/extension.ts index db33f7719..d2622b99c 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -6,12 +6,12 @@ import * as fse from 'fs-extra'; import * as os from 'os'; import * as path from 'path'; import { CodeActionContext, commands, ConfigurationTarget, Diagnostic, env, EventEmitter, ExtensionContext, extensions, IndentAction, InputBoxOptions, languages, RelativePattern, TextDocument, UIKind, Uri, ViewColumn, window, workspace, WorkspaceConfiguration, ProgressLocation, Position, Selection, Range } from 'vscode'; -import { CancellationToken, CodeActionParams, CodeActionRequest, Command, DidChangeConfigurationNotification, ExecuteCommandParams, ExecuteCommandRequest, LanguageClientOptions, RevealOutputChannelOn } from 'vscode-languageclient'; +import { CancellationToken, CodeActionParams, CodeActionRequest, Command, CompletionRequest, DidChangeConfigurationNotification, ExecuteCommandParams, ExecuteCommandRequest, LanguageClientOptions, RevealOutputChannelOn } from 'vscode-languageclient'; import { LanguageClient } from 'vscode-languageclient/node'; import { apiManager } from './apiManager'; import { ClientErrorHandler } from './clientErrorHandler'; import { Commands } from './commands'; -import { ClientStatus, ExtensionAPI } from './extension.api'; +import { ClientStatus, ExtensionAPI, TraceEvent } from './extension.api'; import * as fileEventHandler from './fileEventHandler'; import { getSharedIndexCache, HEAP_DUMP_LOCATION, prepareExecutable } from './javaServerStarter'; import { initializeLogFile, logger } from './log'; @@ -273,6 +273,7 @@ export async function activate(context: ExtensionContext): Promise }; apiManager.initialize(requirements, serverMode); + registerCodeCompletionTelemetryListener(); resolve(apiManager.getApiInstance()); // the promise is resolved // no need to pass `resolve` into any code past this point, @@ -983,6 +984,24 @@ async function cleanJavaWorkspaceStorage() { } } +export function registerCodeCompletionTelemetryListener() { + apiManager.getApiInstance().onDidRequestEnd((traceEvent: TraceEvent) => { + if (traceEvent.type === CompletionRequest.method) { + // Exclude the invalid completion requests. + if (!traceEvent.resultLength) { + return; + } + const props = { + duration: Math.round(traceEvent.duration * 100) / 100, + resultLength: traceEvent.resultLength || 0, + error: !!traceEvent.error, + fromSyntaxServer: !!traceEvent.fromSyntaxServer, + }; + return Telemetry.sendTelemetry(Telemetry.COMPLETION_EVENT, props); + } + }); +} + function registerOutOfMemoryDetection(storagePath: string) { const heapDumpFolder = getHeapDumpFolderFromSettings() || storagePath; chokidar.watch(`${heapDumpFolder}/java_*.hprof`, { ignoreInitial: true }).on('add', path => { diff --git a/src/standardLanguageClient.ts b/src/standardLanguageClient.ts index dde8d63ae..f85887fa9 100644 --- a/src/standardLanguageClient.ts +++ b/src/standardLanguageClient.ts @@ -3,13 +3,13 @@ import * as net from 'net'; import * as path from 'path'; import { CancellationToken, CodeActionKind, commands, ConfigurationTarget, DocumentSelector, EventEmitter, ExtensionContext, extensions, languages, Location, ProgressLocation, TextEditor, Uri, ViewColumn, window, workspace } from "vscode"; -import { ConfigurationParams, ConfigurationRequest, LanguageClientOptions, Location as LSLocation, MessageType, Position as LSPosition, TextDocumentPositionParams, WorkspaceEdit, CompletionRequest } from "vscode-languageclient"; +import { ConfigurationParams, ConfigurationRequest, LanguageClientOptions, Location as LSLocation, MessageType, Position as LSPosition, TextDocumentPositionParams, WorkspaceEdit } from "vscode-languageclient"; import { LanguageClient, StreamInfo } from "vscode-languageclient/node"; import { apiManager } from "./apiManager"; import * as buildPath from './buildpath'; import { javaRefactorKinds, RefactorDocumentProvider } from "./codeActionProvider"; import { Commands } from "./commands"; -import { ClientStatus, TraceEvent } from "./extension.api"; +import { ClientStatus } from "./extension.api"; import * as fileEventHandler from './fileEventHandler'; import { gradleCodeActionMetadata, GradleCodeActionProvider } from "./gradle/gradleCodeActionProvider"; import { awaitServerConnection, prepareExecutable, DEBUG } from "./javaServerStarter"; @@ -34,7 +34,7 @@ import { askForProjects, projectConfigurationUpdate, upgradeGradle } from "./sta import { TracingLanguageClient } from './TracingLanguageClient'; import { TypeHierarchyDirection, TypeHierarchyItem } from "./typeHierarchy/protocol"; import { typeHierarchyTree } from "./typeHierarchy/typeHierarchyTree"; -import { getAllJavaProjects, getJavaConfig, getJavaConfiguration } from "./utils"; +import { getAllJavaProjects, getJavaConfiguration } from "./utils"; import { Telemetry } from "./telemetry"; import { TelemetryEvent } from "@redhat-developer/vscode-redhat-telemetry/lib"; import { registerDocumentValidationListener } from './diagnostic'; @@ -147,7 +147,6 @@ export class StandardLanguageClient { // Disable the client-side snippet provider since LS is ready. snippetCompletionProvider.dispose(); registerDocumentValidationListener(context, this.languageClient); - registerCodeCompletionTelemetryListener(); commands.executeCommand('setContext', 'javaLSReady', true); break; case 'Started': @@ -814,22 +813,4 @@ export async function applyWorkspaceEdit(workspaceEdit: WorkspaceEdit, languageC } else { return Promise.resolve(true); } -} - -export function registerCodeCompletionTelemetryListener() { - apiManager.getApiInstance().onDidRequestEnd((traceEvent: TraceEvent) => { - if (traceEvent.type === CompletionRequest.method) { - // Exclude the invalid completion requests. - if (!traceEvent.resultLength) { - return; - } - const props = { - duration: Math.round(traceEvent.duration * 100) / 100, - resultLength: traceEvent.resultLength || 0, - error: !!traceEvent.error, - fromSyntaxServer: !!traceEvent.fromSyntaxServer, - }; - return Telemetry.sendTelemetry(Telemetry.COMPLETION_EVENT, props); - } - }); } \ No newline at end of file