init
This commit is contained in:
9
node_modules/@volar/language-core/lib/languageContext.d.ts
generated
vendored
Normal file
9
node_modules/@volar/language-core/lib/languageContext.d.ts
generated
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
import { createVirtualFiles } from './virtualFiles';
|
||||
import { Language, TypeScriptLanguageHost } from './types';
|
||||
export interface LanguageContext {
|
||||
rawHost: TypeScriptLanguageHost;
|
||||
host: TypeScriptLanguageHost;
|
||||
virtualFiles: ReturnType<typeof createVirtualFiles>;
|
||||
}
|
||||
export declare function createLanguageContext(rawHost: TypeScriptLanguageHost, languages: Language<any>[]): LanguageContext;
|
||||
//# sourceMappingURL=languageContext.d.ts.map
|
67
node_modules/@volar/language-core/lib/languageContext.js
generated
vendored
Normal file
67
node_modules/@volar/language-core/lib/languageContext.js
generated
vendored
Normal file
@ -0,0 +1,67 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.createLanguageContext = void 0;
|
||||
const virtualFiles_1 = require("./virtualFiles");
|
||||
function createLanguageContext(rawHost, languages) {
|
||||
let host = rawHost;
|
||||
let lastRootFiles = new Map();
|
||||
let lastProjectVersion;
|
||||
const virtualFiles = (0, virtualFiles_1.createVirtualFiles)(languages);
|
||||
for (const language of languages.reverse()) {
|
||||
if (language.resolveHost) {
|
||||
const pastHost = host;
|
||||
let proxyHost = language.resolveHost(host);
|
||||
if (proxyHost === pastHost) {
|
||||
console.warn(`[volar] language.resolveHost() should not return the same host instance.`);
|
||||
proxyHost = { ...proxyHost };
|
||||
}
|
||||
host = new Proxy(proxyHost, {
|
||||
get(target, p) {
|
||||
if (p in target) {
|
||||
return target[p];
|
||||
}
|
||||
return pastHost[p];
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
return {
|
||||
rawHost,
|
||||
host,
|
||||
virtualFiles: new Proxy(virtualFiles, {
|
||||
get: (target, property) => {
|
||||
syncVirtualFiles();
|
||||
return target[property];
|
||||
},
|
||||
}),
|
||||
};
|
||||
function syncVirtualFiles() {
|
||||
const newProjectVersion = host.getProjectVersion();
|
||||
const shouldUpdate = newProjectVersion !== lastProjectVersion;
|
||||
if (!shouldUpdate)
|
||||
return;
|
||||
const nowRootFiles = new Map();
|
||||
const remainRootFiles = new Set(lastRootFiles.keys());
|
||||
for (const rootFileName of host.getScriptFileNames()) {
|
||||
nowRootFiles.set(rootFileName, host.getScriptSnapshot(rootFileName));
|
||||
}
|
||||
for (const [fileName, snapshot] of nowRootFiles) {
|
||||
remainRootFiles.delete(fileName);
|
||||
if (lastRootFiles.get(fileName) !== nowRootFiles.get(fileName)) {
|
||||
if (snapshot) {
|
||||
virtualFiles.updateSource(fileName, snapshot, host.getLanguageId?.(fileName));
|
||||
}
|
||||
else {
|
||||
virtualFiles.deleteSource(fileName);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (const fileName of remainRootFiles) {
|
||||
virtualFiles.deleteSource(fileName);
|
||||
}
|
||||
lastRootFiles = nowRootFiles;
|
||||
lastProjectVersion = newProjectVersion;
|
||||
}
|
||||
}
|
||||
exports.createLanguageContext = createLanguageContext;
|
||||
//# sourceMappingURL=languageContext.js.map
|
6
node_modules/@volar/language-core/lib/sourceMaps.d.ts
generated
vendored
Normal file
6
node_modules/@volar/language-core/lib/sourceMaps.d.ts
generated
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
import * as SourceMaps from '@volar/source-map';
|
||||
import { MirrorBehaviorCapabilities } from './types';
|
||||
export declare class MirrorMap extends SourceMaps.SourceMap<[MirrorBehaviorCapabilities, MirrorBehaviorCapabilities]> {
|
||||
findMirrorOffsets(start: number): Generator<readonly [number, MirrorBehaviorCapabilities], void, unknown>;
|
||||
}
|
||||
//# sourceMappingURL=sourceMaps.d.ts.map
|
16
node_modules/@volar/language-core/lib/sourceMaps.js
generated
vendored
Normal file
16
node_modules/@volar/language-core/lib/sourceMaps.js
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.MirrorMap = void 0;
|
||||
const SourceMaps = require("@volar/source-map");
|
||||
class MirrorMap extends SourceMaps.SourceMap {
|
||||
*findMirrorOffsets(start) {
|
||||
for (const mapped of this.toGeneratedOffsets(start)) {
|
||||
yield [mapped[0], mapped[1].data[1]];
|
||||
}
|
||||
for (const mapped of this.toSourceOffsets(start)) {
|
||||
yield [mapped[0], mapped[1].data[0]];
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.MirrorMap = MirrorMap;
|
||||
//# sourceMappingURL=sourceMaps.js.map
|
76
node_modules/@volar/language-core/lib/types.d.ts
generated
vendored
Normal file
76
node_modules/@volar/language-core/lib/types.d.ts
generated
vendored
Normal file
@ -0,0 +1,76 @@
|
||||
import { Mapping, Stack } from '@volar/source-map';
|
||||
import type * as ts from 'typescript/lib/tsserverlibrary';
|
||||
export interface FileCapabilities {
|
||||
diagnostic?: boolean;
|
||||
foldingRange?: boolean;
|
||||
documentFormatting?: boolean;
|
||||
documentSymbol?: boolean;
|
||||
codeAction?: boolean;
|
||||
inlayHint?: boolean;
|
||||
}
|
||||
export interface FileRangeCapabilities {
|
||||
hover?: boolean;
|
||||
references?: boolean;
|
||||
definition?: boolean;
|
||||
rename?: boolean | {
|
||||
normalize?(newName: string): string;
|
||||
apply?(newName: string): string;
|
||||
};
|
||||
completion?: boolean | {
|
||||
additional?: boolean;
|
||||
autoImportOnly?: boolean;
|
||||
};
|
||||
diagnostic?: boolean | {
|
||||
shouldReport(): boolean;
|
||||
};
|
||||
semanticTokens?: boolean;
|
||||
referencesCodeLens?: boolean;
|
||||
displayWithLink?: boolean;
|
||||
}
|
||||
export interface MirrorBehaviorCapabilities {
|
||||
references?: boolean;
|
||||
definition?: boolean;
|
||||
rename?: boolean;
|
||||
}
|
||||
export declare namespace FileCapabilities {
|
||||
const full: FileCapabilities;
|
||||
}
|
||||
export declare namespace FileRangeCapabilities {
|
||||
const full: FileRangeCapabilities;
|
||||
}
|
||||
export declare namespace MirrorBehaviorCapabilities {
|
||||
const full: MirrorBehaviorCapabilities;
|
||||
}
|
||||
export declare enum FileKind {
|
||||
TextFile = 0,
|
||||
TypeScriptHostFile = 1
|
||||
}
|
||||
export interface VirtualFile {
|
||||
fileName: string;
|
||||
snapshot: ts.IScriptSnapshot;
|
||||
kind: FileKind;
|
||||
capabilities: FileCapabilities;
|
||||
mappings: Mapping<FileRangeCapabilities>[];
|
||||
codegenStacks: Stack[];
|
||||
mirrorBehaviorMappings?: Mapping<[MirrorBehaviorCapabilities, MirrorBehaviorCapabilities]>[];
|
||||
embeddedFiles: VirtualFile[];
|
||||
}
|
||||
export interface Language<T extends VirtualFile = VirtualFile> {
|
||||
resolveHost?(host: TypeScriptLanguageHost): TypeScriptLanguageHost;
|
||||
createVirtualFile(fileName: string, snapshot: ts.IScriptSnapshot, languageId: string | undefined): T | undefined;
|
||||
updateVirtualFile(virtualFile: T, snapshot: ts.IScriptSnapshot): void;
|
||||
deleteVirtualFile?(virtualFile: T): void;
|
||||
}
|
||||
interface LanguageHost {
|
||||
workspacePath: string;
|
||||
rootPath: string;
|
||||
getProjectVersion(): string;
|
||||
getScriptFileNames(): string[];
|
||||
getScriptSnapshot(fileName: string): ts.IScriptSnapshot | undefined;
|
||||
getLanguageId?(fileName: string): string | undefined;
|
||||
}
|
||||
export interface TypeScriptLanguageHost extends LanguageHost, Pick<ts.LanguageServiceHost, 'getCancellationToken' | 'getLocalizedDiagnosticMessages' | 'getCompilationSettings' | 'getProjectReferences'> {
|
||||
resolveModuleName?(path: string, impliedNodeFormat?: ts.ResolutionMode): string;
|
||||
}
|
||||
export {};
|
||||
//# sourceMappingURL=types.d.ts.map
|
40
node_modules/@volar/language-core/lib/types.js
generated
vendored
Normal file
40
node_modules/@volar/language-core/lib/types.js
generated
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.FileKind = exports.MirrorBehaviorCapabilities = exports.FileRangeCapabilities = exports.FileCapabilities = void 0;
|
||||
var FileCapabilities;
|
||||
(function (FileCapabilities) {
|
||||
FileCapabilities.full = {
|
||||
diagnostic: true,
|
||||
foldingRange: true,
|
||||
documentFormatting: true,
|
||||
documentSymbol: true,
|
||||
codeAction: true,
|
||||
inlayHint: true,
|
||||
};
|
||||
})(FileCapabilities || (exports.FileCapabilities = FileCapabilities = {}));
|
||||
var FileRangeCapabilities;
|
||||
(function (FileRangeCapabilities) {
|
||||
FileRangeCapabilities.full = {
|
||||
hover: true,
|
||||
references: true,
|
||||
definition: true,
|
||||
rename: true,
|
||||
completion: true,
|
||||
diagnostic: true,
|
||||
semanticTokens: true,
|
||||
};
|
||||
})(FileRangeCapabilities || (exports.FileRangeCapabilities = FileRangeCapabilities = {}));
|
||||
var MirrorBehaviorCapabilities;
|
||||
(function (MirrorBehaviorCapabilities) {
|
||||
MirrorBehaviorCapabilities.full = {
|
||||
references: true,
|
||||
definition: true,
|
||||
rename: true,
|
||||
};
|
||||
})(MirrorBehaviorCapabilities || (exports.MirrorBehaviorCapabilities = MirrorBehaviorCapabilities = {}));
|
||||
var FileKind;
|
||||
(function (FileKind) {
|
||||
FileKind[FileKind["TextFile"] = 0] = "TextFile";
|
||||
FileKind[FileKind["TypeScriptHostFile"] = 1] = "TypeScriptHostFile";
|
||||
})(FileKind || (exports.FileKind = FileKind = {}));
|
||||
//# sourceMappingURL=types.js.map
|
26
node_modules/@volar/language-core/lib/virtualFiles.d.ts
generated
vendored
Normal file
26
node_modules/@volar/language-core/lib/virtualFiles.d.ts
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
import { SourceMap } from '@volar/source-map';
|
||||
import type * as ts from 'typescript/lib/tsserverlibrary';
|
||||
import { MirrorMap } from './sourceMaps';
|
||||
import type { FileRangeCapabilities, Language, VirtualFile } from './types';
|
||||
export type VirtualFiles = ReturnType<typeof createVirtualFiles>;
|
||||
export interface Source {
|
||||
fileName: string;
|
||||
languageId: string | undefined;
|
||||
snapshot: ts.IScriptSnapshot;
|
||||
root: VirtualFile;
|
||||
language: Language;
|
||||
}
|
||||
export declare function createVirtualFiles(languages: Language[]): {
|
||||
allSources(): Source[];
|
||||
updateSource(fileName: string, snapshot: ts.IScriptSnapshot, languageId: string | undefined): VirtualFile | undefined;
|
||||
deleteSource(fileName: string): void;
|
||||
getSource(fileName: string): Source | undefined;
|
||||
hasSource: (fileName: string) => boolean;
|
||||
getMirrorMap: (file: VirtualFile) => MirrorMap | undefined;
|
||||
getMaps: (virtualFile: VirtualFile) => Map<string, [ts.IScriptSnapshot, SourceMap<FileRangeCapabilities>]>;
|
||||
hasVirtualFile(fileName: string): boolean;
|
||||
getVirtualFile(fileName: string): readonly [VirtualFile, Source] | readonly [undefined, undefined];
|
||||
};
|
||||
export declare function updateVirtualFileMaps(virtualFile: VirtualFile, getSourceSnapshot: (source: string | undefined) => [string, ts.IScriptSnapshot] | undefined, map?: Map<string, [ts.IScriptSnapshot, SourceMap<FileRangeCapabilities>]>): Map<string, [ts.IScriptSnapshot, SourceMap<FileRangeCapabilities>]>;
|
||||
export declare function forEachEmbeddedFile(file: VirtualFile, cb: (embedded: VirtualFile) => void): void;
|
||||
//# sourceMappingURL=virtualFiles.d.ts.map
|
129
node_modules/@volar/language-core/lib/virtualFiles.js
generated
vendored
Normal file
129
node_modules/@volar/language-core/lib/virtualFiles.js
generated
vendored
Normal file
@ -0,0 +1,129 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.forEachEmbeddedFile = exports.updateVirtualFileMaps = exports.createVirtualFiles = void 0;
|
||||
const source_map_1 = require("@volar/source-map");
|
||||
const sourceMaps_1 = require("./sourceMaps");
|
||||
function createVirtualFiles(languages) {
|
||||
const sourceFiles = new Map();
|
||||
const virtualFiles = new Map();
|
||||
const virtualFileMaps = new WeakMap();
|
||||
const virtualFileToMirrorMap = new WeakMap();
|
||||
return {
|
||||
allSources() {
|
||||
return Array.from(sourceFiles.values());
|
||||
},
|
||||
updateSource(fileName, snapshot, languageId) {
|
||||
const key = normalizePath(fileName);
|
||||
const value = sourceFiles.get(key);
|
||||
if (value) {
|
||||
if (value.languageId !== languageId) {
|
||||
// languageId changed
|
||||
this.deleteSource(fileName);
|
||||
return this.updateSource(fileName, snapshot, languageId);
|
||||
}
|
||||
else {
|
||||
value.snapshot = snapshot;
|
||||
deleteVirtualFiles(value);
|
||||
value.language.updateVirtualFile(value.root, snapshot);
|
||||
updateVirtualFiles(value);
|
||||
return value.root; // updated
|
||||
}
|
||||
}
|
||||
for (const language of languages) {
|
||||
const virtualFile = language.createVirtualFile(fileName, snapshot, languageId);
|
||||
if (virtualFile) {
|
||||
const source = { fileName, languageId, snapshot, root: virtualFile, language };
|
||||
sourceFiles.set(key, source);
|
||||
updateVirtualFiles(source);
|
||||
return virtualFile; // created
|
||||
}
|
||||
}
|
||||
},
|
||||
deleteSource(fileName) {
|
||||
const key = normalizePath(fileName);
|
||||
const value = sourceFiles.get(key);
|
||||
if (value) {
|
||||
value.language.deleteVirtualFile?.(value.root);
|
||||
sourceFiles.delete(key); // deleted
|
||||
deleteVirtualFiles(value);
|
||||
}
|
||||
},
|
||||
getSource(fileName) {
|
||||
const key = normalizePath(fileName);
|
||||
return sourceFiles.get(key);
|
||||
},
|
||||
hasSource: (fileName) => sourceFiles.has(normalizePath(fileName)),
|
||||
getMirrorMap: getMirrorMap,
|
||||
getMaps: getMapsByVirtualFile,
|
||||
hasVirtualFile(fileName) {
|
||||
return !!virtualFiles.get(normalizePath(fileName));
|
||||
},
|
||||
getVirtualFile(fileName) {
|
||||
const sourceAndVirtual = virtualFiles.get(normalizePath(fileName));
|
||||
if (sourceAndVirtual) {
|
||||
return [sourceAndVirtual.virtualFile, sourceAndVirtual.source];
|
||||
}
|
||||
return [undefined, undefined];
|
||||
},
|
||||
};
|
||||
function deleteVirtualFiles(source) {
|
||||
forEachEmbeddedFile(source.root, file => {
|
||||
virtualFiles.delete(normalizePath(file.fileName));
|
||||
});
|
||||
}
|
||||
function updateVirtualFiles(source) {
|
||||
forEachEmbeddedFile(source.root, file => {
|
||||
virtualFiles.set(normalizePath(file.fileName), { virtualFile: file, source });
|
||||
});
|
||||
}
|
||||
function getMapsByVirtualFile(virtualFile) {
|
||||
if (!virtualFileMaps.has(virtualFile.snapshot)) {
|
||||
virtualFileMaps.set(virtualFile.snapshot, new Map());
|
||||
}
|
||||
updateVirtualFileMaps(virtualFile, sourceFileName => {
|
||||
if (sourceFileName) {
|
||||
const source = sourceFiles.get(normalizePath(sourceFileName));
|
||||
return [sourceFileName, source.snapshot];
|
||||
}
|
||||
else {
|
||||
const source = virtualFiles.get(normalizePath(virtualFile.fileName)).source;
|
||||
return [source.fileName, source.snapshot];
|
||||
}
|
||||
}, virtualFileMaps.get(virtualFile.snapshot));
|
||||
return virtualFileMaps.get(virtualFile.snapshot);
|
||||
}
|
||||
function getMirrorMap(file) {
|
||||
if (!virtualFileToMirrorMap.has(file.snapshot)) {
|
||||
virtualFileToMirrorMap.set(file.snapshot, file.mirrorBehaviorMappings ? new sourceMaps_1.MirrorMap(file.mirrorBehaviorMappings) : undefined);
|
||||
}
|
||||
return virtualFileToMirrorMap.get(file.snapshot);
|
||||
}
|
||||
}
|
||||
exports.createVirtualFiles = createVirtualFiles;
|
||||
function updateVirtualFileMaps(virtualFile, getSourceSnapshot, map = new Map()) {
|
||||
const sources = new Set();
|
||||
for (const mapping of virtualFile.mappings) {
|
||||
if (sources.has(mapping.source))
|
||||
continue;
|
||||
sources.add(mapping.source);
|
||||
const source = getSourceSnapshot(mapping.source);
|
||||
if (!source)
|
||||
continue;
|
||||
if (!map.has(source[0]) || map.get(source[0])[0] !== source[1]) {
|
||||
map.set(source[0], [source[1], new source_map_1.SourceMap(virtualFile.mappings.filter(mapping2 => mapping2.source === mapping.source))]);
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
exports.updateVirtualFileMaps = updateVirtualFileMaps;
|
||||
function forEachEmbeddedFile(file, cb) {
|
||||
cb(file);
|
||||
for (const embeddedFile of file.embeddedFiles) {
|
||||
forEachEmbeddedFile(embeddedFile, cb);
|
||||
}
|
||||
}
|
||||
exports.forEachEmbeddedFile = forEachEmbeddedFile;
|
||||
function normalizePath(fileName) {
|
||||
return fileName.replace(/\\/g, '/').toLowerCase();
|
||||
}
|
||||
//# sourceMappingURL=virtualFiles.js.map
|
Reference in New Issue
Block a user