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

Commit

Permalink
Merge pull request #156 from jasonwilliams/sendReplacementSpans
Browse files Browse the repository at this point in the history
Send replacement spans in response, fixes a whole class of issues
  • Loading branch information
mjbvz committed Dec 6, 2021
2 parents cd59030 + 0c59bb3 commit 580be8a
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
25 changes: 19 additions & 6 deletions src/_language-service.ts
Expand Up @@ -11,6 +11,8 @@ import * as vscode from 'vscode-languageserver-types';
import * as config from './_config';
import { ConfigurationManager } from './_configuration';
import { VirtualDocumentProvider } from './_virtual-document-provider';
import { TextDocument } from 'vscode-languageserver-textdocument';


const cssErrorCode = 9999;

Expand Down Expand Up @@ -115,7 +117,9 @@ export class StyledTemplateLanguageService implements TemplateLanguageService {
position: ts.LineAndCharacter
): ts.WithMetadata<ts.CompletionInfo> {
const items = this.getCompletionItems(context, position);
return translateCompletionItemsToCompletionInfo(this.typescript, items);
const doc = this.virtualDocumentFactory.createVirtualDocument(context);
const wrapper = this.virtualDocumentFactory.getVirtualDocumentWrapper(context);
return translateCompletionItemsToCompletionInfo(this.typescript, items, doc, wrapper);
}

public getCompletionEntryDetails(
Expand Down Expand Up @@ -242,7 +246,7 @@ export class StyledTemplateLanguageService implements TemplateLanguageService {

private translateDiagnostics(
diagnostics: vscode.Diagnostic[],
doc: vscode.TextDocument,
doc: TextDocument,
context: TemplateContext,
content: string
) {
Expand All @@ -254,7 +258,7 @@ export class StyledTemplateLanguageService implements TemplateLanguageService {
private translateDiagnostic(
diagnostic: vscode.Diagnostic,
file: ts.SourceFile,
doc: vscode.TextDocument,
doc: TextDocument,
context: TemplateContext,
content: string
): ts.Diagnostic | undefined {
Expand Down Expand Up @@ -378,7 +382,9 @@ function filterScssCompletionItems(

function translateCompletionItemsToCompletionInfo(
typescript: typeof ts,
items: vscode.CompletionList
items: vscode.CompletionList,
doc: TextDocument,
wrapper: string
): ts.WithMetadata<ts.CompletionInfo> {
return {
metadata: {
Expand All @@ -387,7 +393,7 @@ function translateCompletionItemsToCompletionInfo(
isGlobalCompletion: false,
isMemberCompletion: false,
isNewIdentifierLocation: false,
entries: items.items.map(x => translateCompetionEntry(typescript, x)),
entries: items.items.map(x => translateCompetionEntry(typescript, x, doc, wrapper)),
};
}

Expand All @@ -407,13 +413,20 @@ function translateCompletionItemsToCompletionEntryDetails(

function translateCompetionEntry(
typescript: typeof ts,
item: vscode.CompletionItem
item: vscode.CompletionItem,
doc: TextDocument,
wrapper: string
): ts.CompletionEntry {
return {
name: item.label,
kind: item.kind ? translateCompletionItemKind(typescript, item.kind) : typescript.ScriptElementKind.unknown,
kindModifiers: getKindModifiers(item),
sortText: item.sortText || item.label,
replacementSpan: {
// The correct offset for start seems to be the range.start minus the wrapper
start: doc.offsetAt((item as any).textEdit.range.start) - wrapper.length,
length: doc.offsetAt((item as any).textEdit.range.end) - doc.offsetAt((item as any).textEdit.range.start),
},
};
}

Expand Down
3 changes: 2 additions & 1 deletion src/_virtual-document-provider.ts
Expand Up @@ -12,6 +12,7 @@ export interface VirtualDocumentProvider {
fromVirtualDocPosition(position: ts.LineAndCharacter): ts.LineAndCharacter;
toVirtualDocOffset(offset: number, context: TemplateContext): number;
fromVirtualDocOffset(offset: number, context: TemplateContext): number;
getVirtualDocumentWrapper(context: TemplateContext): string;
}

/**
Expand Down Expand Up @@ -67,7 +68,7 @@ export class StyledVirtualDocumentFactory implements VirtualDocumentProvider {
return offset - this.getVirtualDocumentWrapper(context).length;
}

private getVirtualDocumentWrapper(context: TemplateContext): string {
public getVirtualDocumentWrapper(context: TemplateContext): string {
const tag = (context.node.parent as ts.Node & { tag: any })?.tag?.escapedText;
return tag === 'keyframes' ? StyledVirtualDocumentFactory.wrapperPreKeyframes : StyledVirtualDocumentFactory.wrapperPreRoot;
}
Expand Down

0 comments on commit 580be8a

Please sign in to comment.