Skip to content

Commit

Permalink
refactor: provide trigger characters in plugins
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsoncodehk committed Mar 20, 2022
1 parent d5fb03c commit 335ae83
Show file tree
Hide file tree
Showing 20 changed files with 138 additions and 222 deletions.
13 changes: 0 additions & 13 deletions extensions/vscode-vue-language-features/scripts/build-browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,6 @@ require('esbuild').build({
plugins: [{
name: 'node-deps',
setup(build) {
// build.onResolve({ filter: /^(vscode-.*|estree-walker|jsonc-parser)/ }, args => {
// const pathUmdMay = require.resolve(args.path, { paths: [args.resolveDir] })
// const pathEsm = pathUmdMay.replace('/umd/', '/esm/')
// return { path: pathEsm }
// })
build.onResolve({ filter: /^\@vue\/.*$/ }, args => {
const pathUmdMay = require.resolve(args.path, { paths: [args.resolveDir] })
const pathEsm = pathUmdMay.replace('.cjs.', '.esm-browser.')
Expand Down Expand Up @@ -47,17 +42,9 @@ require('esbuild').build({
plugins: [{
name: 'node-deps',
setup(build) {
// build.onResolve({ filter: /^(vscode-.*|estree-walker|jsonc-parser)/ }, args => {
// const pathUmdMay = require.resolve(args.path, { paths: [args.resolveDir] })
// const pathEsm = pathUmdMay.replace('/umd/', '/esm/')
// if (pathUmdMay !== pathEsm)
// console.log(pathUmdMay)
// return { path: pathEsm }
// })
build.onResolve({ filter: /^vscode-.*-languageservice$/ }, args => {
const pathUmdMay = require.resolve(args.path, { paths: [args.resolveDir] })
const pathEsm = pathUmdMay.replace('/umd/', '/esm/')
console.log(pathUmdMay, pathEsm)
return { path: pathEsm }
})
build.onResolve({ filter: /^\@vue\/.*$/ }, args => {
Expand Down
13 changes: 5 additions & 8 deletions packages/typescript-language-service/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import * as vscode from 'vscode-languageserver-protocol';
import * as completions from './services/completion';
import * as completions2 from './services/completion2';
import * as directiveCommentCompletions from './services/directiveCommentCompletions';
import * as jsDocCompletions from './services/jsDocCompletions';
import * as completionResolve from './services/completionResolve';
import * as completions from './services/completions/basic';
import * as directiveCommentCompletions from './services/completions/directiveComment';
import * as jsDocCompletions from './services/completions/jsDoc';
import * as completionResolve from './services/completions/resolve';
import * as definitions from './services/definition';
import * as typeDefinitions from './services/typeDefinition';
import * as references from './services/references';
Expand All @@ -30,7 +29,6 @@ import type * as ts from 'typescript/lib/tsserverlibrary';

export interface LanguageService extends ReturnType<typeof createLanguageService> { }
export { getSemanticTokenLegend } from './services/semanticTokens';
export { getTriggerCharacters } from './services/completion';
import * as path from 'path';

export interface Settings {
Expand Down Expand Up @@ -61,7 +59,7 @@ export function createLanguageService(
findDocumentHighlights: documentHighlight.register(languageService, getValidTextDocument, ts),
findDocumentSymbols: documentSymbol.register(languageService, getValidTextDocument),
findWorkspaceSymbols: workspaceSymbols.register(languageService, getTextDocument),
doComplete: completions2.register(languageService, getValidTextDocument, settings, ts),
doComplete: completions.register(languageService, getValidTextDocument, settings, ts),
doCompletionResolve: completionResolve.register(languageService, getValidTextDocument, getTextDocument, settings),
doDirectiveCommentComplete: directiveCommentCompletions.register(getValidTextDocument),
doJsDocComplete: jsDocCompletions.register(languageService, getValidTextDocument),
Expand All @@ -82,7 +80,6 @@ export function createLanguageService(
getTextDocument,
getValidTextDocument,
isValidFile,
doCompleteSync: completions.register(languageService, getValidTextDocument, ts),
},
};

Expand Down
26 changes: 0 additions & 26 deletions packages/typescript-language-service/src/services/completion2.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import type * as ts from 'typescript/lib/tsserverlibrary';
import * as PConst from '../protocol.const';
import * as PConst from '../../protocol.const';
import * as vscode from 'vscode-languageserver-protocol';
import type { TextDocument } from 'vscode-languageserver-textdocument';
import * as shared from '@volar/shared';
import * as semver from 'semver';
import { parseKindModifier } from '../utils/modifiers';
import { parseKindModifier } from '../../utils/modifiers';
import { Settings } from '../..';

export interface Data {
uri: string,
Expand All @@ -13,40 +14,33 @@ export interface Data {
originalItem: ts.CompletionEntry
}

export function getTriggerCharacters(tsVersion: string) {

const triggerCharacters = ['.', '"', '\'', '`', '/', '<'];

// https://github.com/microsoft/vscode/blob/8e65ae28d5fb8b3c931135da1a41edb9c80ae46f/extensions/typescript-language-features/src/languageFeatures/completions.ts#L811-L833
if (semver.lt(tsVersion, '3.1.0') || semver.gte(tsVersion, '3.2.0')) {
triggerCharacters.push('@');
}
if (semver.gte(tsVersion, '3.8.1')) {
triggerCharacters.push('#');
}
if (semver.gte(tsVersion, '4.3.0')) {
triggerCharacters.push(' ');
}

return triggerCharacters;
}

export function register(
languageService: ts.LanguageService,
getTextDocument: (uri: string) => TextDocument | undefined,
settings: Settings,
ts: typeof import('typescript/lib/tsserverlibrary'),
) {
return (uri: string, position: vscode.Position, options?: ts.GetCompletionsAtPositionOptions): vscode.CompletionList | undefined => {

return async (uri: string, position: vscode.Position, options?: ts.GetCompletionsAtPositionOptions): Promise<vscode.CompletionList | undefined> => {

const document = getTextDocument(uri);
if (!document) return;
if (!document)
return;

const preferences = await settings.getPreferences?.(document) ?? {};
const fileName = shared.uriToFsPath(document.uri);
const offset = document.offsetAt(position);

let completionContext: ReturnType<typeof languageService.getCompletionsAtPosition> | undefined;
try { completionContext = languageService.getCompletionsAtPosition(fileName, offset, options); } catch { }
if (completionContext === undefined) return;
try {
completionContext = languageService.getCompletionsAtPosition(fileName, offset, {
...preferences,
...options,
});
} catch { }

if (completionContext === undefined)
return;

const wordRange = completionContext.optionalReplacementSpan ? vscode.Range.create(
document.positionAt(completionContext.optionalReplacementSpan.start),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import type * as ts from 'typescript/lib/tsserverlibrary';
import * as vscode from 'vscode-languageserver-protocol';
import { TextDocument } from 'vscode-languageserver-textdocument';
import { entriesToLocations } from '../utils/transforms';
import { handleKindModifiers } from './completion';
import type { Data } from './completion';
import * as previewer from '../utils/previewer';
import { entriesToLocations } from '../../utils/transforms';
import { handleKindModifiers } from './basic';
import type { Data } from './basic';
import * as previewer from '../../utils/previewer';
import * as shared from '@volar/shared';
import type { Settings } from '../';
import type { Settings } from '../..';

export function register(
languageService: ts.LanguageService,
Expand All @@ -16,7 +16,11 @@ export function register(
) {
return async (item: vscode.CompletionItem, newPosition?: vscode.Position): Promise<vscode.CompletionItem> => {

const data: Data = item.data as any;
const data: Data | undefined = item.data as any;

if (!data)
return item;

const fileName = data.fileName;
let offset = data.offset;
const document = getTextDocument(data.uri);
Expand Down
2 changes: 1 addition & 1 deletion packages/vue-language-server/src/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ export function createLanguageServer(connection: vscode.Connection, runtimeEnv:

(await import('./features/customFeatures')).register(connection, documents, () => projects);
(await import('./features/languageFeatures')).register(ts, connection, documents, () => projects, options.languageFeatures, params);
(await import('./registers/registerlanguageFeatures')).register(options.languageFeatures!, vue.getSemanticTokenLegend(), result.capabilities, ts.version);
(await import('./registers/registerlanguageFeatures')).register(options.languageFeatures!, vue.getSemanticTokenLegend(), result.capabilities);

connection.onInitialized(async () => {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ export function register(
features: NonNullable<shared.ServerInitializationOptions['languageFeatures']>,
legend: vscode.SemanticTokensLegend,
server: vscode.ServerCapabilities,
tsVersion: string,
) {
if (features.references) {
server.referencesProvider = true;
Expand Down Expand Up @@ -54,9 +53,8 @@ export function register(
};
}
if (features.completion) {
const triggerCharacters = vue.getTriggerCharacters(tsVersion);
server.completionProvider = {
triggerCharacters: Object.values(triggerCharacters).flat(),
triggerCharacters: '!@#$%^&*()_+-=`~{}|[]\:";\'<>?,./'.split(''), // all symbols on keyboard
resolveProvider: true,
};
server.executeCommandProvider = {
Expand Down
9 changes: 6 additions & 3 deletions packages/vue-language-service-types/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ type NullableResult<T> = NotNullableResult<T | undefined | null>;
export type SemanticToken = [number, number, number, number, number];

export interface ConfigurationHost {
getConfiguration: (<T> (section: string, scopeUri?: string) => Promise<T | undefined>),
onDidChangeConfiguration: (cb: () => void) => void,
rootUris: string[],
getConfiguration: (<T> (section: string, scopeUri?: string) => Promise<T | undefined>),
onDidChangeConfiguration: (cb: () => void) => void,
rootUris: string[],
}

export interface ExecuteCommandContext {
Expand All @@ -26,6 +26,9 @@ export interface ExecuteCommandContext {
}

export type EmbeddedLanguageServicePlugin = {

triggerCharacters?: string[],

doValidation?(document: TextDocument, options: {
semantic?: boolean;
syntactic?: boolean;
Expand Down
3 changes: 3 additions & 0 deletions packages/vue-language-service/src/commonPlugins/css.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ export default function (host: {
getStylesheet,
getCssLs,

// https://github.com/microsoft/vscode/blob/09850876e652688fb142e2e19fd00fd38c0bc4ba/extensions/css-language-features/server/src/cssServer.ts#L97
triggerCharacters: ['/', '-', ':'],

async doValidation(document) {
return worker(document, async (stylesheet, cssLs) => {

Expand Down

This file was deleted.

3 changes: 3 additions & 0 deletions packages/vue-language-service/src/commonPlugins/html.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ export default function (host: {
getHtmlDocument,
getHtmlDataProviders: () => customData,

// https://github.com/microsoft/vscode/blob/09850876e652688fb142e2e19fd00fd38c0bc4ba/extensions/html-language-features/server/src/htmlServer.ts#L183
triggerCharacters: ['.', ':', '<', '"', '=', '/'],

async doComplete(document, position, context) {
return worker(document, (htmlDocument) => {

Expand Down
25 changes: 0 additions & 25 deletions packages/vue-language-service/src/commonPlugins/jsDoc.ts

This file was deleted.

3 changes: 3 additions & 0 deletions packages/vue-language-service/src/commonPlugins/json.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ export default function (host: {

return {

// https://github.com/microsoft/vscode/blob/09850876e652688fb142e2e19fd00fd38c0bc4ba/extensions/json-language-features/server/src/jsonServer.ts#L150
triggerCharacters: ['"', ':'],

doValidation(document) {
return worker(document, async (jsonDocument) => {

Expand Down

0 comments on commit 335ae83

Please sign in to comment.