Skip to content

Commit

Permalink
Merge branch 'master' into joh/uri-whatwg-like
Browse files Browse the repository at this point in the history
  • Loading branch information
jrieken committed Oct 21, 2019
2 parents 401db3f + 82ca6ba commit 62d6cae
Show file tree
Hide file tree
Showing 76 changed files with 1,014 additions and 495 deletions.
16 changes: 14 additions & 2 deletions extensions/typescript-language-features/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,18 @@
"description": "%configuration.suggest.completeFunctionCalls%",
"scope": "resource"
},
"javascript.suggest.includeAutomaticOptionalChainCompletions": {
"type": "boolean",
"default": true,
"description": "%configuration.suggest.includeAutomaticOptionalChainCompletions%",
"scope": "resource"
},
"typescript.suggest.includeAutomaticOptionalChainCompletions": {
"type": "boolean",
"default": true,
"description": "%configuration.suggest.includeAutomaticOptionalChainCompletions%",
"scope": "resource"
},
"typescript.reportStyleChecksAsWarnings": {
"type": "boolean",
"default": true,
Expand Down Expand Up @@ -463,7 +475,7 @@
"javascript.suggest.names": {
"type": "boolean",
"default": true,
"description": "%configuration.suggest.names%",
"markdownDescription": "%configuration.suggest.names%",
"scope": "resource"
},
"typescript.tsc.autoDetect": {
Expand Down Expand Up @@ -688,7 +700,7 @@
},
"typescript.tsserver.maxTsServerMemory": {
"type": "number",
"default": 0,
"default": 3072,
"description": "%configuration.tsserver.maxTsServerMemory%",
"scope": "window"
}
Expand Down
3 changes: 2 additions & 1 deletion extensions/typescript-language-features/package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"reloadProjects.title": "Reload Project",
"configuration.typescript": "TypeScript",
"configuration.suggest.completeFunctionCalls": "Complete functions with their parameter signature.",
"configuration.suggest.includeAutomaticOptionalChainCompletions": "Enable/disable showing completions on potentially undefined values that insert an optional chain call. Requires TS 3.7+ and strict null checks to be enabled.",
"typescript.tsdk.desc": "Specifies the folder path to the tsserver and lib*.d.ts files under a TypeScript install to use for IntelliSense, for example: `./node_modules/typescript/lib`.\n\n- When specified as a user setting, the TypeScript version from `typescript.tsdk` automatically replaces the built-in TypeScript version.\n- When specified as a workspace setting, `typescript.tsdk` allows you to switch to use that workspace version of TypeScript for IntelliSense with the `TypeScript: Select TypeScript version` command.\n\nSee the [TypeScript documentation](https://code.visualstudio.com/docs/typescript/typescript-compiling#_using-newer-typescript-versions) for more detail about managing TypeScript versions.",
"typescript.disableAutomaticTypeAcquisition": "Disables automatic type acquisition. Automatic type acquisition fetches `@types` packages from npm to improve IntelliSense for external libraries.",
"typescript.tsserver.log": "Enables logging of the TS server to a file. This log can be used to diagnose TS Server issues. The log may contain file paths, source code, and other potentially sensitive information from your project.",
Expand Down Expand Up @@ -44,7 +45,7 @@
"javascript.implicitProjectConfig.checkJs": "Enable/disable semantic checking of JavaScript files. Existing jsconfig.json or tsconfig.json files override this setting. Requires using TypeScript 2.3.1 or newer in the workspace.",
"typescript.npm": "Specifies the path to the NPM executable used for Automatic Type Acquisition. Requires using TypeScript 2.3.4 or newer in the workspace.",
"typescript.check.npmIsInstalled": "Check if NPM is installed for Automatic Type Acquisition.",
"configuration.suggest.names": "Enable/disable including unique names from the file in JavaScript suggestions.",
"configuration.suggest.names": "Enable/disable including unique names from the file in JavaScript suggestions. Note that name suggestions are always disabled in JavaScript code that is semantically checked using `@ts-check` or `checkJs`.",
"typescript.tsc.autoDetect": "Controls auto detection of tsc tasks.",
"typescript.tsc.autoDetect.off": "Disable this feature.",
"typescript.tsc.autoDetect.on": "Create both build and watch tasks.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -301,13 +301,15 @@ interface CompletionConfiguration {
readonly nameSuggestions: boolean;
readonly pathSuggestions: boolean;
readonly autoImportSuggestions: boolean;
readonly includeAutomaticOptionalChainCompletions: boolean;
}

namespace CompletionConfiguration {
export const useCodeSnippetsOnMethodSuggest = 'suggest.completeFunctionCalls';
export const nameSuggestions = 'suggest.names';
export const pathSuggestions = 'suggest.paths';
export const autoImportSuggestions = 'suggest.autoImports';
export const includeAutomaticOptionalChainCompletions = 'suggest.includeAutomaticOptionalChainCompletions';

export function getConfigurationForResource(
modeId: string,
Expand All @@ -318,7 +320,8 @@ namespace CompletionConfiguration {
useCodeSnippetsOnMethodSuggest: config.get<boolean>(CompletionConfiguration.useCodeSnippetsOnMethodSuggest, false),
pathSuggestions: config.get<boolean>(CompletionConfiguration.pathSuggestions, true),
autoImportSuggestions: config.get<boolean>(CompletionConfiguration.autoImportSuggestions, true),
nameSuggestions: config.get<boolean>(CompletionConfiguration.nameSuggestions, true)
nameSuggestions: config.get<boolean>(CompletionConfiguration.nameSuggestions, true),
includeAutomaticOptionalChainCompletions: config.get<boolean>(CompletionConfiguration.includeAutomaticOptionalChainCompletions, true),
};
}
}
Expand Down Expand Up @@ -372,11 +375,12 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider

await this.client.interruptGetErr(() => this.fileConfigurationManager.ensureConfigurationForDocument(document, token));

const args: Proto.CompletionsRequestArgs = {
const args: Proto.CompletionsRequestArgs & { includeAutomaticOptionalChainCompletions?: boolean } = {
...typeConverters.Position.toFileLocationRequestArgs(file, position),
includeExternalModuleExports: completionConfiguration.autoImportSuggestions,
includeInsertTextCompletions: true,
triggerCharacter: this.getTsTriggerCharacter(context),
includeAutomaticOptionalChainCompletions: completionConfiguration.includeAutomaticOptionalChainCompletions,
};

let isNewIdentifierLocation = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,13 @@ class JsDocCompletionProvider implements vscode.CompletionItemProvider {
// or could be the opening of a comment
const line = document.lineAt(position.line).text;
const prefix = line.slice(0, position.character);
if (prefix.match(/^\s*$|\/\*\*\s*$|^\s*\/\*\*+\s*$/) === null) {
if (!/^\s*$|\/\*\*\s*$|^\s*\/\*\*+\s*$/.test(prefix)) {
return false;
}

// And everything after is possibly a closing comment or more whitespace
const suffix = line.slice(position.character);
return suffix.match(/^\s*\*+\//) !== null;
return /^\s*(\*+\/)?\s*$/.test(suffix);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import * as assert from 'assert';
import 'mocha';
import * as vscode from 'vscode';
import { disposeAll } from '../utils/dispose';
import { createTestEditor, joinLines, wait } from './testUtils';
import { acceptFirstSuggestion, typeCommitCharacter } from './suggestTestHelpers';

const testDocumentUri = vscode.Uri.parse('untitled:test.ts');

Expand Down Expand Up @@ -292,71 +294,3 @@ suite('TypeScript Completions', () => {
});
});

const joinLines = (...args: string[]) => args.join('\n');

const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));

async function acceptFirstSuggestion(uri: vscode.Uri, _disposables: vscode.Disposable[], options?: { useLineRange?: boolean }) {
const didChangeDocument = onChangedDocument(uri, _disposables);
const didSuggest = onDidSuggest(_disposables, options);
await vscode.commands.executeCommand('editor.action.triggerSuggest');
await didSuggest;
// TODO: depends on reverting fix for https://github.com/Microsoft/vscode/issues/64257
// Make sure we have time to resolve the suggestion because `acceptSelectedSuggestion` doesn't
await wait(40);
await vscode.commands.executeCommand('acceptSelectedSuggestion');
return await didChangeDocument;
}

async function typeCommitCharacter(uri: vscode.Uri, character: string, _disposables: vscode.Disposable[]) {
const didChangeDocument = onChangedDocument(uri, _disposables);
const didSuggest = onDidSuggest(_disposables);
await vscode.commands.executeCommand('editor.action.triggerSuggest');
await didSuggest;
await vscode.commands.executeCommand('type', { text: character });
return await didChangeDocument;
}

function onChangedDocument(documentUri: vscode.Uri, disposables: vscode.Disposable[]) {
return new Promise<vscode.TextDocument>(resolve => vscode.workspace.onDidChangeTextDocument(e => {
if (e.document.uri.toString() === documentUri.toString()) {
resolve(e.document);
}
}, undefined, disposables));
}

async function createTestEditor(uri: vscode.Uri, ...lines: string[]) {
const document = await vscode.workspace.openTextDocument(uri);
await vscode.window.showTextDocument(document);
const activeEditor = vscode.window.activeTextEditor;
if (!activeEditor) {
throw new Error('no active editor');
}

await activeEditor.insertSnippet(new vscode.SnippetString(joinLines(...lines)), new vscode.Range(0, 0, 1000, 0));
}

function onDidSuggest(disposables: vscode.Disposable[], options?: { useLineRange?: boolean }) {
return new Promise(resolve =>
disposables.push(vscode.languages.registerCompletionItemProvider('typescript', new class implements vscode.CompletionItemProvider {
provideCompletionItems(doc: vscode.TextDocument, position: vscode.Position): vscode.ProviderResult<vscode.CompletionItem[] | vscode.CompletionList> {
// Return a fake item that will come first
const range = options && options.useLineRange
? new vscode.Range(new vscode.Position(position.line, 0), position)
: doc.getWordRangeAtPosition(position);
return [{
label: '🦄',
insertText: doc.getText(range),
filterText: doc.getText(range),
preselect: true,
sortText: '\0',
range: range
}];
}
async resolveCompletionItem(item: vscode.CompletionItem) {
await vscode.commands.executeCommand('selectNextSuggestion');
resolve();
return item;
}
})));
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import * as assert from 'assert';
import 'mocha';
import * as vscode from 'vscode';
import { disposeAll } from '../utils/dispose';
import { createTestEditor, joinLines, wait } from './testUtils';
import { acceptFirstSuggestion } from './suggestTestHelpers';

const testDocumentUri = vscode.Uri.parse('untitled:test.ts');

suite('JSDoc Completions', () => {
const _disposables: vscode.Disposable[] = [];

setup(async () => {
await wait(100);
});

teardown(async () => {
disposeAll(_disposables);
});

test('Should complete jsdoc inside single line comment', async () => {
await createTestEditor(testDocumentUri,
`/**$0 */`,
`function abcdef(x, y) { }`,
);

const document = await acceptFirstSuggestion(testDocumentUri, _disposables, { useLineRange: true});
assert.strictEqual(
document.getText(),
joinLines(
`/**`,
` *`,
` * @param {*} x `,
` * @param {*} y `,
` */`,
`function abcdef(x, y) { }`,
));
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import 'mocha';
import * as vscode from 'vscode';
import { wait } from './testUtils';

export async function acceptFirstSuggestion(uri: vscode.Uri, _disposables: vscode.Disposable[], options?: { useLineRange?: boolean }) {
const didChangeDocument = onChangedDocument(uri, _disposables);
const didSuggest = onDidSuggest(_disposables, options);
await vscode.commands.executeCommand('editor.action.triggerSuggest');
await didSuggest;
// TODO: depends on reverting fix for https://github.com/Microsoft/vscode/issues/64257
// Make sure we have time to resolve the suggestion because `acceptSelectedSuggestion` doesn't
await wait(40);
await vscode.commands.executeCommand('acceptSelectedSuggestion');
return await didChangeDocument;
}

export async function typeCommitCharacter(uri: vscode.Uri, character: string, _disposables: vscode.Disposable[]) {
const didChangeDocument = onChangedDocument(uri, _disposables);
const didSuggest = onDidSuggest(_disposables);
await vscode.commands.executeCommand('editor.action.triggerSuggest');
await didSuggest;
await vscode.commands.executeCommand('type', { text: character });
return await didChangeDocument;
}

export function onChangedDocument(documentUri: vscode.Uri, disposables: vscode.Disposable[]) {
return new Promise<vscode.TextDocument>(resolve => vscode.workspace.onDidChangeTextDocument(e => {
if (e.document.uri.toString() === documentUri.toString()) {
resolve(e.document);
}
}, undefined, disposables));
}


function onDidSuggest(disposables: vscode.Disposable[], options?: { useLineRange?: boolean }) {
return new Promise(resolve =>
disposables.push(vscode.languages.registerCompletionItemProvider('typescript', new class implements vscode.CompletionItemProvider {
provideCompletionItems(doc: vscode.TextDocument, position: vscode.Position): vscode.ProviderResult<vscode.CompletionItem[] | vscode.CompletionList> {
// Return a fake item that will come first
const range = options && options.useLineRange
? new vscode.Range(new vscode.Position(position.line, 0), position)
: doc.getWordRangeAtPosition(position.translate({ characterDelta: -1 }));
return [{
label: '🦄',
insertText: doc.getText(range),
filterText: doc.getText(range),
preselect: true,
sortText: 'a',
range: range
}];
}
async resolveCompletionItem(item: vscode.CompletionItem) {
await vscode.commands.executeCommand('selectNextSuggestion');
resolve();
return item;
}
})));
}
17 changes: 16 additions & 1 deletion extensions/typescript-language-features/src/test/testUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,19 @@ export function withRandomFileEditor(
});
});
});
}
}

export const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));

export const joinLines = (...args: string[]) => args.join('\n');

export async function createTestEditor(uri: vscode.Uri, ...lines: string[]) {
const document = await vscode.workspace.openTextDocument(uri);
await vscode.window.showTextDocument(document);
const activeEditor = vscode.window.activeTextEditor;
if (!activeEditor) {
throw new Error('no active editor');
}

await activeEditor.insertSnippet(new vscode.SnippetString(joinLines(...lines)), new vscode.Range(0, 0, 1000, 0));
}
Original file line number Diff line number Diff line change
Expand Up @@ -151,10 +151,12 @@ export class TypeScriptServiceConfiguration {
}

private static readMaxTsServerMemory(configuration: vscode.WorkspaceConfiguration): number {
const memoryInMB = configuration.get<number>('typescript.tsserver.maxTsServerMemory', 0);
if (!Number.isSafeInteger(memoryInMB) || memoryInMB < 128) {
return 0;
const defaultMaxMemory = 3072;
const minimumMaxMemory = 128;
const memoryInMB = configuration.get<number>('typescript.tsserver.maxTsServerMemory', defaultMaxMemory);
if (!Number.isSafeInteger(memoryInMB)) {
return defaultMaxMemory;
}
return memoryInMB;
return Math.max(memoryInMB, minimumMaxMemory);
}
}
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "code-oss-dev",
"version": "1.40.0",
"distro": "5327446027a35b9f485d570bf0bb2c854ec8f543",
"distro": "c46805b884619dd41f9aac4aa6ba413e4bc227a7",
"author": {
"name": "Microsoft Corporation"
},
Expand Down Expand Up @@ -53,9 +53,9 @@
"vscode-ripgrep": "^1.5.7",
"vscode-sqlite3": "4.0.8",
"vscode-textmate": "^4.2.2",
"xterm": "4.2.0-beta10",
"xterm": "^4.2.0-beta20",
"xterm-addon-search": "0.3.0-beta5",
"xterm-addon-web-links": "0.2.0",
"xterm-addon-web-links": "0.2.1",
"yauzl": "^2.9.2",
"yazl": "^2.4.3"
},
Expand Down
4 changes: 2 additions & 2 deletions remote/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@
"vscode-proxy-agent": "0.4.0",
"vscode-ripgrep": "^1.5.7",
"vscode-textmate": "^4.2.2",
"xterm": "4.2.0-beta10",
"xterm": "^4.2.0-beta20",
"xterm-addon-search": "0.3.0-beta5",
"xterm-addon-web-links": "0.2.0",
"xterm-addon-web-links": "0.2.1",
"yauzl": "^2.9.2",
"yazl": "^2.4.3"
},
Expand Down
4 changes: 2 additions & 2 deletions remote/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
"onigasm-umd": "^2.2.2",
"semver-umd": "^5.5.3",
"vscode-textmate": "^4.2.2",
"xterm": "4.2.0-beta10",
"xterm": "^4.2.0-beta20",
"xterm-addon-search": "0.3.0-beta5",
"xterm-addon-web-links": "0.2.0"
"xterm-addon-web-links": "0.2.1"
}
}
Loading

0 comments on commit 62d6cae

Please sign in to comment.