Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit 580be8a

Browse files
authored
Merge pull request #156 from jasonwilliams/sendReplacementSpans
Send replacement spans in response, fixes a whole class of issues
2 parents cd59030 + 0c59bb3 commit 580be8a

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

src/_language-service.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import * as vscode from 'vscode-languageserver-types';
1111
import * as config from './_config';
1212
import { ConfigurationManager } from './_configuration';
1313
import { VirtualDocumentProvider } from './_virtual-document-provider';
14+
import { TextDocument } from 'vscode-languageserver-textdocument';
15+
1416

1517
const cssErrorCode = 9999;
1618

@@ -115,7 +117,9 @@ export class StyledTemplateLanguageService implements TemplateLanguageService {
115117
position: ts.LineAndCharacter
116118
): ts.WithMetadata<ts.CompletionInfo> {
117119
const items = this.getCompletionItems(context, position);
118-
return translateCompletionItemsToCompletionInfo(this.typescript, items);
120+
const doc = this.virtualDocumentFactory.createVirtualDocument(context);
121+
const wrapper = this.virtualDocumentFactory.getVirtualDocumentWrapper(context);
122+
return translateCompletionItemsToCompletionInfo(this.typescript, items, doc, wrapper);
119123
}
120124

121125
public getCompletionEntryDetails(
@@ -242,7 +246,7 @@ export class StyledTemplateLanguageService implements TemplateLanguageService {
242246

243247
private translateDiagnostics(
244248
diagnostics: vscode.Diagnostic[],
245-
doc: vscode.TextDocument,
249+
doc: TextDocument,
246250
context: TemplateContext,
247251
content: string
248252
) {
@@ -254,7 +258,7 @@ export class StyledTemplateLanguageService implements TemplateLanguageService {
254258
private translateDiagnostic(
255259
diagnostic: vscode.Diagnostic,
256260
file: ts.SourceFile,
257-
doc: vscode.TextDocument,
261+
doc: TextDocument,
258262
context: TemplateContext,
259263
content: string
260264
): ts.Diagnostic | undefined {
@@ -378,7 +382,9 @@ function filterScssCompletionItems(
378382

379383
function translateCompletionItemsToCompletionInfo(
380384
typescript: typeof ts,
381-
items: vscode.CompletionList
385+
items: vscode.CompletionList,
386+
doc: TextDocument,
387+
wrapper: string
382388
): ts.WithMetadata<ts.CompletionInfo> {
383389
return {
384390
metadata: {
@@ -387,7 +393,7 @@ function translateCompletionItemsToCompletionInfo(
387393
isGlobalCompletion: false,
388394
isMemberCompletion: false,
389395
isNewIdentifierLocation: false,
390-
entries: items.items.map(x => translateCompetionEntry(typescript, x)),
396+
entries: items.items.map(x => translateCompetionEntry(typescript, x, doc, wrapper)),
391397
};
392398
}
393399

@@ -407,13 +413,20 @@ function translateCompletionItemsToCompletionEntryDetails(
407413

408414
function translateCompetionEntry(
409415
typescript: typeof ts,
410-
item: vscode.CompletionItem
416+
item: vscode.CompletionItem,
417+
doc: TextDocument,
418+
wrapper: string
411419
): ts.CompletionEntry {
412420
return {
413421
name: item.label,
414422
kind: item.kind ? translateCompletionItemKind(typescript, item.kind) : typescript.ScriptElementKind.unknown,
415423
kindModifiers: getKindModifiers(item),
416424
sortText: item.sortText || item.label,
425+
replacementSpan: {
426+
// The correct offset for start seems to be the range.start minus the wrapper
427+
start: doc.offsetAt((item as any).textEdit.range.start) - wrapper.length,
428+
length: doc.offsetAt((item as any).textEdit.range.end) - doc.offsetAt((item as any).textEdit.range.start),
429+
},
417430
};
418431
}
419432

src/_virtual-document-provider.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export interface VirtualDocumentProvider {
1212
fromVirtualDocPosition(position: ts.LineAndCharacter): ts.LineAndCharacter;
1313
toVirtualDocOffset(offset: number, context: TemplateContext): number;
1414
fromVirtualDocOffset(offset: number, context: TemplateContext): number;
15+
getVirtualDocumentWrapper(context: TemplateContext): string;
1516
}
1617

1718
/**
@@ -67,7 +68,7 @@ export class StyledVirtualDocumentFactory implements VirtualDocumentProvider {
6768
return offset - this.getVirtualDocumentWrapper(context).length;
6869
}
6970

70-
private getVirtualDocumentWrapper(context: TemplateContext): string {
71+
public getVirtualDocumentWrapper(context: TemplateContext): string {
7172
const tag = (context.node.parent as ts.Node & { tag: any })?.tag?.escapedText;
7273
return tag === 'keyframes' ? StyledVirtualDocumentFactory.wrapperPreKeyframes : StyledVirtualDocumentFactory.wrapperPreRoot;
7374
}

0 commit comments

Comments
 (0)