mirror of
https://github.com/Microsoft/vscode
synced 2024-09-13 21:55:38 +00:00
extract js semantic tokens
This commit is contained in:
parent
d6aa8f540d
commit
f07fae16be
|
@ -7,14 +7,15 @@ import { LanguageModelCache, getLanguageModelCache } from '../languageModelCache
|
||||||
import {
|
import {
|
||||||
SymbolInformation, SymbolKind, CompletionItem, Location, SignatureHelp, SignatureInformation, ParameterInformation,
|
SymbolInformation, SymbolKind, CompletionItem, Location, SignatureHelp, SignatureInformation, ParameterInformation,
|
||||||
Definition, TextEdit, TextDocument, Diagnostic, DiagnosticSeverity, Range, CompletionItemKind, Hover, MarkedString,
|
Definition, TextEdit, TextDocument, Diagnostic, DiagnosticSeverity, Range, CompletionItemKind, Hover, MarkedString,
|
||||||
DocumentHighlight, DocumentHighlightKind, CompletionList, Position, FormattingOptions, FoldingRange, FoldingRangeKind, SelectionRange
|
DocumentHighlight, DocumentHighlightKind, CompletionList, Position, FormattingOptions, FoldingRange, FoldingRangeKind, SelectionRange,
|
||||||
} from 'vscode-html-languageservice';
|
LanguageMode, Settings
|
||||||
import { LanguageMode, Settings } from './languageModes';
|
} from './languageModes';
|
||||||
import { getWordAtText, startsWith, isWhitespaceOnly, repeat } from '../utils/strings';
|
import { getWordAtText, startsWith, isWhitespaceOnly, repeat } from '../utils/strings';
|
||||||
import { HTMLDocumentRegions } from './embeddedSupport';
|
import { HTMLDocumentRegions } from './embeddedSupport';
|
||||||
|
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
import { join } from 'path';
|
import { join } from 'path';
|
||||||
|
import { getSemanticTokens, getSemanticTokenLegend } from './javascriptSemanticTokens';
|
||||||
|
|
||||||
const FILE_NAME = 'vscode://javascript/1'; // the same 'file' is used for all contents
|
const FILE_NAME = 'vscode://javascript/1'; // the same 'file' is used for all contents
|
||||||
const TS_FILE_NAME = 'vscode://javascript/2.ts';
|
const TS_FILE_NAME = 'vscode://javascript/2.ts';
|
||||||
|
@ -320,38 +321,10 @@ export function getJavaScriptMode(documentRegions: LanguageModelCache<HTMLDocume
|
||||||
if (!ranges) {
|
if (!ranges) {
|
||||||
ranges = [Range.create(Position.create(0, 0), document.positionAt(document.getText().length))];
|
ranges = [Range.create(Position.create(0, 0), document.positionAt(document.getText().length))];
|
||||||
}
|
}
|
||||||
const result = [];
|
return getSemanticTokens(jsLanguageService, document, TS_FILE_NAME, ranges);
|
||||||
|
|
||||||
for (let range of ranges) {
|
|
||||||
const start = document.offsetAt(range.start), length = document.offsetAt(range.end) - start;
|
|
||||||
const tokens = jsLanguageService.getSemanticClassifications(TS_FILE_NAME, { start, length });
|
|
||||||
|
|
||||||
let prefLine = 0;
|
|
||||||
let prevChar = 0;
|
|
||||||
|
|
||||||
for (let token of tokens) {
|
|
||||||
const m = tokenMapping[token.classificationType];
|
|
||||||
if (m) {
|
|
||||||
const startPos = currentTextDocument.positionAt(token.textSpan.start);
|
|
||||||
if (prefLine !== startPos.line) {
|
|
||||||
prevChar = 0;
|
|
||||||
}
|
|
||||||
result.push(startPos.line - prefLine); // line delta
|
|
||||||
result.push(startPos.character - prevChar); // line delta
|
|
||||||
result.push(token.textSpan.length); // lemgth
|
|
||||||
result.push(tokenTypes.indexOf(m)); // tokenType
|
|
||||||
result.push(0); // tokenModifier
|
|
||||||
|
|
||||||
prefLine = startPos.line;
|
|
||||||
prevChar = startPos.character;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
},
|
},
|
||||||
getSemanticTokenLegend(): { types: string[], modifiers: string[] } {
|
getSemanticTokenLegend(): { types: string[], modifiers: string[] } {
|
||||||
return { types: tokenTypes, modifiers: tokenModifiers };
|
return getSemanticTokenLegend();
|
||||||
},
|
},
|
||||||
dispose() {
|
dispose() {
|
||||||
jsLanguageService.dispose();
|
jsLanguageService.dispose();
|
||||||
|
@ -360,17 +333,6 @@ export function getJavaScriptMode(documentRegions: LanguageModelCache<HTMLDocume
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const tokenTypes: string[] = ['class', 'enum', 'interface', 'namespace', 'parameterType', 'type', 'parameter'];
|
|
||||||
const tokenModifiers: string[] = [];
|
|
||||||
const tokenMapping: { [name: string]: string } = {
|
|
||||||
[ts.ClassificationTypeNames.className]: 'class',
|
|
||||||
[ts.ClassificationTypeNames.enumName]: 'enum',
|
|
||||||
[ts.ClassificationTypeNames.interfaceName]: 'interface',
|
|
||||||
[ts.ClassificationTypeNames.moduleName]: 'namespace',
|
|
||||||
[ts.ClassificationTypeNames.typeParameterName]: 'parameterType',
|
|
||||||
[ts.ClassificationTypeNames.typeAliasName]: 'type',
|
|
||||||
[ts.ClassificationTypeNames.parameterName]: 'parameter'
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import { TextDocument, Range } from './languageModes';
|
||||||
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
|
export function getSemanticTokens(jsLanguageService: ts.LanguageService, currentTextDocument: TextDocument, fileName: string, ranges: Range[]) {
|
||||||
|
const result = [];
|
||||||
|
|
||||||
|
for (let range of ranges) {
|
||||||
|
const start = currentTextDocument.offsetAt(range.start), length = currentTextDocument.offsetAt(range.end) - start;
|
||||||
|
const tokens = jsLanguageService.getSemanticClassifications(fileName, { start, length });
|
||||||
|
|
||||||
|
let prefLine = 0;
|
||||||
|
let prevChar = 0;
|
||||||
|
|
||||||
|
for (let token of tokens) {
|
||||||
|
const m = tokenMapping[token.classificationType];
|
||||||
|
if (m) {
|
||||||
|
const startPos = currentTextDocument.positionAt(token.textSpan.start);
|
||||||
|
if (prefLine !== startPos.line) {
|
||||||
|
prevChar = 0;
|
||||||
|
}
|
||||||
|
result.push(startPos.line - prefLine); // line delta
|
||||||
|
result.push(startPos.character - prevChar); // line delta
|
||||||
|
result.push(token.textSpan.length); // lemgth
|
||||||
|
result.push(tokenTypes.indexOf(m)); // tokenType
|
||||||
|
result.push(0); // tokenModifier
|
||||||
|
|
||||||
|
prefLine = startPos.line;
|
||||||
|
prevChar = startPos.character;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getSemanticTokenLegend() {
|
||||||
|
return { types: tokenTypes, modifiers: tokenModifiers };
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const tokenTypes: string[] = ['class', 'enum', 'interface', 'namespace', 'parameterType', 'type', 'parameter'];
|
||||||
|
const tokenModifiers: string[] = [];
|
||||||
|
const tokenMapping: { [name: string]: string } = {
|
||||||
|
[ts.ClassificationTypeNames.className]: 'class',
|
||||||
|
[ts.ClassificationTypeNames.enumName]: 'enum',
|
||||||
|
[ts.ClassificationTypeNames.interfaceName]: 'interface',
|
||||||
|
[ts.ClassificationTypeNames.moduleName]: 'namespace',
|
||||||
|
[ts.ClassificationTypeNames.typeParameterName]: 'parameterType',
|
||||||
|
[ts.ClassificationTypeNames.typeAliasName]: 'type',
|
||||||
|
[ts.ClassificationTypeNames.parameterName]: 'parameter'
|
||||||
|
};
|
|
@ -17,7 +17,8 @@ import { getDocumentRegions, HTMLDocumentRegions } from './embeddedSupport';
|
||||||
import { getHTMLMode } from './htmlMode';
|
import { getHTMLMode } from './htmlMode';
|
||||||
import { getJavaScriptMode } from './javascriptMode';
|
import { getJavaScriptMode } from './javascriptMode';
|
||||||
|
|
||||||
export { ColorInformation, ColorPresentation, Color };
|
export * from 'vscode-html-languageservice';
|
||||||
|
export { WorkspaceFolder } from 'vscode-languageserver';
|
||||||
|
|
||||||
export interface Settings {
|
export interface Settings {
|
||||||
css?: any;
|
css?: any;
|
||||||
|
|
Loading…
Reference in a new issue