Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,10 @@ export class TypeScriptPlugin
this.configManager = configManager;
this.lsAndTsDocResolver = new LSAndTSDocResolver(docManager, workspacePath);
this.completionProvider = new CompletionsProviderImpl(this.lsAndTsDocResolver);
this.codeActionsProvider = new CodeActionsProviderImpl(this.lsAndTsDocResolver);
this.codeActionsProvider = new CodeActionsProviderImpl(
this.lsAndTsDocResolver,
this.completionProvider,
);
this.updateImportsProvider = new UpdateImportsProviderImpl(this.lsAndTsDocResolver);
this.diagnosticsProvider = new DiagnosticsProviderImpl(this.lsAndTsDocResolver);
this.renameProvider = new RenameProviderImpl(this.lsAndTsDocResolver);
Expand Down Expand Up @@ -108,9 +111,10 @@ export class TypeScriptPlugin
return null;
}
const declaration = ts.displayPartsToString(info.displayParts);
const documentation = typeof info.documentation === 'string'
? info.documentation
: ts.displayPartsToString(info.documentation);
const documentation =
typeof info.documentation === 'string'
? info.documentation
: ts.displayPartsToString(info.documentation);

// https://microsoft.github.io/language-server-protocol/specification#textDocument_hover
const contents = ['```typescript', declaration, '```']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@ import {
import { Document, mapRangeToOriginal, isRangeInTag } from '../../../lib/documents';
import { pathToUrl } from '../../../utils';
import { CodeActionsProvider } from '../../interfaces';
import { SnapshotFragment } from '../DocumentSnapshot';
import { SnapshotFragment, SvelteSnapshotFragment } from '../DocumentSnapshot';
import { LSAndTSDocResolver } from '../LSAndTSDocResolver';
import { convertRange } from '../utils';
import { flatten } from '../../../utils';
import ts from 'typescript';
import { CompletionsProviderImpl } from './CompletionProvider';

interface RefactorArgs {
type: 'refactor';
Expand All @@ -25,7 +26,10 @@ interface RefactorArgs {
}

export class CodeActionsProviderImpl implements CodeActionsProvider {
constructor(private readonly lsAndTsDocResolver: LSAndTSDocResolver) {}
constructor(
private readonly lsAndTsDocResolver: LSAndTSDocResolver,
private readonly completionProvider: CompletionsProviderImpl,
) {}

async getCodeActions(
document: Document,
Expand Down Expand Up @@ -122,6 +126,17 @@ export class CodeActionsProviderImpl implements CodeActionsProvider {
null,
),
change.textChanges.map((edit) => {
if (
fix.fixName === 'import' &&
doc instanceof SvelteSnapshotFragment
) {
return this.completionProvider.codeActionChangeToTextEdit(
document,
doc,
edit,
true,
);
}
return TextEdit.replace(
mapRangeToOriginal(doc!, convertRange(doc!, edit.span)),
edit.newText,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,12 +210,9 @@ export class CompletionsProviderImpl implements CompletionsProvider<CompletionEn

for (const action of actions) {
for (const change of action.changes) {
edit.push(...this.codeActionChangesToTextEdit(
document,
fragment,
change,
isImport
));
edit.push(
...this.codeActionChangesToTextEdit(document, fragment, change, isImport),
);
}
}

Expand Down Expand Up @@ -255,7 +252,7 @@ export class CompletionsProviderImpl implements CompletionsProvider<CompletionEn
);
}

private codeActionChangeToTextEdit(
codeActionChangeToTextEdit(
doc: Document,
fragment: SvelteSnapshotFragment,
change: ts.TextChange,
Expand Down Expand Up @@ -308,20 +305,16 @@ export class CompletionsProviderImpl implements CompletionsProvider<CompletionEn
return TextEdit.replace(range, change.newText);
}

private mapRangeForNewImport(
fragment: SvelteSnapshotFragment,
virtualRange: Range
) {
private mapRangeForNewImport(fragment: SvelteSnapshotFragment, virtualRange: Range) {
const sourceMapableRange = this.offsetLinesAndMovetoStartOfLine(virtualRange, -1);
const mappableRange = mapRangeToOriginal(
fragment, sourceMapableRange);
const mappableRange = mapRangeToOriginal(fragment, sourceMapableRange);
return this.offsetLinesAndMovetoStartOfLine(mappableRange, 1);
}

private offsetLinesAndMovetoStartOfLine({ start, end }: Range, offsetLines: number) {
return Range.create(
Position.create(start.line + offsetLines, 0),
Position.create(end.line + offsetLines, 0)
Position.create(end.line + offsetLines, 0),
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import ts from 'typescript';
import * as path from 'path';
import * as assert from 'assert';
import { Range, Position, CodeActionKind, TextDocumentEdit } from 'vscode-languageserver';
import { CompletionsProviderImpl } from '../../../../src/plugins/typescript/features/CompletionProvider';

const testDir = path.join(__dirname, '..');

Expand All @@ -27,7 +28,8 @@ describe('CodeActionsProvider', () => {
(textDocument) => new Document(textDocument.uri, textDocument.text),
);
const lsAndTsDocResolver = new LSAndTSDocResolver(docManager, testDir);
const provider = new CodeActionsProviderImpl(lsAndTsDocResolver);
const completionProvider = new CompletionsProviderImpl(lsAndTsDocResolver);
const provider = new CodeActionsProviderImpl(lsAndTsDocResolver, completionProvider);
const filePath = getFullPath(filename);
const document = docManager.openDocument(<any>{
uri: pathToUrl(filePath),
Expand Down