Skip to content

Commit

Permalink
refactor(typescript): reorganize code
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsoncodehk committed Mar 8, 2024
1 parent 411857c commit 6e79999
Show file tree
Hide file tree
Showing 33 changed files with 543 additions and 785 deletions.
313 changes: 185 additions & 128 deletions packages/typescript/index.ts

Large diffs are not rendered by default.

5 changes: 2 additions & 3 deletions packages/typescript/lib/configs/getFormatCodeSettings.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import type { FormattingOptions } from '@volar/language-service';
import type { FormattingOptions, ServiceContext } from '@volar/language-service';
import type * as ts from 'typescript';
import type { TextDocument } from 'vscode-languageserver-textdocument';
import { getConfigTitle } from '../shared';
import type { SharedContext } from '../types';

export async function getFormatCodeSettings(
ctx: SharedContext,
ctx: ServiceContext,
document: TextDocument,
options?: FormattingOptions,
): Promise<ts.FormatCodeSettings> {
Expand Down
113 changes: 0 additions & 113 deletions packages/typescript/lib/features/callHierarchy.ts

This file was deleted.

19 changes: 8 additions & 11 deletions packages/typescript/lib/features/codeAction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import type { SharedContext } from '../types';
import * as fixNames from '../utils/fixNames';
import { resolveFixAllCodeAction, resolveOrganizeImportsCodeAction, resolveRefactorCodeAction } from './codeActionResolve';
import { fileTextChangesToWorkspaceEdit } from './rename';
import type { TextDocument } from 'vscode-languageserver-textdocument';

export interface FixAllData {
type: 'fixAll',
Expand Down Expand Up @@ -42,11 +43,7 @@ export function register(ctx: SharedContext) {
resolveEditSupport = true;
}

return async (uri: string, range: vscode.Range, context: vscode.CodeActionContext) => {

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

return async (document: TextDocument, range: vscode.Range, context: vscode.CodeActionContext) => {
const [formatOptions, preferences] = await Promise.all([
getFormatCodeSettings(ctx, document),
getUserPreferences(ctx, document),
Expand Down Expand Up @@ -111,7 +108,7 @@ export function register(ctx: SharedContext) {
};
const data: OrganizeImportsData = {
type: 'organizeImports',
uri,
uri: document.uri,
fileName,
};
if (resolveEditSupport) {
Expand All @@ -130,7 +127,7 @@ export function register(ctx: SharedContext) {
kind: onlySourceFixAll,
};
const data: FixAllData = {
uri,
uri: document.uri,
type: 'fixAll',
fileName,
fixIds: [
Expand All @@ -155,7 +152,7 @@ export function register(ctx: SharedContext) {
kind: onlyRemoveUnused,
};
const data: FixAllData = {
uri,
uri: document.uri,
type: 'fixAll',
fileName,
fixIds: [
Expand Down Expand Up @@ -184,7 +181,7 @@ export function register(ctx: SharedContext) {
kind: onlyAddMissingImports,
};
const data: FixAllData = {
uri,
uri: document.uri,
type: 'fixAll',
fileName,
fixIds: [
Expand Down Expand Up @@ -250,7 +247,7 @@ export function register(ctx: SharedContext) {
kind,
};
const data: FixAllData = {
uri,
uri: document.uri,
type: 'fixAll',
fileName,
fixIds: [codeFix.fixId],
Expand Down Expand Up @@ -280,7 +277,7 @@ export function register(ctx: SharedContext) {
codeAction.isPreferred = true;
}
const data: RefactorData = {
uri,
uri: document.uri,
type: 'refactor',
fileName,
range: { pos: start, end: end },
Expand Down
6 changes: 3 additions & 3 deletions packages/typescript/lib/features/codeActionResolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ export function register(ctx: SharedContext) {

const data: Data = codeAction.data;
const document = ctx.getTextDocument(data.uri);
const [formatOptions, preferences] = document ? await Promise.all([
const [formatOptions, preferences] = await Promise.all([
getFormatCodeSettings(ctx, document),
getUserPreferences(ctx, document),
]) : [{}, {}];
]);

if (data?.type === 'fixAll') {
resolveFixAllCodeAction(ctx, codeAction, data, formatOptions, preferences);
}
else if (data?.type === 'refactor' && document) {
else if (data?.type === 'refactor') {
resolveRefactorCodeAction(ctx, codeAction, data, document, formatOptions, preferences);
}
else if (data?.type === 'organizeImports') {
Expand Down
9 changes: 2 additions & 7 deletions packages/typescript/lib/features/completions/basic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,7 @@ export function register(ctx: SharedContext) {
const lt_320 = semver.lt(ts.version, '3.2.0');
const gte_300 = semver.gte(ts.version, '3.0.0');

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

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

return async (document: TextDocument, position: vscode.Position, options?: ts.GetCompletionsAtPositionOptions): Promise<vscode.CompletionList | undefined> => {
const preferences = await getUserPreferences(ctx, document);
const fileName = ctx.uriToFileName(document.uri);
const offset = document.offsetAt(position);
Expand Down Expand Up @@ -148,7 +143,7 @@ export function register(ctx: SharedContext) {
return {
...item,
data: {
uri,
uri: document.uri,
fileName,
offset,
originalItem: {
Expand Down
11 changes: 3 additions & 8 deletions packages/typescript/lib/features/completions/directiveComment.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type * as vscode from '@volar/language-service';
import * as nls from 'vscode-nls';
import type { SharedContext } from '../../types';
import type { TextDocument } from 'vscode-languageserver-textdocument';

const localize = nls.loadMessageBundle(); // TODO: not working

Expand Down Expand Up @@ -33,13 +33,8 @@ const directives: Directive[] = [
}
];

export function register(ctx: SharedContext) {
return (uri: string, position: vscode.Position) => {

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

export function register() {
return (document: TextDocument, position: vscode.Position) => {
const prefix = document.getText({
start: { line: position.line, character: 0 },
end: position,
Expand Down
7 changes: 1 addition & 6 deletions packages/typescript/lib/features/completions/jsDoc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,7 @@ const localize = nls.loadMessageBundle(); // TODO: not working
const defaultJsDoc = `/**\n * $0\n */`;

export function register(ctx: SharedContext) {
return (uri: string, position: vscode.Position) => {

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

return (document: TextDocument, position: vscode.Position) => {
if (!isPotentiallyValidDocCompletionPosition(document, position))
return;

Expand Down
72 changes: 34 additions & 38 deletions packages/typescript/lib/features/completions/resolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import { getFormatCodeSettings } from '../../configs/getFormatCodeSettings';
import { getUserPreferences } from '../../configs/getUserPreferences';
import { getConfigTitle } from '../../shared';
import type { SharedContext } from '../../types';
import { convertDocumentSpanToLocation } from '../../utils/lspConverters';
import * as previewer from '../../utils/previewer';
import { snippetForFunctionCall } from '../../utils/snippetForFunctionCall';
import { entriesToLocations } from '../../utils/transforms';
import type { Data } from './basic';
import { handleKindModifiers } from './basic';

Expand All @@ -17,22 +17,21 @@ export function register(ctx: SharedContext) {
return async (item: vscode.CompletionItem, newPosition?: vscode.Position): Promise<vscode.CompletionItem> => {

const data: Data | undefined = item.data;

if (!data)
return item;

const fileName = data.fileName;
let offset = data.offset;
const document = ctx.getTextDocument(data.uri);

if (newPosition && document) {
if (newPosition) {
offset = document.offsetAt(newPosition);
}

const [formatOptions, preferences] = document ? await Promise.all([
const [formatOptions, preferences] = await Promise.all([
getFormatCodeSettings(ctx, document),
getUserPreferences(ctx, document),
]) : [{}, {}];
]);

let details: ts.CompletionEntryDetails | undefined;
try {
Expand Down Expand Up @@ -65,7 +64,7 @@ export function register(ctx: SharedContext) {
const entries = changes.textChanges.map(textChange => {
return { fileName, textSpan: textChange.span };
});
const locs = entriesToLocations(entries, ctx);
const locs = entries.map(entry => convertDocumentSpanToLocation(entry, ctx));
locs.forEach((loc, index) => {
item.additionalTextEdits?.push({ range: loc.range, newText: changes.textChanges[index].newText });
});
Expand All @@ -88,38 +87,35 @@ export function register(ctx: SharedContext) {
handleKindModifiers(item, details);
}

if (document) {

const useCodeSnippetsOnMethodSuggest = await ctx.env.getConfiguration?.<boolean>(getConfigTitle(document) + '.suggest.completeFunctionCalls') ?? false;
const useCodeSnippet = useCodeSnippetsOnMethodSuggest && (item.kind === 3 satisfies typeof vscode.CompletionItemKind.Function || item.kind === 2 satisfies typeof vscode.CompletionItemKind.Method);

if (useCodeSnippet) {
const shouldCompleteFunction = isValidFunctionCompletionContext(ctx.languageService, fileName, offset, document);
if (shouldCompleteFunction) {
const { snippet, parameterCount } = snippetForFunctionCall(
{
insertText: item.insertText ?? item.textEdit?.newText, // insertText is dropped by LSP in some case: https://github.com/microsoft/vscode-languageserver-node/blob/9b742021fb04ad081aa3676a9eecf4fa612084b4/client/src/common/codeConverter.ts#L659-L664
label: item.label,
},
details.displayParts,
);
if (item.textEdit) {
item.textEdit.newText = snippet;
}
if (item.insertText) {
item.insertText = snippet;
}
item.insertTextFormat = 2 satisfies typeof vscode.InsertTextFormat.Snippet;
if (parameterCount > 0) {
//Fix for https://github.com/microsoft/vscode/issues/104059
//Don't show parameter hints if "editor.parameterHints.enabled": false
// if (await getConfiguration('editor.parameterHints.enabled', document.uri)) {
// item.command = {
// title: 'triggerParameterHints',
// command: 'editor.action.triggerParameterHints',
// };
// }
}
const useCodeSnippetsOnMethodSuggest = await ctx.env.getConfiguration?.<boolean>(getConfigTitle(document) + '.suggest.completeFunctionCalls') ?? false;
const useCodeSnippet = useCodeSnippetsOnMethodSuggest && (item.kind === 3 satisfies typeof vscode.CompletionItemKind.Function || item.kind === 2 satisfies typeof vscode.CompletionItemKind.Method);

if (useCodeSnippet) {
const shouldCompleteFunction = isValidFunctionCompletionContext(ctx.languageService, fileName, offset, document);
if (shouldCompleteFunction) {
const { snippet, parameterCount } = snippetForFunctionCall(
{
insertText: item.insertText ?? item.textEdit?.newText, // insertText is dropped by LSP in some case: https://github.com/microsoft/vscode-languageserver-node/blob/9b742021fb04ad081aa3676a9eecf4fa612084b4/client/src/common/codeConverter.ts#L659-L664
label: item.label,
},
details.displayParts,
);
if (item.textEdit) {
item.textEdit.newText = snippet;
}
if (item.insertText) {
item.insertText = snippet;
}
item.insertTextFormat = 2 satisfies typeof vscode.InsertTextFormat.Snippet;
if (parameterCount > 0) {
//Fix for https://github.com/microsoft/vscode/issues/104059
//Don't show parameter hints if "editor.parameterHints.enabled": false
// if (await getConfiguration('editor.parameterHints.enabled', document.uri)) {
// item.command = {
// title: 'triggerParameterHints',
// command: 'editor.action.triggerParameterHints',
// };
// }
}
}
}
Expand Down

0 comments on commit 6e79999

Please sign in to comment.