mirror of
https://github.com/microsoft/vscode-extension-samples.git
synced 2026-06-13 07:10:26 +08:00
Pretter for each ts file
This commit is contained in:
@ -6,44 +6,47 @@ import * as html from 'vscode-html-languageservice';
|
||||
import { TextDocument, Position } from 'vscode-languageserver-types';
|
||||
|
||||
export function activate(context: vscode.ExtensionContext) {
|
||||
// create and keep html language service
|
||||
const service = html.getLanguageService();
|
||||
|
||||
// create and keep html language service
|
||||
const service = html.getLanguageService();
|
||||
vscode.languages.registerCompletionItemProvider(['typescript', 'javascript'], {
|
||||
provideCompletionItems(doc, pos) {
|
||||
const offset = doc.offsetAt(pos);
|
||||
const source = ts.createSourceFile(doc.fileName, doc.getText(), ts.ScriptTarget.Latest, true);
|
||||
|
||||
vscode.languages.registerCompletionItemProvider(['typescript', 'javascript'], {
|
||||
provideCompletionItems(doc, pos) {
|
||||
let token = (ts as any).getTokenAtPosition(source, offset);
|
||||
let template: ts.TaggedTemplateExpression;
|
||||
while (token) {
|
||||
if (token.kind === ts.SyntaxKind.TaggedTemplateExpression) {
|
||||
template = token;
|
||||
break;
|
||||
}
|
||||
token = token.parent;
|
||||
}
|
||||
|
||||
const offset = doc.offsetAt(pos);
|
||||
const source = ts.createSourceFile(doc.fileName, doc.getText(), ts.ScriptTarget.Latest, true);
|
||||
if (
|
||||
!template ||
|
||||
template.tag.getText() !== 'html' ||
|
||||
(offset < template.template.pos && offset > template.template.end)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
let token = (ts as any).getTokenAtPosition(source, offset)
|
||||
let template: ts.TaggedTemplateExpression;
|
||||
while (token) {
|
||||
if (token.kind === ts.SyntaxKind.TaggedTemplateExpression) {
|
||||
template = token;
|
||||
break;
|
||||
}
|
||||
token = token.parent;
|
||||
}
|
||||
const content = template.template.getText().slice(1, -1);
|
||||
const embeddedDoc = TextDocument.create(
|
||||
doc.uri.with({ scheme: 'html-fake' }).toString(),
|
||||
'html',
|
||||
doc.version,
|
||||
content
|
||||
);
|
||||
const htmlDoc = service.parseHTMLDocument(embeddedDoc);
|
||||
|
||||
if (!template
|
||||
|| template.tag.getText() !== 'html'
|
||||
|| (offset < template.template.pos && offset > template.template.end)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
const list = service.doComplete(embeddedDoc, Position.create(0, offset - template.template.pos - 1), htmlDoc);
|
||||
|
||||
const content = template.template.getText().slice(1, -1);
|
||||
const embeddedDoc = TextDocument.create(doc.uri.with({ scheme: 'html-fake' }).toString(), 'html', doc.version, content);
|
||||
const htmlDoc = service.parseHTMLDocument(embeddedDoc);
|
||||
|
||||
const list = service.doComplete(embeddedDoc, Position.create(0, offset - template.template.pos - 1), htmlDoc);
|
||||
|
||||
return list.items.map(item => {
|
||||
// translate to vscode items
|
||||
return new vscode.CompletionItem(item.label);
|
||||
})
|
||||
}
|
||||
});
|
||||
return list.items.map(item => {
|
||||
// translate to vscode items
|
||||
return new vscode.CompletionItem(item.label);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user