1.2.0-insiders3 by sean-mcmanus · Pull Request #6853 · microsoft/vscode-cpptools · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions Extension/CHANGELOG.md
2 changes: 1 addition & 1 deletion Extension/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2450,7 +2450,7 @@
"mkdirp": "^0.5.1",
"plist": "^3.0.1",
"tmp": "^0.1.0",
"vscode-cpptools": "^4.0.1",
"vscode-cpptools": "^5.0.0",
"vscode-extension-telemetry": "^0.1.2",
"vscode-languageclient": "^5.2.1",
"vscode-nls": "^4.1.1",
Expand Down
34 changes: 22 additions & 12 deletions Extension/src/LanguageServer/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1702,7 +1702,7 @@ export class DefaultClient implements Client {
return this.callTaskWithTimeout(provideConfigurationAsync, configProviderTimeout, tokenSource).then(
(configs?: SourceFileConfigurationItem[] | null) => {
if (configs && configs.length > 0) {
this.sendCustomConfigurations(configs);
this.sendCustomConfigurations(configs, provider.version);
}
onFinished();
},
Expand Down Expand Up @@ -2364,19 +2364,24 @@ export class DefaultClient implements Client {
this.notifyWhenReady(() => this.languageClient.sendNotification(ChangeCompileCommandsNotification, params));
}

private isSourceFileConfigurationItem(input: any): input is SourceFileConfigurationItem {
private isSourceFileConfigurationItem(input: any, providerVersion: Version): input is SourceFileConfigurationItem {
// IntelliSenseMode and standard are optional for version 5+. However, they are required when compilerPath is not defined.
let areOptionalsValid: boolean = false;
if (providerVersion < Version.v5 || input.configuration.compilerPath === undefined) {
areOptionalsValid = util.isString(input.configuration.intelliSenseMode) && util.isString(input.configuration.standard);
} else if (util.isString(input.configuration.compilerPath)) {
areOptionalsValid = util.isOptionalString(input.configuration.intelliSenseMode) && util.isOptionalString(input.configuration.standard);
}
return (input && (util.isString(input.uri) || util.isUri(input.uri)) &&
input.configuration &&
areOptionalsValid &&
util.isArrayOfString(input.configuration.includePath) &&
util.isArrayOfString(input.configuration.defines) &&
util.isString(input.configuration.intelliSenseMode) &&
util.isString(input.configuration.standard) &&
util.isOptionalString(input.configuration.compilerPath) &&
util.isOptionalArrayOfString(input.configuration.compilerArgs) &&
util.isOptionalArrayOfString(input.configuration.forcedInclude));
}

private sendCustomConfigurations(configs: any): void {
private sendCustomConfigurations(configs: any, providerVersion: Version): void {
// configs is marked as 'any' because it is untrusted data coming from a 3rd-party. We need to sanitize it before sending it to the language server.
if (!configs || !(configs instanceof Array)) {
console.warn("discarding invalid SourceFileConfigurationItems[]: " + configs);
Expand All @@ -2390,7 +2395,7 @@ export class DefaultClient implements Client {
}
const sanitized: SourceFileConfigurationItemAdapter[] = [];
configs.forEach(item => {
if (this.isSourceFileConfigurationItem(item)) {
if (this.isSourceFileConfigurationItem(item, providerVersion)) {
this.configurationLogging.set(item.uri.toString(), JSON.stringify(item.configuration, null, 4));
if (settings.loggingLevel === "Debug") {
out.appendLine(` uri: ${item.uri.toString()}`);
Expand Down Expand Up @@ -2432,6 +2437,15 @@ export class DefaultClient implements Client {
private browseConfigurationLogging: string = "";
private configurationLogging: Map<string, string> = new Map<string, string>();

private isWorkspaceBrowseConfiguration(input: any): boolean {
const areOptionalsValid: boolean = (input.compilerPath === undefined && util.isString(input.standard)) ||
(util.isString(input.compilerPath) && util.isOptionalString(input.standard));
return areOptionalsValid &&
util.isArrayOfString(input.browsePath) &&
util.isOptionalString(input.compilerArgs) &&
util.isOptionalString(input.windowsSdkVersion);
}

private sendCustomBrowseConfiguration(config: any, providerId?: string, timeoutOccured?: boolean): void {
const rootFolder: vscode.WorkspaceFolder | undefined = this.RootFolder;
if (!rootFolder) {
Expand Down Expand Up @@ -2461,11 +2475,7 @@ export class DefaultClient implements Client {
}

sanitized = {...<WorkspaceBrowseConfiguration>config};
if (!util.isArrayOfString(sanitized.browsePath) ||
!util.isOptionalString(sanitized.compilerPath) ||
!util.isOptionalArrayOfString(sanitized.compilerArgs) ||
!util.isOptionalString(sanitized.standard) ||
!util.isOptionalString(sanitized.windowsSdkVersion)) {
if (!this.isWorkspaceBrowseConfiguration(sanitized)) {
console.log("Received an invalid browse configuration from configuration provider.");
const configValue: WorkspaceBrowseConfiguration | undefined = lastCustomBrowseConfiguration.Value;
if (configValue) {
Expand Down
12 changes: 6 additions & 6 deletions Extension/src/LanguageServer/configurations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -481,18 +481,18 @@ export class CppProperties {
private getIntelliSenseModeForPlatform(name?: string): string {
// Do the built-in configs first.
if (name === "Linux") {
return "gcc-x64";
return "linux-gcc-x64";
} else if (name === "Mac") {
return "clang-x64";
return "macos-clang-x64";
} else if (name === "Win32") {
return "msvc-x64";
return "windows-msvc-x64";
} else if (process.platform === 'win32') {
// Custom configs default to the OS's preference.
return "msvc-x64";
return "windows-msvc-x64";
} else if (process.platform === 'darwin') {
return "clang-x64";
return "macos-clang-x64";
} else {
return "gcc-x64";
return "linux-gcc-x64";
}
}

Expand Down
21 changes: 13 additions & 8 deletions Extension/src/LanguageServer/cppBuildTaskProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import * as path from 'path';
import {
TaskDefinition, Task, TaskGroup, ShellExecution, Uri, workspace,
TaskProvider, TaskScope, CustomExecution, ProcessExecution, TextEditor, Pseudoterminal, EventEmitter, Event, TerminalDimensions, window
TaskProvider, TaskScope, CustomExecution, ProcessExecution, TextEditor, Pseudoterminal, EventEmitter, Event, TerminalDimensions, window, WorkspaceFolder
} from 'vscode';
import * as os from 'os';
import * as util from '../common';
Expand Down Expand Up @@ -181,13 +181,18 @@ export class CppBuildTaskProvider implements TaskProvider {
};
}

const activeClient: Client = ext.getActiveClient();
const uri: Uri | undefined = activeClient.RootUri;
if (!uri) {
throw new Error("No client URI found in getBuildTasks()");
}
if (!workspace.getWorkspaceFolder(uri)) {
throw new Error("No target WorkspaceFolder found in getBuildTasks()");
const editor: TextEditor | undefined = window.activeTextEditor;
const folder: WorkspaceFolder | undefined = editor ? workspace.getWorkspaceFolder(editor.document.uri) : undefined;
// Check uri exists (single-mode files are ignored).
if (folder) {
const activeClient: Client = ext.getActiveClient();
const uri: Uri | undefined = activeClient.RootUri;
if (!uri) {
throw new Error("No client URI found in getBuildTasks()");
}
if (!workspace.getWorkspaceFolder(uri)) {
throw new Error("No target WorkspaceFolder found in getBuildTasks()");
}
}

const scope: TaskScope = TaskScope.Workspace;
Expand Down
4 changes: 2 additions & 2 deletions Extension/src/LanguageServer/customProviders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ class CustomProviderWrapper implements CustomConfigurationProvider1 {
return this._version < Version.v2 ? Promise.resolve(false) : this.provider.canProvideBrowseConfiguration(token);
}

public provideBrowseConfiguration(token?: vscode.CancellationToken): Thenable<WorkspaceBrowseConfiguration> {
public provideBrowseConfiguration(token?: vscode.CancellationToken): Thenable<WorkspaceBrowseConfiguration | null> {
console.assert(this._version >= Version.v2);
return this._version < Version.v2 ? Promise.resolve({browsePath: []}) : this.provider.provideBrowseConfiguration(token);
}
Expand All @@ -92,7 +92,7 @@ class CustomProviderWrapper implements CustomConfigurationProvider1 {
return this._version < Version.v3 ? Promise.resolve(false) : this.provider.canProvideBrowseConfigurationsPerFolder(token);
}

public provideFolderBrowseConfiguration(uri: vscode.Uri, token?: vscode.CancellationToken): Thenable<WorkspaceBrowseConfiguration> {
public provideFolderBrowseConfiguration(uri: vscode.Uri, token?: vscode.CancellationToken): Thenable<WorkspaceBrowseConfiguration | null> {
console.assert(this._version >= Version.v3);
return this._version < Version.v3 ? Promise.resolve({browsePath: []}) : this.provider.provideFolderBrowseConfiguration(uri, token);
}
Expand Down
25 changes: 16 additions & 9 deletions Extension/src/LanguageServer/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1106,10 +1106,10 @@ function reportMacCrashes(): void {
fs.readFile(path.resolve(crashFolder, filename), 'utf8', (err, data) => {
if (err) {
// Try again?
fs.readFile(path.resolve(crashFolder, filename), 'utf8', handleCrashFileRead);
fs.readFile(path.resolve(crashFolder, filename), 'utf8', handleMacCrashFileRead);
return;
}
handleCrashFileRead(err, data);
handleMacCrashFileRead(err, data);
});
}, 5000);
});
Expand All @@ -1120,15 +1120,22 @@ function reportMacCrashes(): void {
}
}

function logCrashTelemetry(data: string): void {
let previousMacCrashData: string;
let previousMacCrashCount: number = 0;

function logMacCrashTelemetry(data: string): void {
const crashObject: { [key: string]: string } = {};
const crashCountObject: { [key: string]: number } = {};
crashObject["CrashingThreadCallStack"] = data;
telemetry.logLanguageServerEvent("MacCrash", crashObject, undefined);
previousMacCrashCount = data === previousMacCrashData ? previousMacCrashCount + 1 : 0;
previousMacCrashData = data;
crashCountObject["CrashCount"] = previousMacCrashCount;
telemetry.logLanguageServerEvent("MacCrash", crashObject, crashCountObject);
}

function handleCrashFileRead(err: NodeJS.ErrnoException | undefined | null, data: string): void {
function handleMacCrashFileRead(err: NodeJS.ErrnoException | undefined | null, data: string): void {
if (err) {
return logCrashTelemetry("readFile: " + err.code);
return logMacCrashTelemetry("readFile: " + err.code);
}

// Extract the crashing process version, because the version might not match
Expand All @@ -1145,15 +1152,15 @@ function handleCrashFileRead(err: NodeJS.ErrnoException | undefined | null, data
const crashStart: string = " Crashed:";
let startCrash: number = data.indexOf(crashStart);
if (startCrash < 0) {
return logCrashTelemetry("No crash start");
return logMacCrashTelemetry("No crash start");
}
startCrash += crashStart.length + 1; // Skip past crashStart.
let endCrash: number = data.indexOf("Thread ", startCrash);
if (endCrash < 0) {
endCrash = data.length - 1; // Not expected, but just in case.
}
if (endCrash <= startCrash) {
return logCrashTelemetry("No crash end");
return logMacCrashTelemetry("No crash end");
}
data = data.substr(startCrash, endCrash - startCrash);

Expand Down Expand Up @@ -1191,7 +1198,7 @@ function handleCrashFileRead(err: NodeJS.ErrnoException | undefined | null, data
data = data.substr(0, 8189) + "...";
}

logCrashTelemetry(data);
logMacCrashTelemetry(data);
}

export function deactivate(): Thenable<void> {
Expand Down
8 changes: 4 additions & 4 deletions Extension/yarn.lock