This commit is contained in:
Martin Aeschlimann
2025-04-10 11:24:30 +02:00
parent 618a091f90
commit 165c1094cd
3 changed files with 17 additions and 15 deletions

View File

@@ -590,14 +590,11 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment)
connection.onRequest(TextDocumentContentRequest.type, (params, token) => {
return runSafe(runtime, async () => {
const url = new URL(params.uri);
if (url.protocol.slice(0, -1) !== FILE_PROTOCOL) {
return null;
}
const languageMode = languageModes.getMode(url.hostname);
if (languageMode && languageMode.getTextDocumentContent) {
const content = await languageMode.getTextDocumentContent(url.pathname.slice(1));
return { text: content };
for (const languageMode of languageModes.getAllModes()) {
const content = await languageMode.getTextDocumentContent?.(params.uri);
if (content) {
return { text: content };
}
}
return null;
}, null, `Error while computing text document content for ${params.uri}`, token);

View File

@@ -8,7 +8,7 @@ import {
SymbolInformation, SymbolKind, CompletionItem, Location, SignatureHelp, SignatureInformation, ParameterInformation,
Definition, TextEdit, TextDocument, Diagnostic, DiagnosticSeverity, Range, CompletionItemKind, Hover,
DocumentHighlight, DocumentHighlightKind, CompletionList, Position, FormattingOptions, FoldingRange, FoldingRangeKind, SelectionRange,
LanguageMode, Settings, SemanticTokenData, Workspace, DocumentContext, CompletionItemData, isCompletionItemData, FILE_PROTOCOL
LanguageMode, Settings, SemanticTokenData, Workspace, DocumentContext, CompletionItemData, isCompletionItemData, FILE_PROTOCOL, DocumentUri
} from './languageModes';
import { getWordAtText, isWhitespaceOnly, repeat } from '../utils/strings';
import { HTMLDocumentRegions } from './embeddedSupport';
@@ -110,6 +110,8 @@ export function getJavaScriptMode(documentRegions: LanguageModelCache<HTMLDocume
const host = getLanguageServiceHost(languageId === 'javascript' ? ts.ScriptKind.JS : ts.ScriptKind.TS);
const globalSettings: Settings = {};
const libParentUri = `${FILE_PROTOCOL}://${languageId}/libs/`;
function updateHostSettings(settings: Settings) {
const hostSettings = host.getCompilationSettings();
hostSettings.experimentalDecorators = settings?.['js/ts']?.implicitProjectConfig?.experimentalDecorators;
@@ -315,7 +317,7 @@ export function getJavaScriptMode(documentRegions: LanguageModelCache<HTMLDocume
range: convertRange(jsDocument, d.textSpan)
};
} else {
const libUri = `${FILE_PROTOCOL}://${languageId}/${d.fileName}`;
const libUri = libParentUri + d.fileName;
const content = await host.loadLibrary(d.fileName);
if (!content) {
return undefined;
@@ -421,8 +423,11 @@ export function getJavaScriptMode(documentRegions: LanguageModelCache<HTMLDocume
getSemanticTokenLegend(): { types: string[]; modifiers: string[] } {
return getSemanticTokenLegend();
},
getTextDocumentContent(name: string): Promise<string> {
return host.loadLibrary(name);
async getTextDocumentContent(documentUri: DocumentUri): Promise<string | undefined> {
if (documentUri.startsWith(libParentUri)) {
return host.loadLibrary(documentUri.substring(libParentUri.length));
}
return undefined;
},
dispose() {
host.dispose();

View File

@@ -14,7 +14,7 @@ import {
Color, ColorInformation, ColorPresentation, WorkspaceEdit,
WorkspaceFolder
} from 'vscode-languageserver';
import { TextDocument } from 'vscode-languageserver-textdocument';
import { DocumentUri, TextDocument } from 'vscode-languageserver-textdocument';
import { getLanguageModelCache, LanguageModelCache } from '../languageModelCache';
import { getCSSMode } from './cssMode';
@@ -34,7 +34,7 @@ export {
export { ClientCapabilities, DocumentContext, LanguageService, HTMLDocument, HTMLFormatConfiguration, TokenType } from 'vscode-html-languageservice';
export { TextDocument } from 'vscode-languageserver-textdocument';
export { TextDocument, DocumentUri } from 'vscode-languageserver-textdocument';
export interface Settings {
readonly css?: any;
@@ -89,7 +89,7 @@ export interface LanguageMode {
onDocumentRemoved(document: TextDocument): void;
getSemanticTokens?(document: TextDocument): Promise<SemanticTokenData[]>;
getSemanticTokenLegend?(): { types: string[]; modifiers: string[] };
getTextDocumentContent?(name: string): Promise<string>;
getTextDocumentContent?(uri: DocumentUri): Promise<string | undefined>;
dispose(): void;
}