Skip to content

Commit 6da34e4

Browse files
authored
Display a log message when intelliSenseMode is Disabled (#9543)
1 parent e172440 commit 6da34e4

File tree

10 files changed

+161
-148
lines changed

10 files changed

+161
-148
lines changed

Extension/src/LanguageServer/Providers/codeActionProvider.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@
44
* ------------------------------------------------------------------------------------------ */
55
import * as vscode from 'vscode';
66
import { Position, Range, RequestType, TextEdit } from 'vscode-languageclient';
7-
import * as util from '../../common';
87
import { DefaultClient } from '../client';
98
import { CodeActionCodeInfo, CodeActionDiagnosticInfo, codeAnalysisFileToCodeActions, codeAnalysisCodeToFixes,
109
codeAnalysisAllFixes } from '../codeAnalysis';
1110
import { makeVscodeRange } from '../utils';
1211
import { CppSettings } from '../settings';
13-
14-
type LocalizeStringParams = util.LocalizeStringParams;
12+
import { getLocalizedString, LocalizeStringParams } from '../localization';
1513

1614
interface GetCodeActionsRequestParams {
1715
uri: string;
@@ -63,7 +61,7 @@ export class CodeActionProvider implements vscode.CodeActionProvider {
6361

6462
// Convert to vscode.CodeAction array
6563
commands.forEach((command) => {
66-
const title: string = util.getLocalizedString(command.localizeStringParams);
64+
const title: string = getLocalizedString(command.localizeStringParams);
6765
let wsEdit: vscode.WorkspaceEdit | undefined;
6866
let codeActionKind: vscode.CodeActionKind = vscode.CodeActionKind.QuickFix;
6967
if (command.edit) {

Extension/src/LanguageServer/Providers/documentSymbolProvider.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
* ------------------------------------------------------------------------------------------ */
55
import * as vscode from 'vscode';
66
import { DefaultClient, LocalizeDocumentSymbol, GetDocumentSymbolRequestParams, GetDocumentSymbolRequest, SymbolScope } from '../client';
7-
import * as util from '../../common';
87
import { processDelayedDidOpen } from '../extension';
98
import { makeVscodeRange } from '../utils';
9+
import { getLocalizedString, getLocalizedSymbolScope } from '../localization';
1010

1111
export class DocumentSymbolProvider implements vscode.DocumentSymbolProvider {
1212
private client: DefaultClient;
@@ -17,18 +17,18 @@ export class DocumentSymbolProvider implements vscode.DocumentSymbolProvider {
1717
const documentSymbols: vscode.DocumentSymbol[] = [];
1818
if (symbols) {
1919
symbols.forEach((symbol) => {
20-
let detail: string = util.getLocalizedString(symbol.detail);
20+
let detail: string = getLocalizedString(symbol.detail);
2121
if (symbol.scope === SymbolScope.Private) {
2222
if (detail.length === 0) {
2323
detail = "private";
2424
} else {
25-
detail = util.getLocalizedSymbolScope("private", detail);
25+
detail = getLocalizedSymbolScope("private", detail);
2626
}
2727
} else if (symbol.scope === SymbolScope.Protected) {
2828
if (detail.length === 0) {
2929
detail = "protected";
3030
} else {
31-
detail = util.getLocalizedSymbolScope("protected", detail);
31+
detail = getLocalizedSymbolScope("protected", detail);
3232
}
3333
}
3434

Extension/src/LanguageServer/Providers/workspaceSymbolProvider.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import * as vscode from 'vscode';
66
import { DefaultClient, GetSymbolInfoRequest, WorkspaceSymbolParams, LocalizeSymbolInformation, SymbolScope } from '../client';
77
import { makeVscodeLocation } from '../utils';
8-
import * as util from '../../common';
8+
import { getLocalizedString, getLocalizedSymbolScope } from '../localization';
99

1010
export class WorkspaceSymbolProvider implements vscode.WorkspaceSymbolProvider {
1111
private client: DefaultClient;
@@ -23,13 +23,13 @@ export class WorkspaceSymbolProvider implements vscode.WorkspaceSymbolProvider {
2323

2424
// Convert to vscode.Command array
2525
symbols.forEach((symbol) => {
26-
let suffix: string = util.getLocalizedString(symbol.suffix);
26+
let suffix: string = getLocalizedString(symbol.suffix);
2727
let name: string = symbol.name;
2828
if (suffix.length) {
2929
if (symbol.scope === SymbolScope.Private) {
30-
suffix = util.getLocalizedSymbolScope("private", suffix);
30+
suffix = getLocalizedSymbolScope("private", suffix);
3131
} else if (symbol.scope === SymbolScope.Protected) {
32-
suffix = util.getLocalizedSymbolScope("protected", suffix);
32+
suffix = getLocalizedSymbolScope("protected", suffix);
3333
}
3434
name = name + ' (' + suffix + ')';
3535
} else {

Extension/src/LanguageServer/client.ts

Lines changed: 11 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { InlayHintsProvider } from './Providers/inlayHintProvider';
2424
import { LanguageClient, LanguageClientOptions, ServerOptions, NotificationType, TextDocumentIdentifier, RequestType, ErrorAction, CloseAction, DidOpenTextDocumentParams, Range, Position, DocumentFilter } from 'vscode-languageclient';
2525
import { SourceFileConfigurationItem, WorkspaceBrowseConfiguration, SourceFileConfiguration, Version } from 'vscode-cpptools';
2626
import { Status, IntelliSenseStatus } from 'vscode-cpptools/out/testApi';
27-
import { getLocalizedString, LocalizeStringParams } from './localization';
27+
import { getLocaleId, getLocalizedString, LocalizeStringParams } from './localization';
2828
import { Location, TextEdit } from './commonTypes';
2929
import { makeVscodeRange, makeVscodeLocation } from './utils';
3030
import * as util from '../common';
@@ -37,7 +37,6 @@ import { ClientCollection } from './clientCollection';
3737
import { createProtocolFilter } from './protocolFilter';
3838
import { DataBinding } from './dataBinding';
3939
import minimatch = require("minimatch");
40-
import * as logger from '../logger';
4140
import { updateLanguageConfigurations, CppSourceStr } from './extension';
4241
import { SettingsTracker, getTracker } from './settingsTracker';
4342
import { getTestHook, TestHook } from '../testHook';
@@ -49,6 +48,7 @@ import * as nls from 'vscode-nls';
4948
import { lookupString, localizedStringCount } from '../nativeStrings';
5049
import { CodeAnalysisDiagnosticIdentifiersAndUri, RegisterCodeAnalysisNotifications, removeAllCodeAnalysisProblems,
5150
removeCodeAnalysisProblems, RemoveCodeAnalysisProblemsParams } from './codeAnalysis';
51+
import { DebugProtocolParams, getDiagnosticsChannel, getOutputChannelLogger, logDebugProtocol, Logger, logLocalized, showWarning, ShowWarningParams } from '../logger';
5252

5353
nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })();
5454
const localize: nls.LocalizeFunc = nls.loadMessageBundle();
@@ -64,10 +64,6 @@ const languageClientCrashTimes: number[] = [];
6464
let clientCollection: ClientCollection;
6565
let pendingTask: util.BlockingTask<any> | undefined;
6666
let compilerDefaults: configs.CompilerDefaults;
67-
let diagnosticsChannel: vscode.OutputChannel;
68-
let outputChannel: vscode.OutputChannel;
69-
let debugChannel: vscode.OutputChannel;
70-
let warningChannel: vscode.OutputChannel;
7167
let diagnosticsCollectionIntelliSense: vscode.DiagnosticCollection;
7268

7369
let workspaceDisposables: vscode.Disposable[] = [];
@@ -91,32 +87,10 @@ function logTelemetry(notificationBody: TelemetryPayload): void {
9187
function setupOutputHandlers(): void {
9288
console.assert(languageClient !== undefined, "This method must not be called until this.languageClient is set in \"onReady\"");
9389

94-
languageClient.onNotification(DebugProtocolNotification, (output) => {
95-
if (!debugChannel) {
96-
debugChannel = vscode.window.createOutputChannel(`${localize("c.cpp.debug.protocol", "C/C++ Debug Protocol")}`);
97-
workspaceDisposables.push(debugChannel);
98-
}
99-
debugChannel.appendLine("");
100-
debugChannel.appendLine("************************************************************************************************************************");
101-
debugChannel.append(`${output}`);
102-
});
103-
90+
languageClient.onNotification(DebugProtocolNotification, logDebugProtocol);
10491
languageClient.onNotification(DebugLogNotification, logLocalized);
10592
}
10693

107-
function log(output: string): void {
108-
if (!outputChannel) {
109-
outputChannel = logger.getOutputChannel();
110-
workspaceDisposables.push(outputChannel);
111-
}
112-
outputChannel.appendLine(`${output}`);
113-
}
114-
115-
function logLocalized(params: LocalizeStringParams): void {
116-
const output: string = getLocalizedString(params);
117-
log(output);
118-
}
119-
12094
/** Note: We should not await on the following functions,
12195
* or any funstion that returns a promise acquired from them,
12296
* vscode.window.showInformationMessage, vscode.window.showWarningMessage, vscode.window.showErrorMessage
@@ -139,21 +113,6 @@ function showMessageWindow(params: ShowMessageWindowParams): void {
139113
}
140114
}
141115

142-
function showWarning(params: ShowWarningParams): void {
143-
const message: string = getLocalizedString(params.localizeStringParams);
144-
let showChannel: boolean = false;
145-
if (!warningChannel) {
146-
warningChannel = vscode.window.createOutputChannel(`${localize("c.cpp.warnings", "C/C++ Configuration Warnings")}`);
147-
workspaceDisposables.push(warningChannel);
148-
showChannel = true;
149-
}
150-
// Append before showing the channel, to avoid a delay.
151-
warningChannel.appendLine(`[${new Date().toLocaleString()}] ${message}`);
152-
if (showChannel) {
153-
warningChannel.show(true);
154-
}
155-
}
156-
157116
function publishIntelliSenseDiagnostics(params: PublishIntelliSenseDiagnosticsParams): void {
158117
if (!diagnosticsCollectionIntelliSense) {
159118
diagnosticsCollectionIntelliSense = vscode.languages.createDiagnosticCollection(CppSourceStr);
@@ -192,12 +151,6 @@ interface TelemetryPayload {
192151
metrics?: { [key: string]: number };
193152
}
194153

195-
interface DebugProtocolParams {
196-
jsonrpc: string;
197-
method: string;
198-
params?: any;
199-
}
200-
201154
interface ReportStatusNotificationBody extends WorkspaceFolderParams {
202155
status: string;
203156
}
@@ -301,10 +254,6 @@ interface ShowMessageWindowParams {
301254
localizeStringParams: LocalizeStringParams;
302255
}
303256

304-
interface ShowWarningParams {
305-
localizeStringParams: LocalizeStringParams;
306-
}
307-
308257
export interface GetDocumentSymbolRequestParams {
309258
uri: string;
310259
}
@@ -1378,7 +1327,7 @@ export class DefaultClient implements Client {
13781327
},
13791328
vcpkg_root: util.getVcpkgRoot(),
13801329
experimentalFeatures: workspaceSettings.experimentalFeatures,
1381-
edgeMessagesDirectory: path.join(util.getExtensionFilePath("bin"), "messages", util.getLocaleId()),
1330+
edgeMessagesDirectory: path.join(util.getExtensionFilePath("bin"), "messages", getLocaleId()),
13821331
localizedStrings: localizedStrings,
13831332
packageVersion: util.packageJson.version,
13841333
legacyCompilerArgsBehavior: settings_legacyCompilerArgsBehavior
@@ -1518,7 +1467,7 @@ export class DefaultClient implements Client {
15181467
this.loggingLevel = newLoggingLevel;
15191468
const newLoggingLevelLogged: boolean = !!newLoggingLevel && newLoggingLevel !== "None" && newLoggingLevel !== "Error";
15201469
if (oldLoggingLevelLogged || newLoggingLevelLogged) {
1521-
const out: logger.Logger = logger.getOutputChannelLogger();
1470+
const out: Logger = getOutputChannelLogger();
15221471
out.appendLine(localize({ key: "loggingLevel.changed", comment: ["{0} is the setting name 'loggingLevel', {1} is a string value such as 'Debug'"] }, "{0} has changed to: {1}", "loggingLevel", changedSettings["loggingLevel"]));
15231472
}
15241473
}
@@ -1810,12 +1759,8 @@ export class DefaultClient implements Client {
18101759

18111760
public async logDiagnostics(): Promise<void> {
18121761
const response: GetDiagnosticsResult = await this.requestWhenReady(() => this.languageClient.sendRequest(GetDiagnosticsRequest, null));
1813-
if (!diagnosticsChannel) {
1814-
diagnosticsChannel = vscode.window.createOutputChannel(localize("c.cpp.diagnostics", "C/C++ Diagnostics"));
1815-
workspaceDisposables.push(diagnosticsChannel);
1816-
} else {
1817-
diagnosticsChannel.clear();
1818-
}
1762+
const diagnosticsChannel: vscode.OutputChannel = getDiagnosticsChannel();
1763+
diagnosticsChannel.clear();
18191764

18201765
const header: string = `-------- Diagnostics - ${new Date().toLocaleString()}\n`;
18211766
const version: string = `Version: ${util.packageJson.version}\n`;
@@ -2352,7 +2297,7 @@ export class DefaultClient implements Client {
23522297
} else if (message.endsWith("IntelliSense done")) {
23532298
const settings: CppSettings = new CppSettings();
23542299
if (settings.loggingLevel === "Debug") {
2355-
const out: logger.Logger = logger.getOutputChannelLogger();
2300+
const out: Logger = getOutputChannelLogger();
23562301
const duration: number = Date.now() - timeStamp;
23572302
out.appendLine(localize("update.intellisense.time", "Update IntelliSense time (sec): {0}", duration / 1000));
23582303
}
@@ -2425,7 +2370,7 @@ export class DefaultClient implements Client {
24252370
}
24262371

24272372
private updateTagParseStatus(notificationBody: LocalizeStringParams): void {
2428-
this.model.parsingWorkspaceStatus.Value = util.getLocalizedString(notificationBody);
2373+
this.model.parsingWorkspaceStatus.Value = getLocalizedString(notificationBody);
24292374
if (notificationBody.text.startsWith("Workspace parsing paused")) {
24302375
this.model.isParsingWorkspacePausable.Value = true;
24312376
this.model.isParsingWorkspacePaused.Value = true;
@@ -2768,7 +2713,7 @@ export class DefaultClient implements Client {
27682713
}
27692714

27702715
const settings: CppSettings = new CppSettings();
2771-
const out: logger.Logger = logger.getOutputChannelLogger();
2716+
const out: Logger = getOutputChannelLogger();
27722717
if (settings.loggingLevel === "Debug") {
27732718
out.appendLine(localize("configurations.received", "Custom configurations received:"));
27742719
}
@@ -2872,7 +2817,7 @@ export class DefaultClient implements Client {
28722817

28732818
const settings: CppSettings = new CppSettings();
28742819
if (settings.loggingLevel === "Debug") {
2875-
const out: logger.Logger = logger.getOutputChannelLogger();
2820+
const out: Logger = getOutputChannelLogger();
28762821
out.appendLine(localize("browse.configuration.received", "Custom browse configuration received: {0}", JSON.stringify(sanitized, null, 2)));
28772822
}
28782823

Extension/src/LanguageServer/clientCollection.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,6 @@ export class ClientCollection {
295295
// this.defaultClient is already in this.languageClients, so do not call dispose() on it.
296296
this.languageClients.forEach(client => client.dispose());
297297
this.languageClients.clear();
298-
cpptools.disposeWorkspaceData();
299298
return cpptools.DefaultClient.stopLanguageClient();
300299
}
301300
}

Extension/src/LanguageServer/localization.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@
44
* ------------------------------------------------------------------------------------------ */
55
'use strict';
66

7+
import { getExtensionFilePath } from '../common';
78
import { lookupString } from '../nativeStrings';
9+
import * as nls from 'vscode-nls';
10+
import path = require('path');
11+
import * as fs from 'fs';
12+
13+
nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })();
14+
const localize: nls.LocalizeFunc = nls.loadMessageBundle();
815

916
export interface LocalizeStringParams {
1017
text: string;
@@ -24,3 +31,45 @@ export function getLocalizedString(params: LocalizeStringParams): string {
2431
}
2532
return indent + text;
2633
}
34+
35+
interface VSCodeNlsConfig {
36+
locale: string;
37+
availableLanguages: {
38+
[pack: string]: string;
39+
};
40+
}
41+
42+
export function getLocaleId(): string {
43+
// This replicates the language detection used by initializeSettings() in vscode-nls
44+
if (typeof process.env.VSCODE_NLS_CONFIG === 'string') {
45+
const vscodeOptions: VSCodeNlsConfig = JSON.parse(process.env.VSCODE_NLS_CONFIG) as VSCodeNlsConfig;
46+
if (vscodeOptions.availableLanguages) {
47+
const value: any = vscodeOptions.availableLanguages['*'];
48+
if (typeof value === 'string') {
49+
return value;
50+
}
51+
}
52+
if (typeof vscodeOptions.locale === 'string') {
53+
return vscodeOptions.locale.toLowerCase();
54+
}
55+
}
56+
return "en";
57+
}
58+
59+
export function getLocalizedHtmlPath(originalPath: string): string {
60+
const locale: string = getLocaleId();
61+
if (!locale.startsWith("en")) {
62+
const localizedFilePath: string = getExtensionFilePath(path.join("dist/html/", locale, originalPath));
63+
if (fs.existsSync(localizedFilePath)) {
64+
return localizedFilePath;
65+
}
66+
}
67+
return getExtensionFilePath(originalPath);
68+
}
69+
70+
export function getLocalizedSymbolScope(scope: string, detail: string): string {
71+
return localize({
72+
key: "c.cpp.symbolscope.separator", comment:
73+
["{0} is an untranslated C++ keyword (e.g. \"private\") and {1} is either another keyword (e.g. \"typedef\") or a localized property (e.g. a localized version of \"declaration\""]
74+
}, "{0}, {1}", scope, detail);
75+
}

Extension/src/LanguageServer/settingsPanel.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import * as vscode from 'vscode';
1010
import * as util from '../common';
1111
import * as config from './configurations';
1212
import * as telemetry from '../telemetry';
13+
import { getLocalizedHtmlPath } from './localization';
1314

1415
// TODO: share ElementId between SettingsPanel and SettingsApp. Investigate why SettingsApp cannot import/export
1516
const elementId: { [key: string]: string } = {
@@ -373,7 +374,7 @@ export class SettingsPanel {
373374
private getHtml(): string {
374375
let content: string | undefined;
375376

376-
content = fs.readFileSync(util.getLocalizedHtmlPath("ui/settings.html")).toString();
377+
content = fs.readFileSync(getLocalizedHtmlPath("ui/settings.html")).toString();
377378

378379
if (this.panel && this.panel.webview) {
379380
const cppImageUri: vscode.Uri = this.panel.webview.asWebviewUri(vscode.Uri.file(path.join(util.extensionPath, 'LanguageCCPP_color_128x.png')));

0 commit comments

Comments
 (0)