|
|
|
|
@@ -44,7 +44,7 @@ import { nullExtensionDescription as defaultExtension } from 'vs/workbench/servi
|
|
|
|
|
import { provideSelectionRanges } from 'vs/editor/contrib/smartSelect/browser/smartSelect';
|
|
|
|
|
import { mock } from 'vs/base/test/common/mock';
|
|
|
|
|
import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker';
|
|
|
|
|
import { dispose } from 'vs/base/common/lifecycle';
|
|
|
|
|
import { DisposableStore } from 'vs/base/common/lifecycle';
|
|
|
|
|
import { NullApiDeprecationService } from 'vs/workbench/api/common/extHostApiDeprecationService';
|
|
|
|
|
import { Progress } from 'vs/platform/progress/common/progress';
|
|
|
|
|
import { IExtHostFileSystemInfo } from 'vs/workbench/api/common/extHostFileSystemInfo';
|
|
|
|
|
@@ -55,6 +55,7 @@ import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeatu
|
|
|
|
|
import { CodeActionTriggerSource } from 'vs/editor/contrib/codeAction/common/types';
|
|
|
|
|
import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity';
|
|
|
|
|
import { IExtHostTelemetry } from 'vs/workbench/api/common/extHostTelemetry';
|
|
|
|
|
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
|
|
|
|
|
|
|
|
|
|
suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
@@ -62,7 +63,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
let model: ITextModel;
|
|
|
|
|
let extHost: ExtHostLanguageFeatures;
|
|
|
|
|
let mainThread: MainThreadLanguageFeatures;
|
|
|
|
|
let disposables: vscode.Disposable[] = [];
|
|
|
|
|
const disposables = new DisposableStore();
|
|
|
|
|
let rpcProtocol: TestRPCProtocol;
|
|
|
|
|
let languageFeaturesService: ILanguageFeaturesService;
|
|
|
|
|
let originalErrorHandler: (e: any) => any;
|
|
|
|
|
@@ -121,7 +122,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
rpcProtocol.set(ExtHostContext.ExtHostCommands, commands);
|
|
|
|
|
rpcProtocol.set(MainContext.MainThreadCommands, inst.createInstance(MainThreadCommands, rpcProtocol));
|
|
|
|
|
rpcProtocol.set(MainContext.MainThreadCommands, disposables.add(inst.createInstance(MainThreadCommands, rpcProtocol)));
|
|
|
|
|
|
|
|
|
|
const diagnostics = new ExtHostDiagnostics(rpcProtocol, new NullLogService(), new class extends mock<IExtHostFileSystemInfo>() { }, extHostDocumentsAndEditors);
|
|
|
|
|
rpcProtocol.set(ExtHostContext.ExtHostDiagnostics, diagnostics);
|
|
|
|
|
@@ -133,7 +134,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
});
|
|
|
|
|
rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, extHost);
|
|
|
|
|
|
|
|
|
|
mainThread = rpcProtocol.set(MainContext.MainThreadLanguageFeatures, inst.createInstance(MainThreadLanguageFeatures, rpcProtocol));
|
|
|
|
|
mainThread = rpcProtocol.set(MainContext.MainThreadLanguageFeatures, disposables.add(inst.createInstance(MainThreadLanguageFeatures, rpcProtocol)));
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
suiteTeardown(() => {
|
|
|
|
|
@@ -144,10 +145,12 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
teardown(() => {
|
|
|
|
|
disposables = dispose(disposables);
|
|
|
|
|
disposables.clear();
|
|
|
|
|
return rpcProtocol.sync();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
ensureNoDisposablesAreLeakedInTestSuite();
|
|
|
|
|
|
|
|
|
|
// --- outline
|
|
|
|
|
|
|
|
|
|
test('DocumentSymbols, register/deregister', async () => {
|
|
|
|
|
@@ -166,12 +169,12 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('DocumentSymbols, evil provider', async () => {
|
|
|
|
|
disposables.push(extHost.registerDocumentSymbolProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentSymbolProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentSymbolProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentSymbolProvider {
|
|
|
|
|
provideDocumentSymbols(): any {
|
|
|
|
|
throw new Error('evil document symbol provider');
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
disposables.push(extHost.registerDocumentSymbolProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentSymbolProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentSymbolProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentSymbolProvider {
|
|
|
|
|
provideDocumentSymbols(): any {
|
|
|
|
|
return [new types.SymbolInformation('test', types.SymbolKind.Field, new types.Range(0, 0, 0, 0))];
|
|
|
|
|
}
|
|
|
|
|
@@ -183,7 +186,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('DocumentSymbols, data conversion', async () => {
|
|
|
|
|
disposables.push(extHost.registerDocumentSymbolProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentSymbolProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentSymbolProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentSymbolProvider {
|
|
|
|
|
provideDocumentSymbols(): any {
|
|
|
|
|
return [new types.SymbolInformation('test', types.SymbolKind.Field, new types.Range(0, 0, 0, 0))];
|
|
|
|
|
}
|
|
|
|
|
@@ -207,7 +210,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
{ name: 'containerPort', range: { startLineNumber: 4, startColumn: 9, endLineNumber: 4, endColumn: 26 } }
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
extHost.registerDocumentSymbolProvider(defaultExtension, defaultSelector, {
|
|
|
|
|
disposables.add(extHost.registerDocumentSymbolProvider(defaultExtension, defaultSelector, {
|
|
|
|
|
provideDocumentSymbols: (doc, token): any => {
|
|
|
|
|
return symbols.map(s => {
|
|
|
|
|
return new types.SymbolInformation(
|
|
|
|
|
@@ -217,7 +220,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
await rpcProtocol.sync();
|
|
|
|
|
|
|
|
|
|
@@ -231,12 +234,12 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('CodeLens, evil provider', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCodeLensProvider(defaultExtension, defaultSelector, new class implements vscode.CodeLensProvider {
|
|
|
|
|
disposables.add(extHost.registerCodeLensProvider(defaultExtension, defaultSelector, new class implements vscode.CodeLensProvider {
|
|
|
|
|
provideCodeLenses(): any {
|
|
|
|
|
throw new Error('evil');
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
disposables.push(extHost.registerCodeLensProvider(defaultExtension, defaultSelector, new class implements vscode.CodeLensProvider {
|
|
|
|
|
disposables.add(extHost.registerCodeLensProvider(defaultExtension, defaultSelector, new class implements vscode.CodeLensProvider {
|
|
|
|
|
provideCodeLenses() {
|
|
|
|
|
return [new types.CodeLens(new types.Range(0, 0, 0, 0))];
|
|
|
|
|
}
|
|
|
|
|
@@ -245,11 +248,12 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
await rpcProtocol.sync();
|
|
|
|
|
const value = await getCodeLensModel(languageFeaturesService.codeLensProvider, model, CancellationToken.None);
|
|
|
|
|
assert.strictEqual(value.lenses.length, 1);
|
|
|
|
|
value.dispose();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('CodeLens, do not resolve a resolved lens', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCodeLensProvider(defaultExtension, defaultSelector, new class implements vscode.CodeLensProvider {
|
|
|
|
|
disposables.add(extHost.registerCodeLensProvider(defaultExtension, defaultSelector, new class implements vscode.CodeLensProvider {
|
|
|
|
|
provideCodeLenses(): any {
|
|
|
|
|
return [new types.CodeLens(
|
|
|
|
|
new types.Range(0, 0, 0, 0),
|
|
|
|
|
@@ -267,11 +271,12 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
const symbol = await Promise.resolve(data.provider.resolveCodeLens!(model, data.symbol, CancellationToken.None));
|
|
|
|
|
assert.strictEqual(symbol!.command!.id, 'id');
|
|
|
|
|
assert.strictEqual(symbol!.command!.title, 'Title');
|
|
|
|
|
value.dispose();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('CodeLens, missing command', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCodeLensProvider(defaultExtension, defaultSelector, new class implements vscode.CodeLensProvider {
|
|
|
|
|
disposables.add(extHost.registerCodeLensProvider(defaultExtension, defaultSelector, new class implements vscode.CodeLensProvider {
|
|
|
|
|
provideCodeLenses() {
|
|
|
|
|
return [new types.CodeLens(new types.Range(0, 0, 0, 0))];
|
|
|
|
|
}
|
|
|
|
|
@@ -284,13 +289,14 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
const symbol = await Promise.resolve(data.provider.resolveCodeLens!(model, data.symbol, CancellationToken.None));
|
|
|
|
|
assert.strictEqual(symbol!.command!.id, 'missing');
|
|
|
|
|
assert.strictEqual(symbol!.command!.title, '!!MISSING: command!!');
|
|
|
|
|
value.dispose();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// --- definition
|
|
|
|
|
|
|
|
|
|
test('Definition, data conversion', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
disposables.add(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
provideDefinition(): any {
|
|
|
|
|
return [new types.Location(model.uri, new types.Range(1, 2, 3, 4))];
|
|
|
|
|
}
|
|
|
|
|
@@ -306,12 +312,12 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Definition, one or many', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
disposables.add(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
provideDefinition(): any {
|
|
|
|
|
return [new types.Location(model.uri, new types.Range(1, 1, 1, 1))];
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
disposables.add(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
provideDefinition(): any {
|
|
|
|
|
return new types.Location(model.uri, new types.Range(2, 1, 1, 1));
|
|
|
|
|
}
|
|
|
|
|
@@ -324,13 +330,13 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Definition, registration order', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
disposables.add(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
provideDefinition(): any {
|
|
|
|
|
return [new types.Location(URI.parse('far://first'), new types.Range(2, 3, 4, 5))];
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
disposables.add(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
provideDefinition(): any {
|
|
|
|
|
return new types.Location(URI.parse('far://second'), new types.Range(1, 2, 3, 4));
|
|
|
|
|
}
|
|
|
|
|
@@ -346,12 +352,12 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Definition, evil provider', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
disposables.add(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
provideDefinition(): any {
|
|
|
|
|
throw new Error('evil provider');
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
disposables.push(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
disposables.add(extHost.registerDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.DefinitionProvider {
|
|
|
|
|
provideDefinition(): any {
|
|
|
|
|
return new types.Location(model.uri, new types.Range(1, 1, 1, 1));
|
|
|
|
|
}
|
|
|
|
|
@@ -366,7 +372,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Declaration, data conversion', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDeclarationProvider(defaultExtension, defaultSelector, new class implements vscode.DeclarationProvider {
|
|
|
|
|
disposables.add(extHost.registerDeclarationProvider(defaultExtension, defaultSelector, new class implements vscode.DeclarationProvider {
|
|
|
|
|
provideDeclaration(): any {
|
|
|
|
|
return [new types.Location(model.uri, new types.Range(1, 2, 3, 4))];
|
|
|
|
|
}
|
|
|
|
|
@@ -384,7 +390,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Implementation, data conversion', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerImplementationProvider(defaultExtension, defaultSelector, new class implements vscode.ImplementationProvider {
|
|
|
|
|
disposables.add(extHost.registerImplementationProvider(defaultExtension, defaultSelector, new class implements vscode.ImplementationProvider {
|
|
|
|
|
provideImplementation(): any {
|
|
|
|
|
return [new types.Location(model.uri, new types.Range(1, 2, 3, 4))];
|
|
|
|
|
}
|
|
|
|
|
@@ -402,7 +408,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Type Definition, data conversion', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerTypeDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.TypeDefinitionProvider {
|
|
|
|
|
disposables.add(extHost.registerTypeDefinitionProvider(defaultExtension, defaultSelector, new class implements vscode.TypeDefinitionProvider {
|
|
|
|
|
provideTypeDefinition(): any {
|
|
|
|
|
return [new types.Location(model.uri, new types.Range(1, 2, 3, 4))];
|
|
|
|
|
}
|
|
|
|
|
@@ -420,7 +426,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('HoverProvider, word range at pos', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerHoverProvider(defaultExtension, defaultSelector, new class implements vscode.HoverProvider {
|
|
|
|
|
disposables.add(extHost.registerHoverProvider(defaultExtension, defaultSelector, new class implements vscode.HoverProvider {
|
|
|
|
|
provideHover(): any {
|
|
|
|
|
return new types.Hover('Hello');
|
|
|
|
|
}
|
|
|
|
|
@@ -436,7 +442,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('HoverProvider, given range', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerHoverProvider(defaultExtension, defaultSelector, new class implements vscode.HoverProvider {
|
|
|
|
|
disposables.add(extHost.registerHoverProvider(defaultExtension, defaultSelector, new class implements vscode.HoverProvider {
|
|
|
|
|
provideHover(): any {
|
|
|
|
|
return new types.Hover('Hello', new types.Range(3, 0, 8, 7));
|
|
|
|
|
}
|
|
|
|
|
@@ -451,14 +457,14 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test('HoverProvider, registration order', async () => {
|
|
|
|
|
disposables.push(extHost.registerHoverProvider(defaultExtension, defaultSelector, new class implements vscode.HoverProvider {
|
|
|
|
|
disposables.add(extHost.registerHoverProvider(defaultExtension, defaultSelector, new class implements vscode.HoverProvider {
|
|
|
|
|
provideHover(): any {
|
|
|
|
|
return new types.Hover('registered first');
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerHoverProvider(defaultExtension, defaultSelector, new class implements vscode.HoverProvider {
|
|
|
|
|
disposables.add(extHost.registerHoverProvider(defaultExtension, defaultSelector, new class implements vscode.HoverProvider {
|
|
|
|
|
provideHover(): any {
|
|
|
|
|
return new types.Hover('registered second');
|
|
|
|
|
}
|
|
|
|
|
@@ -475,12 +481,12 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('HoverProvider, evil provider', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerHoverProvider(defaultExtension, defaultSelector, new class implements vscode.HoverProvider {
|
|
|
|
|
disposables.add(extHost.registerHoverProvider(defaultExtension, defaultSelector, new class implements vscode.HoverProvider {
|
|
|
|
|
provideHover(): any {
|
|
|
|
|
throw new Error('evil');
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
disposables.push(extHost.registerHoverProvider(defaultExtension, defaultSelector, new class implements vscode.HoverProvider {
|
|
|
|
|
disposables.add(extHost.registerHoverProvider(defaultExtension, defaultSelector, new class implements vscode.HoverProvider {
|
|
|
|
|
provideHover(): any {
|
|
|
|
|
return new types.Hover('Hello');
|
|
|
|
|
}
|
|
|
|
|
@@ -495,7 +501,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Occurrences, data conversion', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
provideDocumentHighlights(): any {
|
|
|
|
|
return [new types.DocumentHighlight(new types.Range(0, 0, 0, 4))];
|
|
|
|
|
}
|
|
|
|
|
@@ -511,12 +517,12 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Occurrences, order 1/2', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
provideDocumentHighlights(): any {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, '*', new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentHighlightProvider(defaultExtension, '*', new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
provideDocumentHighlights(): any {
|
|
|
|
|
return [new types.DocumentHighlight(new types.Range(0, 0, 0, 4))];
|
|
|
|
|
}
|
|
|
|
|
@@ -532,12 +538,12 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Occurrences, order 2/2', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
provideDocumentHighlights(): any {
|
|
|
|
|
return [new types.DocumentHighlight(new types.Range(0, 0, 0, 2))];
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, '*', new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentHighlightProvider(defaultExtension, '*', new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
provideDocumentHighlights(): any {
|
|
|
|
|
return [new types.DocumentHighlight(new types.Range(0, 0, 0, 4))];
|
|
|
|
|
}
|
|
|
|
|
@@ -553,13 +559,13 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Occurrences, evil provider', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
provideDocumentHighlights(): any {
|
|
|
|
|
throw new Error('evil');
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentHighlightProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentHighlightProvider {
|
|
|
|
|
provideDocumentHighlights(): any {
|
|
|
|
|
return [new types.DocumentHighlight(new types.Range(0, 0, 0, 4))];
|
|
|
|
|
}
|
|
|
|
|
@@ -574,13 +580,13 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('References, registration order', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerReferenceProvider(defaultExtension, defaultSelector, new class implements vscode.ReferenceProvider {
|
|
|
|
|
disposables.add(extHost.registerReferenceProvider(defaultExtension, defaultSelector, new class implements vscode.ReferenceProvider {
|
|
|
|
|
provideReferences(): any {
|
|
|
|
|
return [new types.Location(URI.parse('far://register/first'), new types.Range(0, 0, 0, 0))];
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerReferenceProvider(defaultExtension, defaultSelector, new class implements vscode.ReferenceProvider {
|
|
|
|
|
disposables.add(extHost.registerReferenceProvider(defaultExtension, defaultSelector, new class implements vscode.ReferenceProvider {
|
|
|
|
|
provideReferences(): any {
|
|
|
|
|
return [new types.Location(URI.parse('far://register/second'), new types.Range(0, 0, 0, 0))];
|
|
|
|
|
}
|
|
|
|
|
@@ -596,7 +602,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('References, data conversion', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerReferenceProvider(defaultExtension, defaultSelector, new class implements vscode.ReferenceProvider {
|
|
|
|
|
disposables.add(extHost.registerReferenceProvider(defaultExtension, defaultSelector, new class implements vscode.ReferenceProvider {
|
|
|
|
|
provideReferences(): any {
|
|
|
|
|
return [new types.Location(model.uri, new types.Position(0, 0))];
|
|
|
|
|
}
|
|
|
|
|
@@ -612,12 +618,12 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('References, evil provider', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerReferenceProvider(defaultExtension, defaultSelector, new class implements vscode.ReferenceProvider {
|
|
|
|
|
disposables.add(extHost.registerReferenceProvider(defaultExtension, defaultSelector, new class implements vscode.ReferenceProvider {
|
|
|
|
|
provideReferences(): any {
|
|
|
|
|
throw new Error('evil');
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
disposables.push(extHost.registerReferenceProvider(defaultExtension, defaultSelector, new class implements vscode.ReferenceProvider {
|
|
|
|
|
disposables.add(extHost.registerReferenceProvider(defaultExtension, defaultSelector, new class implements vscode.ReferenceProvider {
|
|
|
|
|
provideReferences(): any {
|
|
|
|
|
return [new types.Location(model.uri, new types.Range(0, 0, 0, 0))];
|
|
|
|
|
}
|
|
|
|
|
@@ -632,7 +638,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Quick Fix, command data conversion', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, {
|
|
|
|
|
disposables.add(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, {
|
|
|
|
|
provideCodeActions(): vscode.Command[] {
|
|
|
|
|
return [
|
|
|
|
|
{ command: 'test1', title: 'Testing1' },
|
|
|
|
|
@@ -642,18 +648,20 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
await rpcProtocol.sync();
|
|
|
|
|
const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.QuickFix }, Progress.None, CancellationToken.None);
|
|
|
|
|
const value = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.QuickFix }, Progress.None, CancellationToken.None);
|
|
|
|
|
const { validActions: actions } = value;
|
|
|
|
|
assert.strictEqual(actions.length, 2);
|
|
|
|
|
const [first, second] = actions;
|
|
|
|
|
assert.strictEqual(first.action.title, 'Testing1');
|
|
|
|
|
assert.strictEqual(first.action.command!.id, 'test1');
|
|
|
|
|
assert.strictEqual(second.action.title, 'Testing2');
|
|
|
|
|
assert.strictEqual(second.action.command!.id, 'test2');
|
|
|
|
|
value.dispose();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('Quick Fix, code action data conversion', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, {
|
|
|
|
|
disposables.add(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, {
|
|
|
|
|
provideCodeActions(): vscode.CodeAction[] {
|
|
|
|
|
return [
|
|
|
|
|
{
|
|
|
|
|
@@ -666,19 +674,21 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
await rpcProtocol.sync();
|
|
|
|
|
const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.Default }, Progress.None, CancellationToken.None);
|
|
|
|
|
const value = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.Default }, Progress.None, CancellationToken.None);
|
|
|
|
|
const { validActions: actions } = value;
|
|
|
|
|
assert.strictEqual(actions.length, 1);
|
|
|
|
|
const [first] = actions;
|
|
|
|
|
assert.strictEqual(first.action.title, 'Testing1');
|
|
|
|
|
assert.strictEqual(first.action.command!.title, 'Testing1Command');
|
|
|
|
|
assert.strictEqual(first.action.command!.id, 'test1');
|
|
|
|
|
assert.strictEqual(first.action.kind, 'test.scope');
|
|
|
|
|
value.dispose();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test('Cannot read property \'id\' of undefined, #29469', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, new class implements vscode.CodeActionProvider {
|
|
|
|
|
disposables.add(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, new class implements vscode.CodeActionProvider {
|
|
|
|
|
provideCodeActions(): any {
|
|
|
|
|
return [
|
|
|
|
|
undefined,
|
|
|
|
|
@@ -689,39 +699,43 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
await rpcProtocol.sync();
|
|
|
|
|
const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.Default }, Progress.None, CancellationToken.None);
|
|
|
|
|
const value = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.Default }, Progress.None, CancellationToken.None);
|
|
|
|
|
const { validActions: actions } = value;
|
|
|
|
|
assert.strictEqual(actions.length, 1);
|
|
|
|
|
value.dispose();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('Quick Fix, evil provider', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, new class implements vscode.CodeActionProvider {
|
|
|
|
|
disposables.add(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, new class implements vscode.CodeActionProvider {
|
|
|
|
|
provideCodeActions(): any {
|
|
|
|
|
throw new Error('evil');
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
disposables.push(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, new class implements vscode.CodeActionProvider {
|
|
|
|
|
disposables.add(extHost.registerCodeActionProvider(defaultExtension, defaultSelector, new class implements vscode.CodeActionProvider {
|
|
|
|
|
provideCodeActions(): any {
|
|
|
|
|
return [{ command: 'test', title: 'Testing' }];
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
await rpcProtocol.sync();
|
|
|
|
|
const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.QuickFix }, Progress.None, CancellationToken.None);
|
|
|
|
|
const value = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke, triggerAction: CodeActionTriggerSource.QuickFix }, Progress.None, CancellationToken.None);
|
|
|
|
|
const { validActions: actions } = value;
|
|
|
|
|
assert.strictEqual(actions.length, 1);
|
|
|
|
|
value.dispose();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// --- navigate types
|
|
|
|
|
|
|
|
|
|
test('Navigate types, evil provider', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerWorkspaceSymbolProvider(defaultExtension, new class implements vscode.WorkspaceSymbolProvider {
|
|
|
|
|
disposables.add(extHost.registerWorkspaceSymbolProvider(defaultExtension, new class implements vscode.WorkspaceSymbolProvider {
|
|
|
|
|
provideWorkspaceSymbols(): any {
|
|
|
|
|
throw new Error('evil');
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerWorkspaceSymbolProvider(defaultExtension, new class implements vscode.WorkspaceSymbolProvider {
|
|
|
|
|
disposables.add(extHost.registerWorkspaceSymbolProvider(defaultExtension, new class implements vscode.WorkspaceSymbolProvider {
|
|
|
|
|
provideWorkspaceSymbols(): any {
|
|
|
|
|
return [new types.SymbolInformation('testing', types.SymbolKind.Array, new types.Range(0, 0, 1, 1))];
|
|
|
|
|
}
|
|
|
|
|
@@ -736,19 +750,19 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Navigate types, de-duplicate results', async () => {
|
|
|
|
|
const uri = URI.from({ scheme: 'foo', path: '/some/path' });
|
|
|
|
|
disposables.push(extHost.registerWorkspaceSymbolProvider(defaultExtension, new class implements vscode.WorkspaceSymbolProvider {
|
|
|
|
|
disposables.add(extHost.registerWorkspaceSymbolProvider(defaultExtension, new class implements vscode.WorkspaceSymbolProvider {
|
|
|
|
|
provideWorkspaceSymbols(): any {
|
|
|
|
|
return [new types.SymbolInformation('ONE', types.SymbolKind.Array, undefined, new types.Location(uri, new types.Range(0, 0, 1, 1)))];
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerWorkspaceSymbolProvider(defaultExtension, new class implements vscode.WorkspaceSymbolProvider {
|
|
|
|
|
disposables.add(extHost.registerWorkspaceSymbolProvider(defaultExtension, new class implements vscode.WorkspaceSymbolProvider {
|
|
|
|
|
provideWorkspaceSymbols(): any {
|
|
|
|
|
return [new types.SymbolInformation('ONE', types.SymbolKind.Array, undefined, new types.Location(uri, new types.Range(0, 0, 1, 1)))]; // get de-duped
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerWorkspaceSymbolProvider(defaultExtension, new class implements vscode.WorkspaceSymbolProvider {
|
|
|
|
|
disposables.add(extHost.registerWorkspaceSymbolProvider(defaultExtension, new class implements vscode.WorkspaceSymbolProvider {
|
|
|
|
|
provideWorkspaceSymbols(): any {
|
|
|
|
|
return [new types.SymbolInformation('ONE', types.SymbolKind.Array, undefined, new types.Location(uri, undefined!))]; // NO dedupe because of resolve
|
|
|
|
|
}
|
|
|
|
|
@@ -757,7 +771,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerWorkspaceSymbolProvider(defaultExtension, new class implements vscode.WorkspaceSymbolProvider {
|
|
|
|
|
disposables.add(extHost.registerWorkspaceSymbolProvider(defaultExtension, new class implements vscode.WorkspaceSymbolProvider {
|
|
|
|
|
provideWorkspaceSymbols(): any {
|
|
|
|
|
return [new types.SymbolInformation('ONE', types.SymbolKind.Struct, undefined, new types.Location(uri, new types.Range(0, 0, 1, 1)))]; // NO dedupe because of kind
|
|
|
|
|
}
|
|
|
|
|
@@ -772,7 +786,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Rename, evil provider 0/2', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
disposables.add(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
provideRenameEdits(): any {
|
|
|
|
|
throw new class Foo { };
|
|
|
|
|
}
|
|
|
|
|
@@ -790,7 +804,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Rename, evil provider 1/2', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
disposables.add(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
provideRenameEdits(): any {
|
|
|
|
|
throw Error('evil');
|
|
|
|
|
}
|
|
|
|
|
@@ -803,13 +817,13 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Rename, evil provider 2/2', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerRenameProvider(defaultExtension, '*', new class implements vscode.RenameProvider {
|
|
|
|
|
disposables.add(extHost.registerRenameProvider(defaultExtension, '*', new class implements vscode.RenameProvider {
|
|
|
|
|
provideRenameEdits(): any {
|
|
|
|
|
throw Error('evil');
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
disposables.add(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
provideRenameEdits(): any {
|
|
|
|
|
const edit = new types.WorkspaceEdit();
|
|
|
|
|
edit.replace(model.uri, new types.Range(0, 0, 0, 0), 'testing');
|
|
|
|
|
@@ -824,7 +838,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Rename, ordering', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerRenameProvider(defaultExtension, '*', new class implements vscode.RenameProvider {
|
|
|
|
|
disposables.add(extHost.registerRenameProvider(defaultExtension, '*', new class implements vscode.RenameProvider {
|
|
|
|
|
provideRenameEdits(): any {
|
|
|
|
|
const edit = new types.WorkspaceEdit();
|
|
|
|
|
edit.replace(model.uri, new types.Range(0, 0, 0, 0), 'testing');
|
|
|
|
|
@@ -833,7 +847,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
disposables.add(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
provideRenameEdits(): any {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
@@ -849,7 +863,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
const called = [false, false, false, false];
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
disposables.add(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
prepareRename(document: vscode.TextDocument, position: vscode.Position,): vscode.ProviderResult<vscode.Range> {
|
|
|
|
|
called[0] = true;
|
|
|
|
|
const range = document.getWordRangeAtPosition(position);
|
|
|
|
|
@@ -862,7 +876,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
disposables.add(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
prepareRename(document: vscode.TextDocument, position: vscode.Position,): vscode.ProviderResult<vscode.Range> {
|
|
|
|
|
called[2] = true;
|
|
|
|
|
return Promise.reject('Cannot rename this symbol2.');
|
|
|
|
|
@@ -883,7 +897,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
const called = [false, false, false];
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
disposables.add(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
prepareRename(document: vscode.TextDocument, position: vscode.Position,): vscode.ProviderResult<vscode.Range> {
|
|
|
|
|
called[0] = true;
|
|
|
|
|
const range = document.getWordRangeAtPosition(position);
|
|
|
|
|
@@ -896,7 +910,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
disposables.add(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider {
|
|
|
|
|
|
|
|
|
|
provideRenameEdits(document: vscode.TextDocument, position: vscode.Position, newName: string,): vscode.ProviderResult<vscode.WorkspaceEdit> {
|
|
|
|
|
called[2] = true;
|
|
|
|
|
@@ -915,13 +929,13 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Parameter Hints, order', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerSignatureHelpProvider(defaultExtension, defaultSelector, new class implements vscode.SignatureHelpProvider {
|
|
|
|
|
disposables.add(extHost.registerSignatureHelpProvider(defaultExtension, defaultSelector, new class implements vscode.SignatureHelpProvider {
|
|
|
|
|
provideSignatureHelp(): any {
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
}, []));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerSignatureHelpProvider(defaultExtension, defaultSelector, new class implements vscode.SignatureHelpProvider {
|
|
|
|
|
disposables.add(extHost.registerSignatureHelpProvider(defaultExtension, defaultSelector, new class implements vscode.SignatureHelpProvider {
|
|
|
|
|
provideSignatureHelp(): vscode.SignatureHelp {
|
|
|
|
|
return {
|
|
|
|
|
signatures: [],
|
|
|
|
|
@@ -938,7 +952,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Parameter Hints, evil provider', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerSignatureHelpProvider(defaultExtension, defaultSelector, new class implements vscode.SignatureHelpProvider {
|
|
|
|
|
disposables.add(extHost.registerSignatureHelpProvider(defaultExtension, defaultSelector, new class implements vscode.SignatureHelpProvider {
|
|
|
|
|
provideSignatureHelp(): any {
|
|
|
|
|
throw new Error('evil');
|
|
|
|
|
}
|
|
|
|
|
@@ -953,74 +967,77 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Suggest, order 1/3', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCompletionItemProvider(defaultExtension, '*', new class implements vscode.CompletionItemProvider {
|
|
|
|
|
disposables.add(extHost.registerCompletionItemProvider(defaultExtension, '*', new class implements vscode.CompletionItemProvider {
|
|
|
|
|
provideCompletionItems(): any {
|
|
|
|
|
return [new types.CompletionItem('testing1')];
|
|
|
|
|
}
|
|
|
|
|
}, []));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
disposables.add(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
provideCompletionItems(): any {
|
|
|
|
|
return [new types.CompletionItem('testing2')];
|
|
|
|
|
}
|
|
|
|
|
}, []));
|
|
|
|
|
|
|
|
|
|
await rpcProtocol.sync();
|
|
|
|
|
const { items } = await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set<languages.CompletionItemKind>().add(languages.CompletionItemKind.Snippet)));
|
|
|
|
|
assert.strictEqual(items.length, 1);
|
|
|
|
|
assert.strictEqual(items[0].completion.insertText, 'testing2');
|
|
|
|
|
const value = await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set<languages.CompletionItemKind>().add(languages.CompletionItemKind.Snippet)));
|
|
|
|
|
assert.strictEqual(value.items.length, 1);
|
|
|
|
|
assert.strictEqual(value.items[0].completion.insertText, 'testing2');
|
|
|
|
|
value.disposable.dispose();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('Suggest, order 2/3', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCompletionItemProvider(defaultExtension, '*', new class implements vscode.CompletionItemProvider {
|
|
|
|
|
disposables.add(extHost.registerCompletionItemProvider(defaultExtension, '*', new class implements vscode.CompletionItemProvider {
|
|
|
|
|
provideCompletionItems(): any {
|
|
|
|
|
return [new types.CompletionItem('weak-selector')]; // weaker selector but result
|
|
|
|
|
}
|
|
|
|
|
}, []));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
disposables.add(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
provideCompletionItems(): any {
|
|
|
|
|
return []; // stronger selector but not a good result;
|
|
|
|
|
}
|
|
|
|
|
}, []));
|
|
|
|
|
|
|
|
|
|
await rpcProtocol.sync();
|
|
|
|
|
const { items } = await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set<languages.CompletionItemKind>().add(languages.CompletionItemKind.Snippet)));
|
|
|
|
|
assert.strictEqual(items.length, 1);
|
|
|
|
|
assert.strictEqual(items[0].completion.insertText, 'weak-selector');
|
|
|
|
|
const value = await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set<languages.CompletionItemKind>().add(languages.CompletionItemKind.Snippet)));
|
|
|
|
|
assert.strictEqual(value.items.length, 1);
|
|
|
|
|
assert.strictEqual(value.items[0].completion.insertText, 'weak-selector');
|
|
|
|
|
value.disposable.dispose();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('Suggest, order 3/3', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
disposables.add(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
provideCompletionItems(): any {
|
|
|
|
|
return [new types.CompletionItem('strong-1')];
|
|
|
|
|
}
|
|
|
|
|
}, []));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
disposables.add(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
provideCompletionItems(): any {
|
|
|
|
|
return [new types.CompletionItem('strong-2')];
|
|
|
|
|
}
|
|
|
|
|
}, []));
|
|
|
|
|
|
|
|
|
|
await rpcProtocol.sync();
|
|
|
|
|
const { items } = await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set<languages.CompletionItemKind>().add(languages.CompletionItemKind.Snippet)));
|
|
|
|
|
assert.strictEqual(items.length, 2);
|
|
|
|
|
assert.strictEqual(items[0].completion.insertText, 'strong-1'); // sort by label
|
|
|
|
|
assert.strictEqual(items[1].completion.insertText, 'strong-2');
|
|
|
|
|
const value = await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set<languages.CompletionItemKind>().add(languages.CompletionItemKind.Snippet)));
|
|
|
|
|
assert.strictEqual(value.items.length, 2);
|
|
|
|
|
assert.strictEqual(value.items[0].completion.insertText, 'strong-1'); // sort by label
|
|
|
|
|
assert.strictEqual(value.items[1].completion.insertText, 'strong-2');
|
|
|
|
|
value.disposable.dispose();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('Suggest, evil provider', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
disposables.add(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
provideCompletionItems(): any {
|
|
|
|
|
throw new Error('evil');
|
|
|
|
|
}
|
|
|
|
|
}, []));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
disposables.add(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
provideCompletionItems(): any {
|
|
|
|
|
return [new types.CompletionItem('testing')];
|
|
|
|
|
}
|
|
|
|
|
@@ -1028,13 +1045,15 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await rpcProtocol.sync();
|
|
|
|
|
const { items } = await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set<languages.CompletionItemKind>().add(languages.CompletionItemKind.Snippet)));
|
|
|
|
|
assert.strictEqual(items[0].container.incomplete, false);
|
|
|
|
|
const value = await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set<languages.CompletionItemKind>().add(languages.CompletionItemKind.Snippet)));
|
|
|
|
|
assert.strictEqual(value.items[0].container.incomplete, false);
|
|
|
|
|
value.disposable.dispose();
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('Suggest, CompletionList', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
disposables.add(extHost.registerCompletionItemProvider(defaultExtension, defaultSelector, new class implements vscode.CompletionItemProvider {
|
|
|
|
|
provideCompletionItems(): any {
|
|
|
|
|
return new types.CompletionList([<any>new types.CompletionItem('hello')], true);
|
|
|
|
|
}
|
|
|
|
|
@@ -1043,6 +1062,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
await rpcProtocol.sync();
|
|
|
|
|
await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set<languages.CompletionItemKind>().add(languages.CompletionItemKind.Snippet))).then(model => {
|
|
|
|
|
assert.strictEqual(model.items[0].container.incomplete, true);
|
|
|
|
|
model.disposable.dispose();
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -1055,7 +1075,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
test('Format Doc, data conversion', async () => {
|
|
|
|
|
disposables.push(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentFormattingEditProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentFormattingEditProvider {
|
|
|
|
|
provideDocumentFormattingEdits(): any {
|
|
|
|
|
return [new types.TextEdit(new types.Range(0, 0, 0, 0), 'testing'), types.TextEdit.setEndOfLine(types.EndOfLine.LF)];
|
|
|
|
|
}
|
|
|
|
|
@@ -1073,7 +1093,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('Format Doc, evil provider', async () => {
|
|
|
|
|
disposables.push(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentFormattingEditProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentFormattingEditProvider {
|
|
|
|
|
provideDocumentFormattingEdits(): any {
|
|
|
|
|
throw new Error('evil');
|
|
|
|
|
}
|
|
|
|
|
@@ -1085,19 +1105,19 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Format Doc, order', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentFormattingEditProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentFormattingEditProvider {
|
|
|
|
|
provideDocumentFormattingEdits(): any {
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentFormattingEditProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentFormattingEditProvider {
|
|
|
|
|
provideDocumentFormattingEdits(): any {
|
|
|
|
|
return [new types.TextEdit(new types.Range(0, 0, 0, 0), 'testing')];
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentFormattingEditProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentFormattingEditProvider {
|
|
|
|
|
provideDocumentFormattingEdits(): any {
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
@@ -1112,7 +1132,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('Format Range, data conversion', async () => {
|
|
|
|
|
disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentRangeFormattingEditProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentRangeFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentRangeFormattingEditProvider {
|
|
|
|
|
provideDocumentRangeFormattingEdits(): any {
|
|
|
|
|
return [new types.TextEdit(new types.Range(0, 0, 0, 0), 'testing')];
|
|
|
|
|
}
|
|
|
|
|
@@ -1127,17 +1147,17 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('Format Range, + format_doc', async () => {
|
|
|
|
|
disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentRangeFormattingEditProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentRangeFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentRangeFormattingEditProvider {
|
|
|
|
|
provideDocumentRangeFormattingEdits(): any {
|
|
|
|
|
return [new types.TextEdit(new types.Range(0, 0, 0, 0), 'range')];
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentRangeFormattingEditProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentRangeFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentRangeFormattingEditProvider {
|
|
|
|
|
provideDocumentRangeFormattingEdits(): any {
|
|
|
|
|
return [new types.TextEdit(new types.Range(2, 3, 4, 5), 'range2')];
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
disposables.push(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentFormattingEditProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentFormattingEditProvider {
|
|
|
|
|
provideDocumentFormattingEdits(): any {
|
|
|
|
|
return [new types.TextEdit(new types.Range(0, 0, 1, 1), 'doc')];
|
|
|
|
|
}
|
|
|
|
|
@@ -1154,7 +1174,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('Format Range, evil provider', async () => {
|
|
|
|
|
disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentRangeFormattingEditProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentRangeFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentRangeFormattingEditProvider {
|
|
|
|
|
provideDocumentRangeFormattingEdits(): any {
|
|
|
|
|
throw new Error('evil');
|
|
|
|
|
}
|
|
|
|
|
@@ -1166,7 +1186,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Format on Type, data conversion', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerOnTypeFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.OnTypeFormattingEditProvider {
|
|
|
|
|
disposables.add(extHost.registerOnTypeFormattingEditProvider(defaultExtension, defaultSelector, new class implements vscode.OnTypeFormattingEditProvider {
|
|
|
|
|
provideOnTypeFormattingEdits(): any {
|
|
|
|
|
return [new types.TextEdit(new types.Range(0, 0, 0, 0), arguments[2])];
|
|
|
|
|
}
|
|
|
|
|
@@ -1182,7 +1202,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Links, data conversion', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDocumentLinkProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentLinkProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentLinkProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentLinkProvider {
|
|
|
|
|
provideDocumentLinks() {
|
|
|
|
|
const link = new types.DocumentLink(new types.Range(0, 0, 1, 1), URI.parse('foo:bar#3'));
|
|
|
|
|
link.tooltip = 'tooltip';
|
|
|
|
|
@@ -1191,7 +1211,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
await rpcProtocol.sync();
|
|
|
|
|
const { links } = await getLinks(languageFeaturesService.linkProvider, model, CancellationToken.None);
|
|
|
|
|
const { links } = disposables.add(await getLinks(languageFeaturesService.linkProvider, model, CancellationToken.None));
|
|
|
|
|
assert.strictEqual(links.length, 1);
|
|
|
|
|
const [first] = links;
|
|
|
|
|
assert.strictEqual(first.url?.toString(), 'foo:bar#3');
|
|
|
|
|
@@ -1201,20 +1221,20 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Links, evil provider', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDocumentLinkProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentLinkProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentLinkProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentLinkProvider {
|
|
|
|
|
provideDocumentLinks() {
|
|
|
|
|
return [new types.DocumentLink(new types.Range(0, 0, 1, 1), URI.parse('foo:bar#3'))];
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerDocumentLinkProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentLinkProvider {
|
|
|
|
|
disposables.add(extHost.registerDocumentLinkProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentLinkProvider {
|
|
|
|
|
provideDocumentLinks(): any {
|
|
|
|
|
throw new Error();
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
await rpcProtocol.sync();
|
|
|
|
|
const { links } = await getLinks(languageFeaturesService.linkProvider, model, CancellationToken.None);
|
|
|
|
|
const { links } = disposables.add(await getLinks(languageFeaturesService.linkProvider, model, CancellationToken.None));
|
|
|
|
|
assert.strictEqual(links.length, 1);
|
|
|
|
|
const [first] = links;
|
|
|
|
|
assert.strictEqual(first.url?.toString(), 'foo:bar#3');
|
|
|
|
|
@@ -1223,7 +1243,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
|
|
|
|
|
test('Document colors, data conversion', async () => {
|
|
|
|
|
|
|
|
|
|
disposables.push(extHost.registerColorProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentColorProvider {
|
|
|
|
|
disposables.add(extHost.registerColorProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentColorProvider {
|
|
|
|
|
provideDocumentColors(): vscode.ColorInformation[] {
|
|
|
|
|
return [new types.ColorInformation(new types.Range(0, 0, 0, 20), new types.Color(0.1, 0.2, 0.3, 0.4))];
|
|
|
|
|
}
|
|
|
|
|
@@ -1243,7 +1263,7 @@ suite('ExtHostLanguageFeatures', function () {
|
|
|
|
|
// -- selection ranges
|
|
|
|
|
|
|
|
|
|
test('Selection Ranges, data conversion', async () => {
|
|
|
|
|
disposables.push(extHost.registerSelectionRangeProvider(defaultExtension, defaultSelector, new class implements vscode.SelectionRangeProvider {
|
|
|
|
|
disposables.add(extHost.registerSelectionRangeProvider(defaultExtension, defaultSelector, new class implements vscode.SelectionRangeProvider {
|
|
|
|
|
provideSelectionRanges() {
|
|
|
|
|
return [
|
|
|
|
|
new types.SelectionRange(new types.Range(0, 10, 0, 18), new types.SelectionRange(new types.Range(0, 2, 0, 20))),
|
|
|
|
|
|