Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsoncodehk committed Mar 8, 2024
1 parent 5a93cb7 commit bc5ff18
Show file tree
Hide file tree
Showing 10 changed files with 241 additions and 273 deletions.
87 changes: 77 additions & 10 deletions packages/typescript/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import type {
ServicePlugin,
ServicePluginInstance,
VirtualCode,
WorkspaceEdit
} from '@volar/language-service';
import { getDocumentRegistry } from '@volar/typescript';
import * as semver from 'semver';
Expand All @@ -25,12 +26,9 @@ import * as diagnostics from './lib/features/diagnostics';
import * as documentHighlight from './lib/features/documentHighlight';
import * as fileReferences from './lib/features/fileReferences';
import * as fileRename from './lib/features/fileRename';
import * as hover from './lib/features/hover';
import * as implementation from './lib/features/implementation';
import * as inlayHints from './lib/features/inlayHints';
import * as prepareRename from './lib/features/prepareRename';
import * as references from './lib/features/references';
import * as rename from './lib/features/rename';
import * as selectionRanges from './lib/features/selectionRanges';
import * as semanticTokens from './lib/features/semanticTokens';
import * as signatureHelp from './lib/features/signatureHelp';
Expand All @@ -43,10 +41,16 @@ import {
convertCallHierarchyOutgoingCall,
convertDefinitionInfoAndBoundSpan,
convertDocumentSpantoLocationLink,
convertFileTextChanges,
convertNavTree,
convertOutliningSpan,
convertQuickInfo,
convertRenameLocations,
convertTextChange,
convertTextSpan,
} from './lib/utils/lspConverters';
import * as path from 'path-browserify';
import { getUserPreferences } from './lib/configs/getUserPreferences';

export * from '@volar/typescript';

Expand Down Expand Up @@ -222,8 +226,6 @@ export function create(
const findReferences = references.register(ctx);
const findFileReferences = fileReferences.register(ctx);
const findImplementations = implementation.register(ctx);
const doPrepareRename = prepareRename.register(ctx);
const doRename = rename.register(ctx);
const getEditsForFileRename = fileRename.register(ctx);
const getCodeActions = codeActions.register(ctx);
const doCodeActionResolve = codeActionResolve.register(ctx);
Expand All @@ -234,11 +236,14 @@ export function create(
const doCompletionResolve = completionResolve.register(ctx);
const doDirectiveCommentComplete = directiveCommentCompletions.register();
const doJsDocComplete = jsDocCompletions.register(ctx);
const doHover = hover.register(ctx);
const getSignatureHelp = signatureHelp.register(ctx);
const getSelectionRanges = selectionRanges.register(ctx);
const doValidation = diagnostics.register(ctx);
const getDocumentSemanticTokens = semanticTokens.register(ctx);

/* typescript-language-features is hardcode true */
const renameInfoOptions = { allowRenameOfImportPath: true };

return {

provide: {
Expand Down Expand Up @@ -311,7 +316,16 @@ export function create(
return;

return worker(token, () => {
return doPrepareRename(document, position);
const fileName = ctx.uriToFileName(document.uri);
const offset = document.offsetAt(position);
const renameInfo = safeCall(() => ctx.languageService.getRenameInfo(fileName, offset, renameInfoOptions));
if (!renameInfo) {
return;
}
if (!renameInfo.canRename) {
return { message: renameInfo.localizedErrorMessage };
}
return convertTextSpan(renameInfo.triggerSpan, document);
});
},

Expand All @@ -320,8 +334,55 @@ export function create(
if (!isSemanticDocument(document, true))
return;

return worker(token, () => {
return doRename(document, position, newName);
return worker(token, async () => {
const fileName = ctx.uriToFileName(document.uri);
const offset = document.offsetAt(position);
const renameInfo = safeCall(() => ctx.languageService.getRenameInfo(fileName, offset, renameInfoOptions));
if (!renameInfo?.canRename) {
return;
}
if (renameInfo.fileToRename) {
const [formatOptions, preferences] = await Promise.all([
getFormatCodeSettings(ctx, document),
getUserPreferences(ctx, document),
]);
return renameFile(renameInfo.fileToRename, newName, formatOptions, preferences);
}

const { providePrefixAndSuffixTextForRename } = await getUserPreferences(ctx, document);
const entries = ctx.languageService.findRenameLocations(fileName, offset, false, false, providePrefixAndSuffixTextForRename);
if (!entries) {
return;
}
return convertRenameLocations(newName, entries, ctx.fileNameToUri, ctx.getTextDocument);

function renameFile(
fileToRename: string,
newName: string,
formatOptions: ts.FormatCodeSettings,
preferences: ts.UserPreferences,
): WorkspaceEdit | undefined {
// Make sure we preserve file extension if none provided
if (!path.extname(newName)) {
newName += path.extname(fileToRename);
}
const dirname = path.dirname(fileToRename);
const newFilePath = path.join(dirname, newName);
const response = safeCall(() => ctx.languageService.getEditsForFileRename(fileToRename, newFilePath, formatOptions, preferences));
if (!response) {
return;
}
const edits = convertFileTextChanges(response, ctx.fileNameToUri, ctx.getTextDocument);
if (!edits.documentChanges) {
edits.documentChanges = [];
}
edits.documentChanges.push({
kind: 'rename',
oldUri: ctx.fileNameToUri(fileToRename),
newUri: ctx.fileNameToUri(newFilePath),
});
return edits;
}
});
},

Expand Down Expand Up @@ -460,7 +521,13 @@ export function create(
return;

return worker(token, () => {
return doHover(document, position);
const fileName = ctx.uriToFileName(document.uri);
const offset = document.offsetAt(position);
const info = safeCall(() => ctx.languageService.getQuickInfoAtPosition(fileName, offset));
if (!info) {
return;
}
return convertQuickInfo(ts, info, document, ctx.fileNameToUri, ctx.getTextDocument);
});
},

Expand Down
4 changes: 2 additions & 2 deletions packages/typescript/lib/features/codeAction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import { safeCall } from '../shared';
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';
import { convertFileTextChanges } from '../utils/lspConverters';

export interface FixAllData {
type: 'fixAll',
Expand Down Expand Up @@ -232,7 +232,7 @@ export function register(ctx: SharedContext) {
}
}
function transformCodeFix(codeFix: ts.CodeFixAction, diagnostics: vscode.Diagnostic[], kind: vscode.CodeActionKind) {
const edit = fileTextChangesToWorkspaceEdit(codeFix.changes, ctx);
const edit = convertFileTextChanges(codeFix.changes, ctx.fileNameToUri, ctx.getTextDocument);
const codeActions: vscode.CodeAction[] = [];
const fix: vscode.CodeAction = {
title: codeFix.description,
Expand Down
8 changes: 4 additions & 4 deletions packages/typescript/lib/features/codeActionResolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { getUserPreferences } from '../configs/getUserPreferences';
import { safeCall } from '../shared';
import type { SharedContext } from '../types';
import type { Data, FixAllData, RefactorData } from './codeAction';
import { fileTextChangesToWorkspaceEdit } from './rename';
import { convertFileTextChanges } from '../utils/lspConverters';

export function register(ctx: SharedContext) {
return async (codeAction: vscode.CodeAction) => {
Expand Down Expand Up @@ -41,7 +41,7 @@ export function resolveFixAllCodeAction(
) {
const fixes = data.fixIds.map(fixId => safeCall(() => ctx.languageService.getCombinedCodeFix({ type: 'file', fileName: data.fileName }, fixId, formatOptions, preferences)));
const changes = fixes.map(fix => fix?.changes ?? []).flat();
codeAction.edit = fileTextChangesToWorkspaceEdit(changes, ctx);
codeAction.edit = convertFileTextChanges(changes, ctx.fileNameToUri, ctx.getTextDocument);
}

export function resolveRefactorCodeAction(
Expand All @@ -56,7 +56,7 @@ export function resolveRefactorCodeAction(
if (!editInfo) {
return;
}
codeAction.edit = fileTextChangesToWorkspaceEdit(editInfo.edits, ctx);
codeAction.edit = convertFileTextChanges(editInfo.edits, ctx.fileNameToUri, ctx.getTextDocument);
if (editInfo.renameLocation !== undefined && editInfo.renameFilename !== undefined) {
codeAction.command = ctx.commands.rename.create(
document.uri,
Expand All @@ -73,5 +73,5 @@ export function resolveOrganizeImportsCodeAction(
preferences: ts.UserPreferences,
) {
const changes = safeCall(() => ctx.languageService.organizeImports({ type: 'file', fileName: data.fileName }, formatOptions, preferences));
codeAction.edit = fileTextChangesToWorkspaceEdit(changes ?? [], ctx);
codeAction.edit = convertFileTextChanges(changes ?? [], ctx.fileNameToUri, ctx.getTextDocument);
}
8 changes: 2 additions & 6 deletions packages/typescript/lib/features/completions/resolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,15 @@ export function register(ctx: SharedContext) {
}
}
if (details.displayParts) {
detailTexts.push(previewer.plainWithLinks(details.displayParts, { toResource }, ctx));
detailTexts.push(previewer.plainWithLinks(details.displayParts, ctx.fileNameToUri, ctx.getTextDocument));
}
if (detailTexts.length) {
item.detail = detailTexts.join('\n');
}

item.documentation = {
kind: 'markdown',
value: previewer.markdownDocumentation(details.documentation, details.tags, { toResource }, ctx),
value: previewer.markdownDocumentation(details.documentation, details.tags, ctx.fileNameToUri, ctx.getTextDocument),
};

if (details) {
Expand Down Expand Up @@ -121,10 +121,6 @@ export function register(ctx: SharedContext) {
}

return item;

function toResource(path: string) {
return ctx.fileNameToUri(path);
}
};
}

Expand Down
4 changes: 2 additions & 2 deletions packages/typescript/lib/features/fileRename.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { getFormatCodeSettings } from '../configs/getFormatCodeSettings';
import { getUserPreferences } from '../configs/getUserPreferences';
import { safeCall } from '../shared';
import type { SharedContext } from '../types';
import { fileTextChangesToWorkspaceEdit } from './rename';
import { convertFileTextChanges } from '../utils/lspConverters';

export function register(ctx: SharedContext) {
return async (oldUri: string, newUri: string): Promise<vscode.WorkspaceEdit | undefined> => {
Expand All @@ -19,7 +19,7 @@ export function register(ctx: SharedContext) {
const response = safeCall(() => ctx.languageService.getEditsForFileRename(fileToRename, newFilePath, formatOptions, preferences));
if (!response?.length) return;

const edits = fileTextChangesToWorkspaceEdit(response, ctx);
const edits = convertFileTextChanges(response, ctx.fileNameToUri, ctx.getTextDocument);
return edits;
};
}
43 changes: 0 additions & 43 deletions packages/typescript/lib/features/hover.ts

This file was deleted.

25 changes: 0 additions & 25 deletions packages/typescript/lib/features/prepareRename.ts

This file was deleted.

Loading

0 comments on commit bc5ff18

Please sign in to comment.