Version 1.0

This commit is contained in:
Alexander R.
2026-07-21 22:24:25 +00:00
parent f3645fbfbc
commit 9edbfd3f77
4134 changed files with 1448752 additions and 1 deletions
@@ -0,0 +1,716 @@
import { InsertTextFormat, CompletionItemKind, DocumentHighlightKind, SymbolKind, FoldingRangeKind, DiagnosticSeverity } from '../../../external/vscode-languageserver-types/lib/esm/main.js';
import '../../editor/browser/coreCommands.js';
import '../../editor/browser/widget/codeEditor/codeEditorWidget.js';
import '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';
import '../../editor/contrib/anchorSelect/browser/anchorSelect.js';
import '../../editor/contrib/bracketMatching/browser/bracketMatching.js';
import '../../editor/contrib/caretOperations/browser/caretOperations.js';
import '../../editor/contrib/caretOperations/browser/transpose.js';
import '../../editor/contrib/clipboard/browser/clipboard.js';
import '../../editor/contrib/codeAction/browser/codeActionContributions.js';
import '../../editor/contrib/codelens/browser/codelensController.js';
import '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';
import '../../editor/contrib/comment/browser/comment.js';
import '../../editor/contrib/contextmenu/browser/contextmenu.js';
import '../../editor/contrib/cursorUndo/browser/cursorUndo.js';
import '../../editor/contrib/dnd/browser/dnd.js';
import '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';
import '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';
import '../../editor/contrib/find/browser/findController.js';
import '../../editor/contrib/folding/browser/folding.js';
import '../../editor/contrib/fontZoom/browser/fontZoom.js';
import '../../editor/contrib/format/browser/formatActions.js';
import '../../editor/contrib/documentSymbols/browser/documentSymbols.js';
import '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';
import '../../editor/contrib/inlineProgress/browser/inlineProgress.js';
import '../../editor/contrib/gotoSymbol/browser/goToCommands.js';
import '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';
import '../../editor/contrib/gotoError/browser/gotoError.js';
import '../../editor/contrib/gpu/browser/gpuActions.js';
import '../../editor/contrib/hover/browser/hoverContribution.js';
import '../../editor/contrib/indentation/browser/indentation.js';
import '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';
import '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';
import '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';
import '../../editor/contrib/lineSelection/browser/lineSelection.js';
import '../../editor/contrib/linesOperations/browser/linesOperations.js';
import '../../editor/contrib/linkedEditing/browser/linkedEditing.js';
import '../../editor/contrib/links/browser/links.js';
import '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';
import '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';
import '../../editor/contrib/multicursor/browser/multicursor.js';
import '../../editor/contrib/parameterHints/browser/parameterHints.js';
import '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';
import '../../editor/contrib/rename/browser/rename.js';
import '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';
import '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';
import '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';
import '../../editor/contrib/smartSelect/browser/smartSelect.js';
import '../../editor/contrib/snippet/browser/snippetController2.js';
import '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';
import '../../editor/contrib/suggest/browser/suggestController.js';
import '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';
import '../../editor/contrib/tokenization/browser/tokenization.js';
import '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';
import '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';
import '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';
import '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';
import '../../editor/contrib/wordOperations/browser/wordOperations.js';
import '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';
import '../../editor/contrib/readOnlyMessage/browser/contribution.js';
import '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';
import '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';
import '../../editor/common/standaloneStrings.js';
import '../../base/browser/ui/codicons/codicon/codicon.css';
import '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';
import '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';
import '../../editor/standalone/browser/inspectTokens/inspectTokens.js';
import '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';
import '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';
import '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';
import { editor, Range, languages, Uri, MarkerSeverity } from '../../editor/editor.api2.js';
class DiagnosticsAdapter {
constructor(_languageId, _worker, configChangeEvent) {
this._languageId = _languageId;
this._worker = _worker;
this._disposables = [];
this._listener = /* @__PURE__ */ Object.create(null);
const onModelAdd = (model) => {
let modeId = model.getLanguageId();
if (modeId !== this._languageId) {
return;
}
let handle;
this._listener[model.uri.toString()] = model.onDidChangeContent(() => {
window.clearTimeout(handle);
handle = window.setTimeout(() => this._doValidate(model.uri, modeId), 500);
});
this._doValidate(model.uri, modeId);
};
const onModelRemoved = (model) => {
editor.setModelMarkers(model, this._languageId, []);
let uriStr = model.uri.toString();
let listener = this._listener[uriStr];
if (listener) {
listener.dispose();
delete this._listener[uriStr];
}
};
this._disposables.push(editor.onDidCreateModel(onModelAdd));
this._disposables.push(editor.onWillDisposeModel(onModelRemoved));
this._disposables.push(
editor.onDidChangeModelLanguage((event) => {
onModelRemoved(event.model);
onModelAdd(event.model);
})
);
this._disposables.push(
configChangeEvent((_) => {
editor.getModels().forEach((model) => {
if (model.getLanguageId() === this._languageId) {
onModelRemoved(model);
onModelAdd(model);
}
});
})
);
this._disposables.push({
dispose: () => {
editor.getModels().forEach(onModelRemoved);
for (let key in this._listener) {
this._listener[key].dispose();
}
}
});
editor.getModels().forEach(onModelAdd);
}
dispose() {
this._disposables.forEach((d) => d && d.dispose());
this._disposables.length = 0;
}
_doValidate(resource, languageId) {
this._worker(resource).then((worker) => {
return worker.doValidation(resource.toString());
}).then((diagnostics) => {
const markers = diagnostics.map((d) => toDiagnostics(resource, d));
let model = editor.getModel(resource);
if (model && model.getLanguageId() === languageId) {
editor.setModelMarkers(model, languageId, markers);
}
}).then(void 0, (err) => {
console.error(err);
});
}
}
function toSeverity(lsSeverity) {
switch (lsSeverity) {
case DiagnosticSeverity.Error:
return MarkerSeverity.Error;
case DiagnosticSeverity.Warning:
return MarkerSeverity.Warning;
case DiagnosticSeverity.Information:
return MarkerSeverity.Info;
case DiagnosticSeverity.Hint:
return MarkerSeverity.Hint;
default:
return MarkerSeverity.Info;
}
}
function toDiagnostics(resource, diag) {
let code = typeof diag.code === "number" ? String(diag.code) : diag.code;
return {
severity: toSeverity(diag.severity),
startLineNumber: diag.range.start.line + 1,
startColumn: diag.range.start.character + 1,
endLineNumber: diag.range.end.line + 1,
endColumn: diag.range.end.character + 1,
message: diag.message,
code,
source: diag.source
};
}
class CompletionAdapter {
constructor(_worker, _triggerCharacters) {
this._worker = _worker;
this._triggerCharacters = _triggerCharacters;
}
get triggerCharacters() {
return this._triggerCharacters;
}
provideCompletionItems(model, position, context, token) {
const resource = model.uri;
return this._worker(resource).then((worker) => {
return worker.doComplete(resource.toString(), fromPosition(position));
}).then((info) => {
if (!info) {
return;
}
const wordInfo = model.getWordUntilPosition(position);
const wordRange = new Range(
position.lineNumber,
wordInfo.startColumn,
position.lineNumber,
wordInfo.endColumn
);
const items = info.items.map((entry) => {
const item = {
label: entry.label,
insertText: entry.insertText || entry.label,
sortText: entry.sortText,
filterText: entry.filterText,
documentation: entry.documentation,
detail: entry.detail,
command: toCommand(entry.command),
range: wordRange,
kind: toCompletionItemKind(entry.kind)
};
if (entry.textEdit) {
if (isInsertReplaceEdit(entry.textEdit)) {
item.range = {
insert: toRange(entry.textEdit.insert),
replace: toRange(entry.textEdit.replace)
};
} else {
item.range = toRange(entry.textEdit.range);
}
item.insertText = entry.textEdit.newText;
}
if (entry.additionalTextEdits) {
item.additionalTextEdits = entry.additionalTextEdits.map(toTextEdit);
}
if (entry.insertTextFormat === InsertTextFormat.Snippet) {
item.insertTextRules = languages.CompletionItemInsertTextRule.InsertAsSnippet;
}
return item;
});
return {
isIncomplete: info.isIncomplete,
suggestions: items
};
});
}
}
function fromPosition(position) {
if (!position) {
return void 0;
}
return { character: position.column - 1, line: position.lineNumber - 1 };
}
function fromRange(range) {
if (!range) {
return void 0;
}
return {
start: {
line: range.startLineNumber - 1,
character: range.startColumn - 1
},
end: { line: range.endLineNumber - 1, character: range.endColumn - 1 }
};
}
function toRange(range) {
if (!range) {
return void 0;
}
return new Range(
range.start.line + 1,
range.start.character + 1,
range.end.line + 1,
range.end.character + 1
);
}
function isInsertReplaceEdit(edit) {
return typeof edit.insert !== "undefined" && typeof edit.replace !== "undefined";
}
function toCompletionItemKind(kind) {
const mItemKind = languages.CompletionItemKind;
switch (kind) {
case CompletionItemKind.Text:
return mItemKind.Text;
case CompletionItemKind.Method:
return mItemKind.Method;
case CompletionItemKind.Function:
return mItemKind.Function;
case CompletionItemKind.Constructor:
return mItemKind.Constructor;
case CompletionItemKind.Field:
return mItemKind.Field;
case CompletionItemKind.Variable:
return mItemKind.Variable;
case CompletionItemKind.Class:
return mItemKind.Class;
case CompletionItemKind.Interface:
return mItemKind.Interface;
case CompletionItemKind.Module:
return mItemKind.Module;
case CompletionItemKind.Property:
return mItemKind.Property;
case CompletionItemKind.Unit:
return mItemKind.Unit;
case CompletionItemKind.Value:
return mItemKind.Value;
case CompletionItemKind.Enum:
return mItemKind.Enum;
case CompletionItemKind.Keyword:
return mItemKind.Keyword;
case CompletionItemKind.Snippet:
return mItemKind.Snippet;
case CompletionItemKind.Color:
return mItemKind.Color;
case CompletionItemKind.File:
return mItemKind.File;
case CompletionItemKind.Reference:
return mItemKind.Reference;
}
return mItemKind.Property;
}
function toTextEdit(textEdit) {
if (!textEdit) {
return void 0;
}
return {
range: toRange(textEdit.range),
text: textEdit.newText
};
}
function toCommand(c) {
return c && c.command === "editor.action.triggerSuggest" ? { id: c.command, title: c.title, arguments: c.arguments } : void 0;
}
class HoverAdapter {
constructor(_worker) {
this._worker = _worker;
}
provideHover(model, position, token) {
let resource = model.uri;
return this._worker(resource).then((worker) => {
return worker.doHover(resource.toString(), fromPosition(position));
}).then((info) => {
if (!info) {
return;
}
return {
range: toRange(info.range),
contents: toMarkedStringArray(info.contents)
};
});
}
}
function isMarkupContent(thing) {
return thing && typeof thing === "object" && typeof thing.kind === "string";
}
function toMarkdownString(entry) {
if (typeof entry === "string") {
return {
value: entry
};
}
if (isMarkupContent(entry)) {
if (entry.kind === "plaintext") {
return {
value: entry.value.replace(/[\\`*_{}[\]()#+\-.!]/g, "\\$&")
};
}
return {
value: entry.value
};
}
return { value: "```" + entry.language + "\n" + entry.value + "\n```\n" };
}
function toMarkedStringArray(contents) {
if (!contents) {
return void 0;
}
if (Array.isArray(contents)) {
return contents.map(toMarkdownString);
}
return [toMarkdownString(contents)];
}
class DocumentHighlightAdapter {
constructor(_worker) {
this._worker = _worker;
}
provideDocumentHighlights(model, position, token) {
const resource = model.uri;
return this._worker(resource).then((worker) => worker.findDocumentHighlights(resource.toString(), fromPosition(position))).then((entries) => {
if (!entries) {
return;
}
return entries.map((entry) => {
return {
range: toRange(entry.range),
kind: toDocumentHighlightKind(entry.kind)
};
});
});
}
}
function toDocumentHighlightKind(kind) {
switch (kind) {
case DocumentHighlightKind.Read:
return languages.DocumentHighlightKind.Read;
case DocumentHighlightKind.Write:
return languages.DocumentHighlightKind.Write;
case DocumentHighlightKind.Text:
return languages.DocumentHighlightKind.Text;
}
return languages.DocumentHighlightKind.Text;
}
class DefinitionAdapter {
constructor(_worker) {
this._worker = _worker;
}
provideDefinition(model, position, token) {
const resource = model.uri;
return this._worker(resource).then((worker) => {
return worker.findDefinition(resource.toString(), fromPosition(position));
}).then((definition) => {
if (!definition) {
return;
}
return [toLocation(definition)];
});
}
}
function toLocation(location) {
return {
uri: Uri.parse(location.uri),
range: toRange(location.range)
};
}
class ReferenceAdapter {
constructor(_worker) {
this._worker = _worker;
}
provideReferences(model, position, context, token) {
const resource = model.uri;
return this._worker(resource).then((worker) => {
return worker.findReferences(resource.toString(), fromPosition(position));
}).then((entries) => {
if (!entries) {
return;
}
return entries.map(toLocation);
});
}
}
class RenameAdapter {
constructor(_worker) {
this._worker = _worker;
}
provideRenameEdits(model, position, newName, token) {
const resource = model.uri;
return this._worker(resource).then((worker) => {
return worker.doRename(resource.toString(), fromPosition(position), newName);
}).then((edit) => {
return toWorkspaceEdit(edit);
});
}
}
function toWorkspaceEdit(edit) {
if (!edit || !edit.changes) {
return void 0;
}
let resourceEdits = [];
for (let uri in edit.changes) {
const _uri = Uri.parse(uri);
for (let e of edit.changes[uri]) {
resourceEdits.push({
resource: _uri,
versionId: void 0,
textEdit: {
range: toRange(e.range),
text: e.newText
}
});
}
}
return {
edits: resourceEdits
};
}
class DocumentSymbolAdapter {
constructor(_worker) {
this._worker = _worker;
}
provideDocumentSymbols(model, token) {
const resource = model.uri;
return this._worker(resource).then((worker) => worker.findDocumentSymbols(resource.toString())).then((items) => {
if (!items) {
return;
}
return items.map((item) => {
if (isDocumentSymbol(item)) {
return toDocumentSymbol(item);
}
return {
name: item.name,
detail: "",
containerName: item.containerName,
kind: toSymbolKind(item.kind),
range: toRange(item.location.range),
selectionRange: toRange(item.location.range),
tags: []
};
});
});
}
}
function isDocumentSymbol(symbol) {
return "children" in symbol;
}
function toDocumentSymbol(symbol) {
return {
name: symbol.name,
detail: symbol.detail ?? "",
kind: toSymbolKind(symbol.kind),
range: toRange(symbol.range),
selectionRange: toRange(symbol.selectionRange),
tags: symbol.tags ?? [],
children: (symbol.children ?? []).map((item) => toDocumentSymbol(item))
};
}
function toSymbolKind(kind) {
let mKind = languages.SymbolKind;
switch (kind) {
case SymbolKind.File:
return mKind.File;
case SymbolKind.Module:
return mKind.Module;
case SymbolKind.Namespace:
return mKind.Namespace;
case SymbolKind.Package:
return mKind.Package;
case SymbolKind.Class:
return mKind.Class;
case SymbolKind.Method:
return mKind.Method;
case SymbolKind.Property:
return mKind.Property;
case SymbolKind.Field:
return mKind.Field;
case SymbolKind.Constructor:
return mKind.Constructor;
case SymbolKind.Enum:
return mKind.Enum;
case SymbolKind.Interface:
return mKind.Interface;
case SymbolKind.Function:
return mKind.Function;
case SymbolKind.Variable:
return mKind.Variable;
case SymbolKind.Constant:
return mKind.Constant;
case SymbolKind.String:
return mKind.String;
case SymbolKind.Number:
return mKind.Number;
case SymbolKind.Boolean:
return mKind.Boolean;
case SymbolKind.Array:
return mKind.Array;
}
return mKind.Function;
}
class DocumentLinkAdapter {
constructor(_worker) {
this._worker = _worker;
}
provideLinks(model, token) {
const resource = model.uri;
return this._worker(resource).then((worker) => worker.findDocumentLinks(resource.toString())).then((items) => {
if (!items) {
return;
}
return {
links: items.map((item) => ({
range: toRange(item.range),
url: item.target
}))
};
});
}
}
class DocumentFormattingEditProvider {
constructor(_worker) {
this._worker = _worker;
}
provideDocumentFormattingEdits(model, options, token) {
const resource = model.uri;
return this._worker(resource).then((worker) => {
return worker.format(resource.toString(), null, fromFormattingOptions(options)).then((edits) => {
if (!edits || edits.length === 0) {
return;
}
return edits.map(toTextEdit);
});
});
}
}
class DocumentRangeFormattingEditProvider {
constructor(_worker) {
this._worker = _worker;
this.canFormatMultipleRanges = false;
}
provideDocumentRangeFormattingEdits(model, range, options, token) {
const resource = model.uri;
return this._worker(resource).then((worker) => {
return worker.format(resource.toString(), fromRange(range), fromFormattingOptions(options)).then((edits) => {
if (!edits || edits.length === 0) {
return;
}
return edits.map(toTextEdit);
});
});
}
}
function fromFormattingOptions(options) {
return {
tabSize: options.tabSize,
insertSpaces: options.insertSpaces
};
}
class DocumentColorAdapter {
constructor(_worker) {
this._worker = _worker;
}
provideDocumentColors(model, token) {
const resource = model.uri;
return this._worker(resource).then((worker) => worker.findDocumentColors(resource.toString())).then((infos) => {
if (!infos) {
return;
}
return infos.map((item) => ({
color: item.color,
range: toRange(item.range)
}));
});
}
provideColorPresentations(model, info, token) {
const resource = model.uri;
return this._worker(resource).then(
(worker) => worker.getColorPresentations(resource.toString(), info.color, fromRange(info.range))
).then((presentations) => {
if (!presentations) {
return;
}
return presentations.map((presentation) => {
let item = {
label: presentation.label
};
if (presentation.textEdit) {
item.textEdit = toTextEdit(presentation.textEdit);
}
if (presentation.additionalTextEdits) {
item.additionalTextEdits = presentation.additionalTextEdits.map(toTextEdit);
}
return item;
});
});
}
}
class FoldingRangeAdapter {
constructor(_worker) {
this._worker = _worker;
}
provideFoldingRanges(model, context, token) {
const resource = model.uri;
return this._worker(resource).then((worker) => worker.getFoldingRanges(resource.toString(), context)).then((ranges) => {
if (!ranges) {
return;
}
return ranges.map((range) => {
const result = {
start: range.startLine + 1,
end: range.endLine + 1
};
if (typeof range.kind !== "undefined") {
result.kind = toFoldingRangeKind(range.kind);
}
return result;
});
});
}
}
function toFoldingRangeKind(kind) {
switch (kind) {
case FoldingRangeKind.Comment:
return languages.FoldingRangeKind.Comment;
case FoldingRangeKind.Imports:
return languages.FoldingRangeKind.Imports;
case FoldingRangeKind.Region:
return languages.FoldingRangeKind.Region;
}
return void 0;
}
class SelectionRangeAdapter {
constructor(_worker) {
this._worker = _worker;
}
provideSelectionRanges(model, positions, token) {
const resource = model.uri;
return this._worker(resource).then(
(worker) => worker.getSelectionRanges(
resource.toString(),
positions.map(fromPosition)
)
).then((selectionRanges) => {
if (!selectionRanges) {
return;
}
return selectionRanges.map((selectionRange) => {
const result = [];
while (selectionRange) {
result.push({ range: toRange(selectionRange.range) });
selectionRange = selectionRange.parent;
}
return result;
});
});
}
}
export { CompletionAdapter, DefinitionAdapter, DiagnosticsAdapter, DocumentColorAdapter, DocumentFormattingEditProvider, DocumentHighlightAdapter, DocumentLinkAdapter, DocumentRangeFormattingEditProvider, DocumentSymbolAdapter, FoldingRangeAdapter, HoverAdapter, ReferenceAdapter, RenameAdapter, SelectionRangeAdapter, fromPosition, fromRange, toRange, toTextEdit };
@@ -0,0 +1,8 @@
import { initialize } from '../../common/initialize.js';
import { CSSWorker } from './cssWorker.js';
self.onmessage = () => {
initialize((ctx, createData) => {
return new CSSWorker(ctx, createData);
});
};
+198
View File
@@ -0,0 +1,198 @@
import { WorkerManager } from './workerManager.js';
import { CompletionAdapter, HoverAdapter, DocumentHighlightAdapter, DefinitionAdapter, ReferenceAdapter, DocumentSymbolAdapter, RenameAdapter, DocumentColorAdapter, FoldingRangeAdapter, DiagnosticsAdapter, SelectionRangeAdapter, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider } from '../common/lspLanguageFeatures.js';
export { DocumentLinkAdapter, fromPosition, fromRange, toRange, toTextEdit } from '../common/lspLanguageFeatures.js';
import '../../editor/browser/coreCommands.js';
import '../../editor/browser/widget/codeEditor/codeEditorWidget.js';
import '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';
import '../../editor/contrib/anchorSelect/browser/anchorSelect.js';
import '../../editor/contrib/bracketMatching/browser/bracketMatching.js';
import '../../editor/contrib/caretOperations/browser/caretOperations.js';
import '../../editor/contrib/caretOperations/browser/transpose.js';
import '../../editor/contrib/clipboard/browser/clipboard.js';
import '../../editor/contrib/codeAction/browser/codeActionContributions.js';
import '../../editor/contrib/codelens/browser/codelensController.js';
import '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';
import '../../editor/contrib/comment/browser/comment.js';
import '../../editor/contrib/contextmenu/browser/contextmenu.js';
import '../../editor/contrib/cursorUndo/browser/cursorUndo.js';
import '../../editor/contrib/dnd/browser/dnd.js';
import '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';
import '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';
import '../../editor/contrib/find/browser/findController.js';
import '../../editor/contrib/folding/browser/folding.js';
import '../../editor/contrib/fontZoom/browser/fontZoom.js';
import '../../editor/contrib/format/browser/formatActions.js';
import '../../editor/contrib/documentSymbols/browser/documentSymbols.js';
import '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';
import '../../editor/contrib/inlineProgress/browser/inlineProgress.js';
import '../../editor/contrib/gotoSymbol/browser/goToCommands.js';
import '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';
import '../../editor/contrib/gotoError/browser/gotoError.js';
import '../../editor/contrib/gpu/browser/gpuActions.js';
import '../../editor/contrib/hover/browser/hoverContribution.js';
import '../../editor/contrib/indentation/browser/indentation.js';
import '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';
import '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';
import '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';
import '../../editor/contrib/lineSelection/browser/lineSelection.js';
import '../../editor/contrib/linesOperations/browser/linesOperations.js';
import '../../editor/contrib/linkedEditing/browser/linkedEditing.js';
import '../../editor/contrib/links/browser/links.js';
import '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';
import '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';
import '../../editor/contrib/multicursor/browser/multicursor.js';
import '../../editor/contrib/parameterHints/browser/parameterHints.js';
import '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';
import '../../editor/contrib/rename/browser/rename.js';
import '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';
import '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';
import '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';
import '../../editor/contrib/smartSelect/browser/smartSelect.js';
import '../../editor/contrib/snippet/browser/snippetController2.js';
import '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';
import '../../editor/contrib/suggest/browser/suggestController.js';
import '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';
import '../../editor/contrib/tokenization/browser/tokenization.js';
import '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';
import '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';
import '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';
import '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';
import '../../editor/contrib/wordOperations/browser/wordOperations.js';
import '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';
import '../../editor/contrib/readOnlyMessage/browser/contribution.js';
import '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';
import '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';
import '../../editor/common/standaloneStrings.js';
import '../../base/browser/ui/codicons/codicon/codicon.css';
import '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';
import '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';
import '../../editor/standalone/browser/inspectTokens/inspectTokens.js';
import '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';
import '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';
import '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';
import { languages } from '../../editor/editor.api2.js';
function setupMode(defaults) {
const disposables = [];
const providers = [];
const client = new WorkerManager(defaults);
disposables.push(client);
const worker = (...uris) => {
return client.getLanguageServiceWorker(...uris);
};
function registerProviders() {
const { languageId, modeConfiguration } = defaults;
disposeAll(providers);
if (modeConfiguration.completionItems) {
providers.push(
languages.registerCompletionItemProvider(
languageId,
new CompletionAdapter(worker, ["/", "-", ":"])
)
);
}
if (modeConfiguration.hovers) {
providers.push(
languages.registerHoverProvider(languageId, new HoverAdapter(worker))
);
}
if (modeConfiguration.documentHighlights) {
providers.push(
languages.registerDocumentHighlightProvider(
languageId,
new DocumentHighlightAdapter(worker)
)
);
}
if (modeConfiguration.definitions) {
providers.push(
languages.registerDefinitionProvider(
languageId,
new DefinitionAdapter(worker)
)
);
}
if (modeConfiguration.references) {
providers.push(
languages.registerReferenceProvider(
languageId,
new ReferenceAdapter(worker)
)
);
}
if (modeConfiguration.documentSymbols) {
providers.push(
languages.registerDocumentSymbolProvider(
languageId,
new DocumentSymbolAdapter(worker)
)
);
}
if (modeConfiguration.rename) {
providers.push(
languages.registerRenameProvider(languageId, new RenameAdapter(worker))
);
}
if (modeConfiguration.colors) {
providers.push(
languages.registerColorProvider(
languageId,
new DocumentColorAdapter(worker)
)
);
}
if (modeConfiguration.foldingRanges) {
providers.push(
languages.registerFoldingRangeProvider(
languageId,
new FoldingRangeAdapter(worker)
)
);
}
if (modeConfiguration.diagnostics) {
providers.push(
new DiagnosticsAdapter(languageId, worker, defaults.onDidChange)
);
}
if (modeConfiguration.selectionRanges) {
providers.push(
languages.registerSelectionRangeProvider(
languageId,
new SelectionRangeAdapter(worker)
)
);
}
if (modeConfiguration.documentFormattingEdits) {
providers.push(
languages.registerDocumentFormattingEditProvider(
languageId,
new DocumentFormattingEditProvider(worker)
)
);
}
if (modeConfiguration.documentRangeFormattingEdits) {
providers.push(
languages.registerDocumentRangeFormattingEditProvider(
languageId,
new DocumentRangeFormattingEditProvider(worker)
)
);
}
}
registerProviders();
disposables.push(asDisposable(providers));
return asDisposable(disposables);
}
function asDisposable(disposables) {
return { dispose: () => disposeAll(disposables) };
}
function disposeAll(disposables) {
while (disposables.length) {
disposables.pop().dispose();
}
}
export { CompletionAdapter, DefinitionAdapter, DiagnosticsAdapter, DocumentColorAdapter, DocumentFormattingEditProvider, DocumentHighlightAdapter, DocumentRangeFormattingEditProvider, DocumentSymbolAdapter, FoldingRangeAdapter, HoverAdapter, ReferenceAdapter, RenameAdapter, SelectionRangeAdapter, WorkerManager, setupMode };
+183
View File
@@ -0,0 +1,183 @@
import { newCSSDataProvider, getSCSSLanguageService, getLESSLanguageService, getCSSLanguageService } from '../../../external/vscode-css-languageservice/lib/esm/cssLanguageService.js';
import { TextDocument } from '../../../external/vscode-languageserver-textdocument/lib/esm/main.js';
class CSSWorker {
constructor(ctx, createData) {
this._ctx = ctx;
this._languageSettings = createData.options;
this._languageId = createData.languageId;
const data = createData.options.data;
const useDefaultDataProvider = data?.useDefaultDataProvider;
const customDataProviders = [];
if (data?.dataProviders) {
for (const id in data.dataProviders) {
customDataProviders.push(newCSSDataProvider(data.dataProviders[id]));
}
}
const lsOptions = {
customDataProviders,
useDefaultDataProvider
};
switch (this._languageId) {
case "css":
this._languageService = getCSSLanguageService(lsOptions);
break;
case "less":
this._languageService = getLESSLanguageService(lsOptions);
break;
case "scss":
this._languageService = getSCSSLanguageService(lsOptions);
break;
default:
throw new Error("Invalid language id: " + this._languageId);
}
this._languageService.configure(this._languageSettings);
}
// --- language service host ---------------
async doValidation(uri) {
const document = this._getTextDocument(uri);
if (document) {
const stylesheet = this._languageService.parseStylesheet(document);
const diagnostics = this._languageService.doValidation(document, stylesheet);
return Promise.resolve(diagnostics);
}
return Promise.resolve([]);
}
async doComplete(uri, position) {
const document = this._getTextDocument(uri);
if (!document) {
return null;
}
const stylesheet = this._languageService.parseStylesheet(document);
const completions = this._languageService.doComplete(document, position, stylesheet);
return Promise.resolve(completions);
}
async doHover(uri, position) {
const document = this._getTextDocument(uri);
if (!document) {
return null;
}
const stylesheet = this._languageService.parseStylesheet(document);
const hover = this._languageService.doHover(document, position, stylesheet);
return Promise.resolve(hover);
}
async findDefinition(uri, position) {
const document = this._getTextDocument(uri);
if (!document) {
return null;
}
const stylesheet = this._languageService.parseStylesheet(document);
const definition = this._languageService.findDefinition(document, position, stylesheet);
return Promise.resolve(definition);
}
async findReferences(uri, position) {
const document = this._getTextDocument(uri);
if (!document) {
return [];
}
const stylesheet = this._languageService.parseStylesheet(document);
const references = this._languageService.findReferences(document, position, stylesheet);
return Promise.resolve(references);
}
async findDocumentHighlights(uri, position) {
const document = this._getTextDocument(uri);
if (!document) {
return [];
}
const stylesheet = this._languageService.parseStylesheet(document);
const highlights = this._languageService.findDocumentHighlights(document, position, stylesheet);
return Promise.resolve(highlights);
}
async findDocumentSymbols(uri) {
const document = this._getTextDocument(uri);
if (!document) {
return [];
}
const stylesheet = this._languageService.parseStylesheet(document);
const symbols = this._languageService.findDocumentSymbols(document, stylesheet);
return Promise.resolve(symbols);
}
async doCodeActions(uri, range, context) {
const document = this._getTextDocument(uri);
if (!document) {
return [];
}
const stylesheet = this._languageService.parseStylesheet(document);
const actions = this._languageService.doCodeActions(document, range, context, stylesheet);
return Promise.resolve(actions);
}
async findDocumentColors(uri) {
const document = this._getTextDocument(uri);
if (!document) {
return [];
}
const stylesheet = this._languageService.parseStylesheet(document);
const colorSymbols = this._languageService.findDocumentColors(document, stylesheet);
return Promise.resolve(colorSymbols);
}
async getColorPresentations(uri, color, range) {
const document = this._getTextDocument(uri);
if (!document) {
return [];
}
const stylesheet = this._languageService.parseStylesheet(document);
const colorPresentations = this._languageService.getColorPresentations(
document,
stylesheet,
color,
range
);
return Promise.resolve(colorPresentations);
}
async getFoldingRanges(uri, context) {
const document = this._getTextDocument(uri);
if (!document) {
return [];
}
const ranges = this._languageService.getFoldingRanges(document, context);
return Promise.resolve(ranges);
}
async getSelectionRanges(uri, positions) {
const document = this._getTextDocument(uri);
if (!document) {
return [];
}
const stylesheet = this._languageService.parseStylesheet(document);
const ranges = this._languageService.getSelectionRanges(document, positions, stylesheet);
return Promise.resolve(ranges);
}
async doRename(uri, position, newName) {
const document = this._getTextDocument(uri);
if (!document) {
return null;
}
const stylesheet = this._languageService.parseStylesheet(document);
const renames = this._languageService.doRename(document, position, newName, stylesheet);
return Promise.resolve(renames);
}
async format(uri, range, options) {
const document = this._getTextDocument(uri);
if (!document) {
return [];
}
const settings = { ...this._languageSettings.format, ...options };
const textEdits = this._languageService.format(document, range, settings);
return Promise.resolve(textEdits);
}
_getTextDocument(uri) {
const models = this._ctx.getMirrorModels();
for (const model of models) {
if (model.uri.toString() === uri) {
return TextDocument.create(
uri,
this._languageId,
model.version,
model.getValue()
);
}
}
return null;
}
}
export { CSSWorker };
@@ -0,0 +1 @@
export {}
@@ -0,0 +1,184 @@
import '../../editor/browser/coreCommands.js';
import '../../editor/browser/widget/codeEditor/codeEditorWidget.js';
import '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';
import '../../editor/contrib/anchorSelect/browser/anchorSelect.js';
import '../../editor/contrib/bracketMatching/browser/bracketMatching.js';
import '../../editor/contrib/caretOperations/browser/caretOperations.js';
import '../../editor/contrib/caretOperations/browser/transpose.js';
import '../../editor/contrib/clipboard/browser/clipboard.js';
import '../../editor/contrib/codeAction/browser/codeActionContributions.js';
import '../../editor/contrib/codelens/browser/codelensController.js';
import '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';
import '../../editor/contrib/comment/browser/comment.js';
import '../../editor/contrib/contextmenu/browser/contextmenu.js';
import '../../editor/contrib/cursorUndo/browser/cursorUndo.js';
import '../../editor/contrib/dnd/browser/dnd.js';
import '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';
import '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';
import '../../editor/contrib/find/browser/findController.js';
import '../../editor/contrib/folding/browser/folding.js';
import '../../editor/contrib/fontZoom/browser/fontZoom.js';
import '../../editor/contrib/format/browser/formatActions.js';
import '../../editor/contrib/documentSymbols/browser/documentSymbols.js';
import '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';
import '../../editor/contrib/inlineProgress/browser/inlineProgress.js';
import '../../editor/contrib/gotoSymbol/browser/goToCommands.js';
import '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';
import '../../editor/contrib/gotoError/browser/gotoError.js';
import '../../editor/contrib/gpu/browser/gpuActions.js';
import '../../editor/contrib/hover/browser/hoverContribution.js';
import '../../editor/contrib/indentation/browser/indentation.js';
import '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';
import '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';
import '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';
import '../../editor/contrib/lineSelection/browser/lineSelection.js';
import '../../editor/contrib/linesOperations/browser/linesOperations.js';
import '../../editor/contrib/linkedEditing/browser/linkedEditing.js';
import '../../editor/contrib/links/browser/links.js';
import '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';
import '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';
import '../../editor/contrib/multicursor/browser/multicursor.js';
import '../../editor/contrib/parameterHints/browser/parameterHints.js';
import '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';
import '../../editor/contrib/rename/browser/rename.js';
import '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';
import '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';
import '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';
import '../../editor/contrib/smartSelect/browser/smartSelect.js';
import '../../editor/contrib/snippet/browser/snippetController2.js';
import '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';
import '../../editor/contrib/suggest/browser/suggestController.js';
import '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';
import '../../editor/contrib/tokenization/browser/tokenization.js';
import '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';
import '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';
import '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';
import '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';
import '../../editor/contrib/wordOperations/browser/wordOperations.js';
import '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';
import '../../editor/contrib/readOnlyMessage/browser/contribution.js';
import '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';
import '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';
import '../../editor/common/standaloneStrings.js';
import '../../base/browser/ui/codicons/codicon/codicon.css';
import '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';
import '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';
import '../../editor/standalone/browser/inspectTokens/inspectTokens.js';
import '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';
import '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';
import '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';
import { languages, Emitter } from '../../editor/editor.api2.js';
class LanguageServiceDefaultsImpl {
constructor(languageId, options, modeConfiguration) {
this._onDidChange = new Emitter();
this._languageId = languageId;
this.setOptions(options);
this.setModeConfiguration(modeConfiguration);
}
get onDidChange() {
return this._onDidChange.event;
}
get languageId() {
return this._languageId;
}
get modeConfiguration() {
return this._modeConfiguration;
}
get diagnosticsOptions() {
return this.options;
}
get options() {
return this._options;
}
setOptions(options) {
this._options = options || /* @__PURE__ */ Object.create(null);
this._onDidChange.fire(this);
}
setDiagnosticsOptions(options) {
this.setOptions(options);
}
setModeConfiguration(modeConfiguration) {
this._modeConfiguration = modeConfiguration || /* @__PURE__ */ Object.create(null);
this._onDidChange.fire(this);
}
}
const optionsDefault = {
validate: true,
lint: {
compatibleVendorPrefixes: "ignore",
vendorPrefix: "warning",
duplicateProperties: "warning",
emptyRules: "warning",
importStatement: "ignore",
boxModel: "ignore",
universalSelector: "ignore",
zeroUnits: "ignore",
fontFaceProperties: "warning",
hexColorLength: "error",
argumentsInColorFunction: "error",
unknownProperties: "warning",
ieHack: "ignore",
unknownVendorSpecificProperties: "ignore",
propertyIgnoredDueToDisplay: "warning",
important: "ignore",
float: "ignore",
idSelector: "ignore"
},
data: { useDefaultDataProvider: true },
format: {
newlineBetweenSelectors: true,
newlineBetweenRules: true,
spaceAroundSelectorSeparator: false,
braceStyle: "collapse",
maxPreserveNewLines: void 0,
preserveNewLines: true
}
};
const modeConfigurationDefault = {
completionItems: true,
hovers: true,
documentSymbols: true,
definitions: true,
references: true,
documentHighlights: true,
rename: true,
colors: true,
foldingRanges: true,
diagnostics: true,
selectionRanges: true,
documentFormattingEdits: true,
documentRangeFormattingEdits: true
};
const cssDefaults = new LanguageServiceDefaultsImpl(
"css",
optionsDefault,
modeConfigurationDefault
);
const scssDefaults = new LanguageServiceDefaultsImpl(
"scss",
optionsDefault,
modeConfigurationDefault
);
const lessDefaults = new LanguageServiceDefaultsImpl(
"less",
optionsDefault,
modeConfigurationDefault
);
function getMode() {
return import('./cssMode.js');
}
languages.onLanguage("less", () => {
getMode().then((mode2) => mode2.setupMode(lessDefaults));
});
languages.onLanguage("scss", () => {
getMode().then((mode2) => mode2.setupMode(scssDefaults));
});
languages.onLanguage("css", () => {
getMode().then((mode2) => mode2.setupMode(cssDefaults));
});
export { cssDefaults, lessDefaults, scssDefaults };
@@ -0,0 +1,64 @@
import { createWebWorker } from '../../common/workers.js';
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
class WorkerManager {
constructor(defaults) {
this._defaults = defaults;
this._worker = null;
this._client = null;
this._idleCheckInterval = window.setInterval(() => this._checkIfIdle(), 30 * 1e3);
this._lastUsedTime = 0;
this._configChangeListener = this._defaults.onDidChange(() => this._stopWorker());
}
_stopWorker() {
if (this._worker) {
this._worker.dispose();
this._worker = null;
}
this._client = null;
}
dispose() {
clearInterval(this._idleCheckInterval);
this._configChangeListener.dispose();
this._stopWorker();
}
_checkIfIdle() {
if (!this._worker) {
return;
}
let timePassedSinceLastUsed = Date.now() - this._lastUsedTime;
if (timePassedSinceLastUsed > STOP_WHEN_IDLE_FOR) {
this._stopWorker();
}
}
_getClient() {
this._lastUsedTime = Date.now();
if (!this._client) {
this._worker = createWebWorker({
// module that exports the create() method and returns a `CSSWorker` instance
moduleId: "vs/language/css/cssWorker",
createWorker: () => new Worker(new URL('css.worker.js', import.meta.url), { type: "module" }),
label: this._defaults.languageId,
// passed in to the create() method
createData: {
options: this._defaults.options,
languageId: this._defaults.languageId
}
});
this._client = this._worker.getProxy();
}
return this._client;
}
getLanguageServiceWorker(...resources) {
let _client;
return this._getClient().then((client) => {
_client = client;
}).then((_) => {
if (this._worker) {
return this._worker.withSyncedResources(resources);
}
}).then((_) => _client);
}
}
export { WorkerManager };
@@ -0,0 +1,8 @@
import { initialize } from '../../common/initialize.js';
import { HTMLWorker } from './htmlWorker.js';
self.onmessage = () => {
initialize((ctx, createData) => {
return new HTMLWorker(ctx, createData);
});
};
+213
View File
@@ -0,0 +1,213 @@
import { WorkerManager } from './workerManager.js';
import { HoverAdapter, DocumentHighlightAdapter, DocumentLinkAdapter, FoldingRangeAdapter, DocumentSymbolAdapter, SelectionRangeAdapter, RenameAdapter, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, CompletionAdapter } from '../common/lspLanguageFeatures.js';
export { DefinitionAdapter, DiagnosticsAdapter, DocumentColorAdapter, ReferenceAdapter, fromPosition, fromRange, toRange, toTextEdit } from '../common/lspLanguageFeatures.js';
import '../../editor/browser/coreCommands.js';
import '../../editor/browser/widget/codeEditor/codeEditorWidget.js';
import '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';
import '../../editor/contrib/anchorSelect/browser/anchorSelect.js';
import '../../editor/contrib/bracketMatching/browser/bracketMatching.js';
import '../../editor/contrib/caretOperations/browser/caretOperations.js';
import '../../editor/contrib/caretOperations/browser/transpose.js';
import '../../editor/contrib/clipboard/browser/clipboard.js';
import '../../editor/contrib/codeAction/browser/codeActionContributions.js';
import '../../editor/contrib/codelens/browser/codelensController.js';
import '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';
import '../../editor/contrib/comment/browser/comment.js';
import '../../editor/contrib/contextmenu/browser/contextmenu.js';
import '../../editor/contrib/cursorUndo/browser/cursorUndo.js';
import '../../editor/contrib/dnd/browser/dnd.js';
import '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';
import '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';
import '../../editor/contrib/find/browser/findController.js';
import '../../editor/contrib/folding/browser/folding.js';
import '../../editor/contrib/fontZoom/browser/fontZoom.js';
import '../../editor/contrib/format/browser/formatActions.js';
import '../../editor/contrib/documentSymbols/browser/documentSymbols.js';
import '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';
import '../../editor/contrib/inlineProgress/browser/inlineProgress.js';
import '../../editor/contrib/gotoSymbol/browser/goToCommands.js';
import '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';
import '../../editor/contrib/gotoError/browser/gotoError.js';
import '../../editor/contrib/gpu/browser/gpuActions.js';
import '../../editor/contrib/hover/browser/hoverContribution.js';
import '../../editor/contrib/indentation/browser/indentation.js';
import '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';
import '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';
import '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';
import '../../editor/contrib/lineSelection/browser/lineSelection.js';
import '../../editor/contrib/linesOperations/browser/linesOperations.js';
import '../../editor/contrib/linkedEditing/browser/linkedEditing.js';
import '../../editor/contrib/links/browser/links.js';
import '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';
import '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';
import '../../editor/contrib/multicursor/browser/multicursor.js';
import '../../editor/contrib/parameterHints/browser/parameterHints.js';
import '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';
import '../../editor/contrib/rename/browser/rename.js';
import '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';
import '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';
import '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';
import '../../editor/contrib/smartSelect/browser/smartSelect.js';
import '../../editor/contrib/snippet/browser/snippetController2.js';
import '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';
import '../../editor/contrib/suggest/browser/suggestController.js';
import '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';
import '../../editor/contrib/tokenization/browser/tokenization.js';
import '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';
import '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';
import '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';
import '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';
import '../../editor/contrib/wordOperations/browser/wordOperations.js';
import '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';
import '../../editor/contrib/readOnlyMessage/browser/contribution.js';
import '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';
import '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';
import '../../editor/common/standaloneStrings.js';
import '../../base/browser/ui/codicons/codicon/codicon.css';
import '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';
import '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';
import '../../editor/standalone/browser/inspectTokens/inspectTokens.js';
import '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';
import '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';
import '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';
import { languages } from '../../editor/editor.api2.js';
class HTMLCompletionAdapter extends CompletionAdapter {
constructor(worker) {
super(worker, [".", ":", "<", '"', "=", "/"]);
}
}
function setupMode1(defaults) {
const client = new WorkerManager(defaults);
const worker = (...uris) => {
return client.getLanguageServiceWorker(...uris);
};
let languageId = defaults.languageId;
languages.registerCompletionItemProvider(languageId, new HTMLCompletionAdapter(worker));
languages.registerHoverProvider(languageId, new HoverAdapter(worker));
languages.registerDocumentHighlightProvider(
languageId,
new DocumentHighlightAdapter(worker)
);
languages.registerLinkProvider(languageId, new DocumentLinkAdapter(worker));
languages.registerFoldingRangeProvider(
languageId,
new FoldingRangeAdapter(worker)
);
languages.registerDocumentSymbolProvider(
languageId,
new DocumentSymbolAdapter(worker)
);
languages.registerSelectionRangeProvider(
languageId,
new SelectionRangeAdapter(worker)
);
languages.registerRenameProvider(languageId, new RenameAdapter(worker));
if (languageId === "html") {
languages.registerDocumentFormattingEditProvider(
languageId,
new DocumentFormattingEditProvider(worker)
);
languages.registerDocumentRangeFormattingEditProvider(
languageId,
new DocumentRangeFormattingEditProvider(worker)
);
}
}
function setupMode(defaults) {
const disposables = [];
const providers = [];
const client = new WorkerManager(defaults);
disposables.push(client);
const worker = (...uris) => {
return client.getLanguageServiceWorker(...uris);
};
function registerProviders() {
const { languageId, modeConfiguration } = defaults;
disposeAll(providers);
if (modeConfiguration.completionItems) {
providers.push(
languages.registerCompletionItemProvider(languageId, new HTMLCompletionAdapter(worker))
);
}
if (modeConfiguration.hovers) {
providers.push(
languages.registerHoverProvider(languageId, new HoverAdapter(worker))
);
}
if (modeConfiguration.documentHighlights) {
providers.push(
languages.registerDocumentHighlightProvider(
languageId,
new DocumentHighlightAdapter(worker)
)
);
}
if (modeConfiguration.links) {
providers.push(
languages.registerLinkProvider(languageId, new DocumentLinkAdapter(worker))
);
}
if (modeConfiguration.documentSymbols) {
providers.push(
languages.registerDocumentSymbolProvider(
languageId,
new DocumentSymbolAdapter(worker)
)
);
}
if (modeConfiguration.rename) {
providers.push(
languages.registerRenameProvider(languageId, new RenameAdapter(worker))
);
}
if (modeConfiguration.foldingRanges) {
providers.push(
languages.registerFoldingRangeProvider(
languageId,
new FoldingRangeAdapter(worker)
)
);
}
if (modeConfiguration.selectionRanges) {
providers.push(
languages.registerSelectionRangeProvider(
languageId,
new SelectionRangeAdapter(worker)
)
);
}
if (modeConfiguration.documentFormattingEdits) {
providers.push(
languages.registerDocumentFormattingEditProvider(
languageId,
new DocumentFormattingEditProvider(worker)
)
);
}
if (modeConfiguration.documentRangeFormattingEdits) {
providers.push(
languages.registerDocumentRangeFormattingEditProvider(
languageId,
new DocumentRangeFormattingEditProvider(worker)
)
);
}
}
registerProviders();
disposables.push(asDisposable(providers));
return asDisposable(disposables);
}
function asDisposable(disposables) {
return { dispose: () => disposeAll(disposables) };
}
function disposeAll(disposables) {
while (disposables.length) {
disposables.pop().dispose();
}
}
export { CompletionAdapter, DocumentFormattingEditProvider, DocumentHighlightAdapter, DocumentLinkAdapter, DocumentRangeFormattingEditProvider, DocumentSymbolAdapter, FoldingRangeAdapter, HoverAdapter, RenameAdapter, SelectionRangeAdapter, WorkerManager, setupMode, setupMode1 };
+126
View File
@@ -0,0 +1,126 @@
import { newHTMLDataProvider, getLanguageService } from '../../../external/vscode-html-languageservice/lib/esm/htmlLanguageService.js';
import { TextDocument } from '../../../external/vscode-languageserver-textdocument/lib/esm/main.js';
class HTMLWorker {
constructor(ctx, createData) {
this._ctx = ctx;
this._languageSettings = createData.languageSettings;
this._languageId = createData.languageId;
const data = this._languageSettings.data;
const useDefaultDataProvider = data?.useDefaultDataProvider;
const customDataProviders = [];
if (data?.dataProviders) {
for (const id in data.dataProviders) {
customDataProviders.push(newHTMLDataProvider(id, data.dataProviders[id]));
}
}
this._languageService = getLanguageService({
useDefaultDataProvider,
customDataProviders
});
}
async doComplete(uri, position) {
let document = this._getTextDocument(uri);
if (!document) {
return null;
}
let htmlDocument = this._languageService.parseHTMLDocument(document);
return Promise.resolve(
this._languageService.doComplete(
document,
position,
htmlDocument,
this._languageSettings && this._languageSettings.suggest
)
);
}
async format(uri, range, options) {
let document = this._getTextDocument(uri);
if (!document) {
return [];
}
let formattingOptions = { ...this._languageSettings.format, ...options };
let textEdits = this._languageService.format(document, range, formattingOptions);
return Promise.resolve(textEdits);
}
async doHover(uri, position) {
let document = this._getTextDocument(uri);
if (!document) {
return null;
}
let htmlDocument = this._languageService.parseHTMLDocument(document);
let hover = this._languageService.doHover(document, position, htmlDocument);
return Promise.resolve(hover);
}
async findDocumentHighlights(uri, position) {
let document = this._getTextDocument(uri);
if (!document) {
return [];
}
let htmlDocument = this._languageService.parseHTMLDocument(document);
let highlights = this._languageService.findDocumentHighlights(document, position, htmlDocument);
return Promise.resolve(highlights);
}
async findDocumentLinks(uri) {
let document = this._getTextDocument(uri);
if (!document) {
return [];
}
let links = this._languageService.findDocumentLinks(
document,
null
/*TODO@aeschli*/
);
return Promise.resolve(links);
}
async findDocumentSymbols(uri) {
let document = this._getTextDocument(uri);
if (!document) {
return [];
}
let htmlDocument = this._languageService.parseHTMLDocument(document);
let symbols = this._languageService.findDocumentSymbols(document, htmlDocument);
return Promise.resolve(symbols);
}
async getFoldingRanges(uri, context) {
let document = this._getTextDocument(uri);
if (!document) {
return [];
}
let ranges = this._languageService.getFoldingRanges(document, context);
return Promise.resolve(ranges);
}
async getSelectionRanges(uri, positions) {
let document = this._getTextDocument(uri);
if (!document) {
return [];
}
let ranges = this._languageService.getSelectionRanges(document, positions);
return Promise.resolve(ranges);
}
async doRename(uri, position, newName) {
let document = this._getTextDocument(uri);
if (!document) {
return null;
}
let htmlDocument = this._languageService.parseHTMLDocument(document);
let renames = this._languageService.doRename(document, position, newName, htmlDocument);
return Promise.resolve(renames);
}
_getTextDocument(uri) {
let models = this._ctx.getMirrorModels();
for (let model of models) {
if (model.uri.toString() === uri) {
return TextDocument.create(
uri,
this._languageId,
model.version,
model.getValue()
);
}
}
return null;
}
}
export { HTMLWorker };
@@ -0,0 +1 @@
export {}
@@ -0,0 +1,181 @@
import '../../editor/browser/coreCommands.js';
import '../../editor/browser/widget/codeEditor/codeEditorWidget.js';
import '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';
import '../../editor/contrib/anchorSelect/browser/anchorSelect.js';
import '../../editor/contrib/bracketMatching/browser/bracketMatching.js';
import '../../editor/contrib/caretOperations/browser/caretOperations.js';
import '../../editor/contrib/caretOperations/browser/transpose.js';
import '../../editor/contrib/clipboard/browser/clipboard.js';
import '../../editor/contrib/codeAction/browser/codeActionContributions.js';
import '../../editor/contrib/codelens/browser/codelensController.js';
import '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';
import '../../editor/contrib/comment/browser/comment.js';
import '../../editor/contrib/contextmenu/browser/contextmenu.js';
import '../../editor/contrib/cursorUndo/browser/cursorUndo.js';
import '../../editor/contrib/dnd/browser/dnd.js';
import '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';
import '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';
import '../../editor/contrib/find/browser/findController.js';
import '../../editor/contrib/folding/browser/folding.js';
import '../../editor/contrib/fontZoom/browser/fontZoom.js';
import '../../editor/contrib/format/browser/formatActions.js';
import '../../editor/contrib/documentSymbols/browser/documentSymbols.js';
import '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';
import '../../editor/contrib/inlineProgress/browser/inlineProgress.js';
import '../../editor/contrib/gotoSymbol/browser/goToCommands.js';
import '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';
import '../../editor/contrib/gotoError/browser/gotoError.js';
import '../../editor/contrib/gpu/browser/gpuActions.js';
import '../../editor/contrib/hover/browser/hoverContribution.js';
import '../../editor/contrib/indentation/browser/indentation.js';
import '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';
import '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';
import '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';
import '../../editor/contrib/lineSelection/browser/lineSelection.js';
import '../../editor/contrib/linesOperations/browser/linesOperations.js';
import '../../editor/contrib/linkedEditing/browser/linkedEditing.js';
import '../../editor/contrib/links/browser/links.js';
import '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';
import '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';
import '../../editor/contrib/multicursor/browser/multicursor.js';
import '../../editor/contrib/parameterHints/browser/parameterHints.js';
import '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';
import '../../editor/contrib/rename/browser/rename.js';
import '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';
import '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';
import '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';
import '../../editor/contrib/smartSelect/browser/smartSelect.js';
import '../../editor/contrib/snippet/browser/snippetController2.js';
import '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';
import '../../editor/contrib/suggest/browser/suggestController.js';
import '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';
import '../../editor/contrib/tokenization/browser/tokenization.js';
import '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';
import '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';
import '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';
import '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';
import '../../editor/contrib/wordOperations/browser/wordOperations.js';
import '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';
import '../../editor/contrib/readOnlyMessage/browser/contribution.js';
import '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';
import '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';
import '../../editor/common/standaloneStrings.js';
import '../../base/browser/ui/codicons/codicon/codicon.css';
import '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';
import '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';
import '../../editor/standalone/browser/inspectTokens/inspectTokens.js';
import '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';
import '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';
import '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';
import { languages, Emitter } from '../../editor/editor.api2.js';
class LanguageServiceDefaultsImpl {
constructor(languageId, options, modeConfiguration) {
this._onDidChange = new Emitter();
this._languageId = languageId;
this.setOptions(options);
this.setModeConfiguration(modeConfiguration);
}
get onDidChange() {
return this._onDidChange.event;
}
get languageId() {
return this._languageId;
}
get options() {
return this._options;
}
get modeConfiguration() {
return this._modeConfiguration;
}
setOptions(options) {
this._options = options || /* @__PURE__ */ Object.create(null);
this._onDidChange.fire(this);
}
setModeConfiguration(modeConfiguration) {
this._modeConfiguration = modeConfiguration || /* @__PURE__ */ Object.create(null);
this._onDidChange.fire(this);
}
}
const formatDefaults = {
tabSize: 4,
insertSpaces: false,
wrapLineLength: 120,
unformatted: 'default": "a, abbr, acronym, b, bdo, big, br, button, cite, code, dfn, em, i, img, input, kbd, label, map, object, q, samp, select, small, span, strong, sub, sup, textarea, tt, var',
contentUnformatted: "pre",
indentInnerHtml: false,
preserveNewLines: true,
maxPreserveNewLines: void 0,
indentHandlebars: false,
endWithNewline: false,
extraLiners: "head, body, /html",
wrapAttributes: "auto"
};
const optionsDefault = {
format: formatDefaults,
suggest: {},
data: { useDefaultDataProvider: true }
};
function getConfigurationDefault(languageId) {
return {
completionItems: true,
hovers: true,
documentSymbols: true,
links: true,
documentHighlights: true,
rename: true,
colors: true,
foldingRanges: true,
selectionRanges: true,
diagnostics: languageId === htmlLanguageId,
// turned off for Razor and Handlebar
documentFormattingEdits: languageId === htmlLanguageId,
// turned off for Razor and Handlebar
documentRangeFormattingEdits: languageId === htmlLanguageId
// turned off for Razor and Handlebar
};
}
const htmlLanguageId = "html";
const handlebarsLanguageId = "handlebars";
const razorLanguageId = "razor";
const htmlLanguageService = registerHTMLLanguageService(
htmlLanguageId,
optionsDefault,
getConfigurationDefault(htmlLanguageId)
);
const htmlDefaults = htmlLanguageService.defaults;
const handlebarLanguageService = registerHTMLLanguageService(
handlebarsLanguageId,
optionsDefault,
getConfigurationDefault(handlebarsLanguageId)
);
const handlebarDefaults = handlebarLanguageService.defaults;
const razorLanguageService = registerHTMLLanguageService(
razorLanguageId,
optionsDefault,
getConfigurationDefault(razorLanguageId)
);
const razorDefaults = razorLanguageService.defaults;
function getMode() {
return import('./htmlMode.js');
}
function registerHTMLLanguageService(languageId, options = optionsDefault, modeConfiguration = getConfigurationDefault(languageId)) {
const defaults = new LanguageServiceDefaultsImpl(languageId, options, modeConfiguration);
let mode2;
const onLanguageListener = languages.onLanguage(languageId, async () => {
mode2 = (await getMode()).setupMode(defaults);
});
return {
defaults,
dispose() {
onLanguageListener.dispose();
mode2?.dispose();
mode2 = void 0;
}
};
}
export { handlebarDefaults, handlebarLanguageService, htmlDefaults, htmlLanguageService, razorDefaults, razorLanguageService, registerHTMLLanguageService };
@@ -0,0 +1,64 @@
import { createWebWorker } from '../../common/workers.js';
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
class WorkerManager {
constructor(defaults) {
this._defaults = defaults;
this._worker = null;
this._client = null;
this._idleCheckInterval = window.setInterval(() => this._checkIfIdle(), 30 * 1e3);
this._lastUsedTime = 0;
this._configChangeListener = this._defaults.onDidChange(() => this._stopWorker());
}
_stopWorker() {
if (this._worker) {
this._worker.dispose();
this._worker = null;
}
this._client = null;
}
dispose() {
clearInterval(this._idleCheckInterval);
this._configChangeListener.dispose();
this._stopWorker();
}
_checkIfIdle() {
if (!this._worker) {
return;
}
let timePassedSinceLastUsed = Date.now() - this._lastUsedTime;
if (timePassedSinceLastUsed > STOP_WHEN_IDLE_FOR) {
this._stopWorker();
}
}
_getClient() {
this._lastUsedTime = Date.now();
if (!this._client) {
this._worker = createWebWorker({
// module that exports the create() method and returns a `HTMLWorker` instance
moduleId: "vs/language/html/htmlWorker",
createWorker: () => new Worker(new URL('html.worker.js', import.meta.url), { type: "module" }),
// passed in to the create() method
createData: {
languageSettings: this._defaults.options,
languageId: this._defaults.languageId
},
label: this._defaults.languageId
});
this._client = this._worker.getProxy();
}
return this._client;
}
getLanguageServiceWorker(...resources) {
let _client;
return this._getClient().then((client) => {
_client = client;
}).then((_) => {
if (this._worker) {
return this._worker.withSyncedResources(resources);
}
}).then((_) => _client);
}
}
export { WorkerManager };
@@ -0,0 +1,8 @@
import { initialize } from '../../common/initialize.js';
import { JSONWorker } from './jsonWorker.js';
self.onmessage = () => {
initialize((ctx, createData) => {
return new JSONWorker(ctx, createData);
});
};
+224
View File
@@ -0,0 +1,224 @@
import { WorkerManager } from './workerManager.js';
import { DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, CompletionAdapter, HoverAdapter, DocumentSymbolAdapter, DocumentColorAdapter, FoldingRangeAdapter, SelectionRangeAdapter, DiagnosticsAdapter } from '../common/lspLanguageFeatures.js';
export { DefinitionAdapter, DocumentHighlightAdapter, DocumentLinkAdapter, ReferenceAdapter, RenameAdapter, fromPosition, fromRange, toRange, toTextEdit } from '../common/lspLanguageFeatures.js';
import { createTokenizationSupport } from './tokenization.js';
import '../../editor/browser/coreCommands.js';
import '../../editor/browser/widget/codeEditor/codeEditorWidget.js';
import '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';
import '../../editor/contrib/anchorSelect/browser/anchorSelect.js';
import '../../editor/contrib/bracketMatching/browser/bracketMatching.js';
import '../../editor/contrib/caretOperations/browser/caretOperations.js';
import '../../editor/contrib/caretOperations/browser/transpose.js';
import '../../editor/contrib/clipboard/browser/clipboard.js';
import '../../editor/contrib/codeAction/browser/codeActionContributions.js';
import '../../editor/contrib/codelens/browser/codelensController.js';
import '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';
import '../../editor/contrib/comment/browser/comment.js';
import '../../editor/contrib/contextmenu/browser/contextmenu.js';
import '../../editor/contrib/cursorUndo/browser/cursorUndo.js';
import '../../editor/contrib/dnd/browser/dnd.js';
import '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';
import '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';
import '../../editor/contrib/find/browser/findController.js';
import '../../editor/contrib/folding/browser/folding.js';
import '../../editor/contrib/fontZoom/browser/fontZoom.js';
import '../../editor/contrib/format/browser/formatActions.js';
import '../../editor/contrib/documentSymbols/browser/documentSymbols.js';
import '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';
import '../../editor/contrib/inlineProgress/browser/inlineProgress.js';
import '../../editor/contrib/gotoSymbol/browser/goToCommands.js';
import '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';
import '../../editor/contrib/gotoError/browser/gotoError.js';
import '../../editor/contrib/gpu/browser/gpuActions.js';
import '../../editor/contrib/hover/browser/hoverContribution.js';
import '../../editor/contrib/indentation/browser/indentation.js';
import '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';
import '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';
import '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';
import '../../editor/contrib/lineSelection/browser/lineSelection.js';
import '../../editor/contrib/linesOperations/browser/linesOperations.js';
import '../../editor/contrib/linkedEditing/browser/linkedEditing.js';
import '../../editor/contrib/links/browser/links.js';
import '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';
import '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';
import '../../editor/contrib/multicursor/browser/multicursor.js';
import '../../editor/contrib/parameterHints/browser/parameterHints.js';
import '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';
import '../../editor/contrib/rename/browser/rename.js';
import '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';
import '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';
import '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';
import '../../editor/contrib/smartSelect/browser/smartSelect.js';
import '../../editor/contrib/snippet/browser/snippetController2.js';
import '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';
import '../../editor/contrib/suggest/browser/suggestController.js';
import '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';
import '../../editor/contrib/tokenization/browser/tokenization.js';
import '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';
import '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';
import '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';
import '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';
import '../../editor/contrib/wordOperations/browser/wordOperations.js';
import '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';
import '../../editor/contrib/readOnlyMessage/browser/contribution.js';
import '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';
import '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';
import '../../editor/common/standaloneStrings.js';
import '../../base/browser/ui/codicons/codicon/codicon.css';
import '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';
import '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';
import '../../editor/standalone/browser/inspectTokens/inspectTokens.js';
import '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';
import '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';
import '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';
import { languages, editor } from '../../editor/editor.api2.js';
let worker;
function getWorker() {
return new Promise((resolve, reject) => {
if (!worker) {
return reject("JSON not registered!");
}
resolve(worker);
});
}
class JSONDiagnosticsAdapter extends DiagnosticsAdapter {
constructor(languageId, worker2, defaults) {
super(languageId, worker2, defaults.onDidChange);
this._disposables.push(
editor.onWillDisposeModel((model) => {
this._resetSchema(model.uri);
})
);
this._disposables.push(
editor.onDidChangeModelLanguage((event) => {
this._resetSchema(event.model.uri);
})
);
}
_resetSchema(resource) {
this._worker().then((worker2) => {
worker2.resetSchema(resource.toString());
});
}
}
function setupMode(defaults) {
const disposables = [];
const providers = [];
const client = new WorkerManager(defaults);
disposables.push(client);
worker = (...uris) => {
return client.getLanguageServiceWorker(...uris);
};
function registerProviders() {
const { languageId, modeConfiguration: modeConfiguration2 } = defaults;
disposeAll(providers);
if (modeConfiguration2.documentFormattingEdits) {
providers.push(
languages.registerDocumentFormattingEditProvider(
languageId,
new DocumentFormattingEditProvider(worker)
)
);
}
if (modeConfiguration2.documentRangeFormattingEdits) {
providers.push(
languages.registerDocumentRangeFormattingEditProvider(
languageId,
new DocumentRangeFormattingEditProvider(worker)
)
);
}
if (modeConfiguration2.completionItems) {
providers.push(
languages.registerCompletionItemProvider(
languageId,
new CompletionAdapter(worker, [" ", ":", '"'])
)
);
}
if (modeConfiguration2.hovers) {
providers.push(
languages.registerHoverProvider(languageId, new HoverAdapter(worker))
);
}
if (modeConfiguration2.documentSymbols) {
providers.push(
languages.registerDocumentSymbolProvider(
languageId,
new DocumentSymbolAdapter(worker)
)
);
}
if (modeConfiguration2.tokens) {
providers.push(languages.setTokensProvider(languageId, createTokenizationSupport(true)));
}
if (modeConfiguration2.colors) {
providers.push(
languages.registerColorProvider(
languageId,
new DocumentColorAdapter(worker)
)
);
}
if (modeConfiguration2.foldingRanges) {
providers.push(
languages.registerFoldingRangeProvider(
languageId,
new FoldingRangeAdapter(worker)
)
);
}
if (modeConfiguration2.diagnostics) {
providers.push(new JSONDiagnosticsAdapter(languageId, worker, defaults));
}
if (modeConfiguration2.selectionRanges) {
providers.push(
languages.registerSelectionRangeProvider(
languageId,
new SelectionRangeAdapter(worker)
)
);
}
}
registerProviders();
disposables.push(languages.setLanguageConfiguration(defaults.languageId, richEditConfiguration));
let modeConfiguration = defaults.modeConfiguration;
defaults.onDidChange((newDefaults) => {
if (newDefaults.modeConfiguration !== modeConfiguration) {
modeConfiguration = newDefaults.modeConfiguration;
registerProviders();
}
});
disposables.push(asDisposable(providers));
return asDisposable(disposables);
}
function asDisposable(disposables) {
return { dispose: () => disposeAll(disposables) };
}
function disposeAll(disposables) {
while (disposables.length) {
disposables.pop().dispose();
}
}
const richEditConfiguration = {
wordPattern: /(-?\d*\.\d\w*)|([^\[\{\]\}\:\"\,\s]+)/g,
comments: {
lineComment: "//",
blockComment: ["/*", "*/"]
},
brackets: [
["{", "}"],
["[", "]"]
],
autoClosingPairs: [
{ open: "{", close: "}", notIn: ["string"] },
{ open: "[", close: "]", notIn: ["string"] },
{ open: '"', close: '"', notIn: ["string"] }
]
};
export { CompletionAdapter, DiagnosticsAdapter, DocumentColorAdapter, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, DocumentSymbolAdapter, FoldingRangeAdapter, HoverAdapter, SelectionRangeAdapter, WorkerManager, getWorker, setupMode };
+187
View File
@@ -0,0 +1,187 @@
import { getLanguageService } from '../../../external/vscode-json-languageservice/lib/esm/jsonLanguageService.js';
import { URI } from '../../../external/vscode-uri/lib/esm/index.js';
import { ClientCapabilities } from '../../../external/vscode-json-languageservice/lib/esm/jsonLanguageTypes.js';
import { TextDocument } from '../../../external/vscode-languageserver-textdocument/lib/esm/main.js';
let defaultSchemaRequestService;
if (typeof fetch !== "undefined") {
defaultSchemaRequestService = function(url) {
return fetch(url).then((response) => response.text());
};
}
class JSONWorker {
constructor(ctx, createData) {
this._ctx = ctx;
this._languageSettings = createData.languageSettings;
this._languageId = createData.languageId;
this._languageService = getLanguageService({
workspaceContext: {
resolveRelativePath: (relativePath, resource) => {
const base = resource.substr(0, resource.lastIndexOf("/") + 1);
return resolvePath(base, relativePath);
}
},
schemaRequestService: createData.enableSchemaRequest ? defaultSchemaRequestService : void 0,
clientCapabilities: ClientCapabilities.LATEST
});
this._languageService.configure(this._languageSettings);
}
async doValidation(uri) {
let document = this._getTextDocument(uri);
if (document) {
let jsonDocument = this._languageService.parseJSONDocument(document);
return this._languageService.doValidation(document, jsonDocument, this._languageSettings);
}
return Promise.resolve([]);
}
async doComplete(uri, position) {
let document = this._getTextDocument(uri);
if (!document) {
return null;
}
let jsonDocument = this._languageService.parseJSONDocument(document);
return this._languageService.doComplete(document, position, jsonDocument);
}
async doResolve(item) {
return this._languageService.doResolve(item);
}
async doHover(uri, position) {
let document = this._getTextDocument(uri);
if (!document) {
return null;
}
let jsonDocument = this._languageService.parseJSONDocument(document);
return this._languageService.doHover(document, position, jsonDocument);
}
async format(uri, range, options) {
let document = this._getTextDocument(uri);
if (!document) {
return [];
}
let textEdits = this._languageService.format(document, range, options);
return Promise.resolve(textEdits);
}
async resetSchema(uri) {
return Promise.resolve(this._languageService.resetSchema(uri));
}
async findDocumentSymbols(uri) {
let document = this._getTextDocument(uri);
if (!document) {
return [];
}
let jsonDocument = this._languageService.parseJSONDocument(document);
let symbols = this._languageService.findDocumentSymbols2(document, jsonDocument);
return Promise.resolve(symbols);
}
async findDocumentColors(uri) {
let document = this._getTextDocument(uri);
if (!document) {
return [];
}
let jsonDocument = this._languageService.parseJSONDocument(document);
let colorSymbols = this._languageService.findDocumentColors(document, jsonDocument);
return Promise.resolve(colorSymbols);
}
async getColorPresentations(uri, color, range) {
let document = this._getTextDocument(uri);
if (!document) {
return [];
}
let jsonDocument = this._languageService.parseJSONDocument(document);
let colorPresentations = this._languageService.getColorPresentations(
document,
jsonDocument,
color,
range
);
return Promise.resolve(colorPresentations);
}
async getFoldingRanges(uri, context) {
let document = this._getTextDocument(uri);
if (!document) {
return [];
}
let ranges = this._languageService.getFoldingRanges(document, context);
return Promise.resolve(ranges);
}
async getSelectionRanges(uri, positions) {
let document = this._getTextDocument(uri);
if (!document) {
return [];
}
let jsonDocument = this._languageService.parseJSONDocument(document);
let ranges = this._languageService.getSelectionRanges(document, positions, jsonDocument);
return Promise.resolve(ranges);
}
async parseJSONDocument(uri) {
let document = this._getTextDocument(uri);
if (!document) {
return null;
}
let jsonDocument = this._languageService.parseJSONDocument(document);
return Promise.resolve(jsonDocument);
}
async getMatchingSchemas(uri) {
let document = this._getTextDocument(uri);
if (!document) {
return [];
}
let jsonDocument = this._languageService.parseJSONDocument(document);
return Promise.resolve(this._languageService.getMatchingSchemas(document, jsonDocument));
}
_getTextDocument(uri) {
let models = this._ctx.getMirrorModels();
for (let model of models) {
if (model.uri.toString() === uri) {
return TextDocument.create(
uri,
this._languageId,
model.version,
model.getValue()
);
}
}
return null;
}
}
const Slash = "/".charCodeAt(0);
const Dot = ".".charCodeAt(0);
function isAbsolutePath(path) {
return path.charCodeAt(0) === Slash;
}
function resolvePath(uriString, path) {
if (isAbsolutePath(path)) {
const uri = URI.parse(uriString);
const parts = path.split("/");
return uri.with({ path: normalizePath(parts) }).toString();
}
return joinPath(uriString, path);
}
function normalizePath(parts) {
const newParts = [];
for (const part of parts) {
if (part.length === 0 || part.length === 1 && part.charCodeAt(0) === Dot) ; else if (part.length === 2 && part.charCodeAt(0) === Dot && part.charCodeAt(1) === Dot) {
newParts.pop();
} else {
newParts.push(part);
}
}
if (parts.length > 1 && parts[parts.length - 1].length === 0) {
newParts.push("");
}
let res = newParts.join("/");
if (parts[0].length === 0) {
res = "/" + res;
}
return res;
}
function joinPath(uriString, ...paths) {
const uri = URI.parse(uriString);
const parts = uri.path.split("/");
for (let path of paths) {
parts.push(...path.split("/"));
}
return uri.with({ path: normalizePath(parts) }).toString();
}
export { JSONWorker };
@@ -0,0 +1 @@
export {}
@@ -0,0 +1,144 @@
import '../../editor/browser/coreCommands.js';
import '../../editor/browser/widget/codeEditor/codeEditorWidget.js';
import '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';
import '../../editor/contrib/anchorSelect/browser/anchorSelect.js';
import '../../editor/contrib/bracketMatching/browser/bracketMatching.js';
import '../../editor/contrib/caretOperations/browser/caretOperations.js';
import '../../editor/contrib/caretOperations/browser/transpose.js';
import '../../editor/contrib/clipboard/browser/clipboard.js';
import '../../editor/contrib/codeAction/browser/codeActionContributions.js';
import '../../editor/contrib/codelens/browser/codelensController.js';
import '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';
import '../../editor/contrib/comment/browser/comment.js';
import '../../editor/contrib/contextmenu/browser/contextmenu.js';
import '../../editor/contrib/cursorUndo/browser/cursorUndo.js';
import '../../editor/contrib/dnd/browser/dnd.js';
import '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';
import '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';
import '../../editor/contrib/find/browser/findController.js';
import '../../editor/contrib/folding/browser/folding.js';
import '../../editor/contrib/fontZoom/browser/fontZoom.js';
import '../../editor/contrib/format/browser/formatActions.js';
import '../../editor/contrib/documentSymbols/browser/documentSymbols.js';
import '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';
import '../../editor/contrib/inlineProgress/browser/inlineProgress.js';
import '../../editor/contrib/gotoSymbol/browser/goToCommands.js';
import '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';
import '../../editor/contrib/gotoError/browser/gotoError.js';
import '../../editor/contrib/gpu/browser/gpuActions.js';
import '../../editor/contrib/hover/browser/hoverContribution.js';
import '../../editor/contrib/indentation/browser/indentation.js';
import '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';
import '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';
import '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';
import '../../editor/contrib/lineSelection/browser/lineSelection.js';
import '../../editor/contrib/linesOperations/browser/linesOperations.js';
import '../../editor/contrib/linkedEditing/browser/linkedEditing.js';
import '../../editor/contrib/links/browser/links.js';
import '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';
import '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';
import '../../editor/contrib/multicursor/browser/multicursor.js';
import '../../editor/contrib/parameterHints/browser/parameterHints.js';
import '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';
import '../../editor/contrib/rename/browser/rename.js';
import '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';
import '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';
import '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';
import '../../editor/contrib/smartSelect/browser/smartSelect.js';
import '../../editor/contrib/snippet/browser/snippetController2.js';
import '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';
import '../../editor/contrib/suggest/browser/suggestController.js';
import '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';
import '../../editor/contrib/tokenization/browser/tokenization.js';
import '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';
import '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';
import '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';
import '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';
import '../../editor/contrib/wordOperations/browser/wordOperations.js';
import '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';
import '../../editor/contrib/readOnlyMessage/browser/contribution.js';
import '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';
import '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';
import '../../editor/common/standaloneStrings.js';
import '../../base/browser/ui/codicons/codicon/codicon.css';
import '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';
import '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';
import '../../editor/standalone/browser/inspectTokens/inspectTokens.js';
import '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';
import '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';
import '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';
import { languages, Emitter } from '../../editor/editor.api2.js';
class LanguageServiceDefaultsImpl {
constructor(languageId, diagnosticsOptions, modeConfiguration) {
this._onDidChange = new Emitter();
this._languageId = languageId;
this.setDiagnosticsOptions(diagnosticsOptions);
this.setModeConfiguration(modeConfiguration);
}
get onDidChange() {
return this._onDidChange.event;
}
get languageId() {
return this._languageId;
}
get modeConfiguration() {
return this._modeConfiguration;
}
get diagnosticsOptions() {
return this._diagnosticsOptions;
}
setDiagnosticsOptions(options) {
this._diagnosticsOptions = options || /* @__PURE__ */ Object.create(null);
this._onDidChange.fire(this);
}
setModeConfiguration(modeConfiguration) {
this._modeConfiguration = modeConfiguration || /* @__PURE__ */ Object.create(null);
this._onDidChange.fire(this);
}
}
const diagnosticDefault = {
validate: true,
allowComments: true,
schemas: [],
enableSchemaRequest: false,
schemaRequest: "warning",
schemaValidation: "warning",
comments: "error",
trailingCommas: "error"
};
const modeConfigurationDefault = {
documentFormattingEdits: true,
documentRangeFormattingEdits: true,
completionItems: true,
hovers: true,
documentSymbols: true,
tokens: true,
colors: true,
foldingRanges: true,
diagnostics: true,
selectionRanges: true
};
const jsonDefaults = new LanguageServiceDefaultsImpl(
"json",
diagnosticDefault,
modeConfigurationDefault
);
const getWorker = () => getMode().then((mode2) => mode2.getWorker());
function getMode() {
return import('./jsonMode.js');
}
languages.register({
id: "json",
extensions: [".json", ".bowerrc", ".jshintrc", ".jscsrc", ".eslintrc", ".babelrc", ".har"],
aliases: ["JSON", "json"],
mimetypes: ["application/json"]
});
languages.onLanguage("json", () => {
getMode().then((mode2) => mode2.setupMode(jsonDefaults));
});
export { getWorker, jsonDefaults };
@@ -0,0 +1,189 @@
import { createScanner } from '../../../external/jsonc-parser/lib/esm/main.js';
function createTokenizationSupport(supportComments) {
return {
getInitialState: () => new JSONState(null, null, false, null),
tokenize: (line, state) => tokenize(supportComments, line, state)
};
}
const TOKEN_DELIM_OBJECT = "delimiter.bracket.json";
const TOKEN_DELIM_ARRAY = "delimiter.array.json";
const TOKEN_DELIM_COLON = "delimiter.colon.json";
const TOKEN_DELIM_COMMA = "delimiter.comma.json";
const TOKEN_VALUE_BOOLEAN = "keyword.json";
const TOKEN_VALUE_NULL = "keyword.json";
const TOKEN_VALUE_STRING = "string.value.json";
const TOKEN_VALUE_NUMBER = "number.json";
const TOKEN_PROPERTY_NAME = "string.key.json";
const TOKEN_COMMENT_BLOCK = "comment.block.json";
const TOKEN_COMMENT_LINE = "comment.line.json";
class ParentsStack {
constructor(parent, type) {
this.parent = parent;
this.type = type;
}
static pop(parents) {
if (parents) {
return parents.parent;
}
return null;
}
static push(parents, type) {
return new ParentsStack(parents, type);
}
static equals(a, b) {
if (!a && !b) {
return true;
}
if (!a || !b) {
return false;
}
while (a && b) {
if (a === b) {
return true;
}
if (a.type !== b.type) {
return false;
}
a = a.parent;
b = b.parent;
}
return true;
}
}
class JSONState {
constructor(state, scanError, lastWasColon, parents) {
this._state = state;
this.scanError = scanError;
this.lastWasColon = lastWasColon;
this.parents = parents;
}
clone() {
return new JSONState(this._state, this.scanError, this.lastWasColon, this.parents);
}
equals(other) {
if (other === this) {
return true;
}
if (!other || !(other instanceof JSONState)) {
return false;
}
return this.scanError === other.scanError && this.lastWasColon === other.lastWasColon && ParentsStack.equals(this.parents, other.parents);
}
getStateData() {
return this._state;
}
setStateData(state) {
this._state = state;
}
}
function tokenize(comments, line, state, offsetDelta = 0) {
let numberOfInsertedCharacters = 0;
let adjustOffset = false;
switch (state.scanError) {
case 2 /* UnexpectedEndOfString */:
line = '"' + line;
numberOfInsertedCharacters = 1;
break;
case 1 /* UnexpectedEndOfComment */:
line = "/*" + line;
numberOfInsertedCharacters = 2;
break;
}
const scanner = createScanner(line);
let lastWasColon = state.lastWasColon;
let parents = state.parents;
const ret = {
tokens: [],
endState: state.clone()
};
while (true) {
let offset = offsetDelta + scanner.getPosition();
let type = "";
const kind = scanner.scan();
if (kind === 17 /* EOF */) {
break;
}
if (offset === offsetDelta + scanner.getPosition()) {
throw new Error(
"Scanner did not advance, next 3 characters are: " + line.substr(scanner.getPosition(), 3)
);
}
if (adjustOffset) {
offset -= numberOfInsertedCharacters;
}
adjustOffset = numberOfInsertedCharacters > 0;
switch (kind) {
case 1 /* OpenBraceToken */:
parents = ParentsStack.push(parents, 0 /* Object */);
type = TOKEN_DELIM_OBJECT;
lastWasColon = false;
break;
case 2 /* CloseBraceToken */:
parents = ParentsStack.pop(parents);
type = TOKEN_DELIM_OBJECT;
lastWasColon = false;
break;
case 3 /* OpenBracketToken */:
parents = ParentsStack.push(parents, 1 /* Array */);
type = TOKEN_DELIM_ARRAY;
lastWasColon = false;
break;
case 4 /* CloseBracketToken */:
parents = ParentsStack.pop(parents);
type = TOKEN_DELIM_ARRAY;
lastWasColon = false;
break;
case 6 /* ColonToken */:
type = TOKEN_DELIM_COLON;
lastWasColon = true;
break;
case 5 /* CommaToken */:
type = TOKEN_DELIM_COMMA;
lastWasColon = false;
break;
case 8 /* TrueKeyword */:
case 9 /* FalseKeyword */:
type = TOKEN_VALUE_BOOLEAN;
lastWasColon = false;
break;
case 7 /* NullKeyword */:
type = TOKEN_VALUE_NULL;
lastWasColon = false;
break;
case 10 /* StringLiteral */:
const currentParent = parents ? parents.type : 0 /* Object */;
const inArray = currentParent === 1 /* Array */;
type = lastWasColon || inArray ? TOKEN_VALUE_STRING : TOKEN_PROPERTY_NAME;
lastWasColon = false;
break;
case 11 /* NumericLiteral */:
type = TOKEN_VALUE_NUMBER;
lastWasColon = false;
break;
}
{
switch (kind) {
case 12 /* LineCommentTrivia */:
type = TOKEN_COMMENT_LINE;
break;
case 13 /* BlockCommentTrivia */:
type = TOKEN_COMMENT_BLOCK;
break;
}
}
ret.endState = new JSONState(
state.getStateData(),
scanner.getTokenError(),
lastWasColon,
parents
);
ret.tokens.push({
startIndex: offset,
scopes: type
});
}
return ret;
}
export { TOKEN_COMMENT_BLOCK, TOKEN_COMMENT_LINE, TOKEN_DELIM_ARRAY, TOKEN_DELIM_COLON, TOKEN_DELIM_COMMA, TOKEN_DELIM_OBJECT, TOKEN_PROPERTY_NAME, TOKEN_VALUE_BOOLEAN, TOKEN_VALUE_NULL, TOKEN_VALUE_NUMBER, TOKEN_VALUE_STRING, createTokenizationSupport };
@@ -0,0 +1,65 @@
import { createWebWorker } from '../../common/workers.js';
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
class WorkerManager {
constructor(defaults) {
this._defaults = defaults;
this._worker = null;
this._client = null;
this._idleCheckInterval = window.setInterval(() => this._checkIfIdle(), 30 * 1e3);
this._lastUsedTime = 0;
this._configChangeListener = this._defaults.onDidChange(() => this._stopWorker());
}
_stopWorker() {
if (this._worker) {
this._worker.dispose();
this._worker = null;
}
this._client = null;
}
dispose() {
clearInterval(this._idleCheckInterval);
this._configChangeListener.dispose();
this._stopWorker();
}
_checkIfIdle() {
if (!this._worker) {
return;
}
let timePassedSinceLastUsed = Date.now() - this._lastUsedTime;
if (timePassedSinceLastUsed > STOP_WHEN_IDLE_FOR) {
this._stopWorker();
}
}
_getClient() {
this._lastUsedTime = Date.now();
if (!this._client) {
this._worker = createWebWorker({
// module that exports the create() method and returns a `JSONWorker` instance
moduleId: "vs/language/json/jsonWorker",
createWorker: () => new Worker(new URL('json.worker.js', import.meta.url), { type: "module" }),
label: this._defaults.languageId,
// passed in to the create() method
createData: {
languageSettings: this._defaults.diagnosticsOptions,
languageId: this._defaults.languageId,
enableSchemaRequest: this._defaults.diagnosticsOptions.enableSchemaRequest
}
});
this._client = this._worker.getProxy();
}
return this._client;
}
getLanguageServiceWorker(...resources) {
let _client;
return this._getClient().then((client) => {
_client = client;
}).then((_) => {
if (this._worker) {
return this._worker.withSyncedResources(resources);
}
}).then((_) => _client);
}
}
export { WorkerManager };
File diff suppressed because it is too large Load Diff
@@ -0,0 +1 @@
export {}
@@ -0,0 +1,302 @@
import { typescriptVersion as typescriptVersion$1 } from './lib/typescriptServicesMetadata.js';
import '../../editor/browser/coreCommands.js';
import '../../editor/browser/widget/codeEditor/codeEditorWidget.js';
import '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';
import '../../editor/contrib/anchorSelect/browser/anchorSelect.js';
import '../../editor/contrib/bracketMatching/browser/bracketMatching.js';
import '../../editor/contrib/caretOperations/browser/caretOperations.js';
import '../../editor/contrib/caretOperations/browser/transpose.js';
import '../../editor/contrib/clipboard/browser/clipboard.js';
import '../../editor/contrib/codeAction/browser/codeActionContributions.js';
import '../../editor/contrib/codelens/browser/codelensController.js';
import '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';
import '../../editor/contrib/comment/browser/comment.js';
import '../../editor/contrib/contextmenu/browser/contextmenu.js';
import '../../editor/contrib/cursorUndo/browser/cursorUndo.js';
import '../../editor/contrib/dnd/browser/dnd.js';
import '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';
import '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';
import '../../editor/contrib/find/browser/findController.js';
import '../../editor/contrib/folding/browser/folding.js';
import '../../editor/contrib/fontZoom/browser/fontZoom.js';
import '../../editor/contrib/format/browser/formatActions.js';
import '../../editor/contrib/documentSymbols/browser/documentSymbols.js';
import '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';
import '../../editor/contrib/inlineProgress/browser/inlineProgress.js';
import '../../editor/contrib/gotoSymbol/browser/goToCommands.js';
import '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';
import '../../editor/contrib/gotoError/browser/gotoError.js';
import '../../editor/contrib/gpu/browser/gpuActions.js';
import '../../editor/contrib/hover/browser/hoverContribution.js';
import '../../editor/contrib/indentation/browser/indentation.js';
import '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';
import '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';
import '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';
import '../../editor/contrib/lineSelection/browser/lineSelection.js';
import '../../editor/contrib/linesOperations/browser/linesOperations.js';
import '../../editor/contrib/linkedEditing/browser/linkedEditing.js';
import '../../editor/contrib/links/browser/links.js';
import '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';
import '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';
import '../../editor/contrib/multicursor/browser/multicursor.js';
import '../../editor/contrib/parameterHints/browser/parameterHints.js';
import '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';
import '../../editor/contrib/rename/browser/rename.js';
import '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';
import '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';
import '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';
import '../../editor/contrib/smartSelect/browser/smartSelect.js';
import '../../editor/contrib/snippet/browser/snippetController2.js';
import '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';
import '../../editor/contrib/suggest/browser/suggestController.js';
import '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';
import '../../editor/contrib/tokenization/browser/tokenization.js';
import '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';
import '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';
import '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';
import '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';
import '../../editor/contrib/wordOperations/browser/wordOperations.js';
import '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';
import '../../editor/contrib/readOnlyMessage/browser/contribution.js';
import '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';
import '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';
import '../../editor/common/standaloneStrings.js';
import '../../base/browser/ui/codicons/codicon/codicon.css';
import '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';
import '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';
import '../../editor/standalone/browser/inspectTokens/inspectTokens.js';
import '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';
import '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';
import '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';
import { languages, Emitter } from '../../editor/editor.api2.js';
var ModuleKind = /* @__PURE__ */ ((ModuleKind2) => {
ModuleKind2[ModuleKind2["None"] = 0] = "None";
ModuleKind2[ModuleKind2["CommonJS"] = 1] = "CommonJS";
ModuleKind2[ModuleKind2["AMD"] = 2] = "AMD";
ModuleKind2[ModuleKind2["UMD"] = 3] = "UMD";
ModuleKind2[ModuleKind2["System"] = 4] = "System";
ModuleKind2[ModuleKind2["ES2015"] = 5] = "ES2015";
ModuleKind2[ModuleKind2["ESNext"] = 99] = "ESNext";
return ModuleKind2;
})(ModuleKind || {});
var JsxEmit = /* @__PURE__ */ ((JsxEmit2) => {
JsxEmit2[JsxEmit2["None"] = 0] = "None";
JsxEmit2[JsxEmit2["Preserve"] = 1] = "Preserve";
JsxEmit2[JsxEmit2["React"] = 2] = "React";
JsxEmit2[JsxEmit2["ReactNative"] = 3] = "ReactNative";
JsxEmit2[JsxEmit2["ReactJSX"] = 4] = "ReactJSX";
JsxEmit2[JsxEmit2["ReactJSXDev"] = 5] = "ReactJSXDev";
return JsxEmit2;
})(JsxEmit || {});
var NewLineKind = /* @__PURE__ */ ((NewLineKind2) => {
NewLineKind2[NewLineKind2["CarriageReturnLineFeed"] = 0] = "CarriageReturnLineFeed";
NewLineKind2[NewLineKind2["LineFeed"] = 1] = "LineFeed";
return NewLineKind2;
})(NewLineKind || {});
var ScriptTarget = /* @__PURE__ */ ((ScriptTarget2) => {
ScriptTarget2[ScriptTarget2["ES3"] = 0] = "ES3";
ScriptTarget2[ScriptTarget2["ES5"] = 1] = "ES5";
ScriptTarget2[ScriptTarget2["ES2015"] = 2] = "ES2015";
ScriptTarget2[ScriptTarget2["ES2016"] = 3] = "ES2016";
ScriptTarget2[ScriptTarget2["ES2017"] = 4] = "ES2017";
ScriptTarget2[ScriptTarget2["ES2018"] = 5] = "ES2018";
ScriptTarget2[ScriptTarget2["ES2019"] = 6] = "ES2019";
ScriptTarget2[ScriptTarget2["ES2020"] = 7] = "ES2020";
ScriptTarget2[ScriptTarget2["ESNext"] = 99] = "ESNext";
ScriptTarget2[ScriptTarget2["JSON"] = 100] = "JSON";
ScriptTarget2[ScriptTarget2["Latest"] = 99 /* ESNext */] = "Latest";
return ScriptTarget2;
})(ScriptTarget || {});
var ModuleResolutionKind = /* @__PURE__ */ ((ModuleResolutionKind2) => {
ModuleResolutionKind2[ModuleResolutionKind2["Classic"] = 1] = "Classic";
ModuleResolutionKind2[ModuleResolutionKind2["NodeJs"] = 2] = "NodeJs";
return ModuleResolutionKind2;
})(ModuleResolutionKind || {});
class LanguageServiceDefaultsImpl {
constructor(compilerOptions, diagnosticsOptions, workerOptions, inlayHintsOptions, modeConfiguration) {
this._onDidChange = new Emitter();
this._onDidExtraLibsChange = new Emitter();
this._extraLibs = /* @__PURE__ */ Object.create(null);
this._removedExtraLibs = /* @__PURE__ */ Object.create(null);
this._eagerModelSync = false;
this.setCompilerOptions(compilerOptions);
this.setDiagnosticsOptions(diagnosticsOptions);
this.setWorkerOptions(workerOptions);
this.setInlayHintsOptions(inlayHintsOptions);
this.setModeConfiguration(modeConfiguration);
this._onDidExtraLibsChangeTimeout = -1;
}
get onDidChange() {
return this._onDidChange.event;
}
get onDidExtraLibsChange() {
return this._onDidExtraLibsChange.event;
}
get modeConfiguration() {
return this._modeConfiguration;
}
get workerOptions() {
return this._workerOptions;
}
get inlayHintsOptions() {
return this._inlayHintsOptions;
}
getExtraLibs() {
return this._extraLibs;
}
addExtraLib(content, _filePath) {
let filePath;
if (typeof _filePath === "undefined") {
filePath = `ts:extralib-${Math.random().toString(36).substring(2, 15)}`;
} else {
filePath = _filePath;
}
if (this._extraLibs[filePath] && this._extraLibs[filePath].content === content) {
return {
dispose: () => {
}
};
}
let myVersion = 1;
if (this._removedExtraLibs[filePath]) {
myVersion = this._removedExtraLibs[filePath] + 1;
}
if (this._extraLibs[filePath]) {
myVersion = this._extraLibs[filePath].version + 1;
}
this._extraLibs[filePath] = {
content,
version: myVersion
};
this._fireOnDidExtraLibsChangeSoon();
return {
dispose: () => {
let extraLib = this._extraLibs[filePath];
if (!extraLib) {
return;
}
if (extraLib.version !== myVersion) {
return;
}
delete this._extraLibs[filePath];
this._removedExtraLibs[filePath] = myVersion;
this._fireOnDidExtraLibsChangeSoon();
}
};
}
setExtraLibs(libs) {
for (const filePath in this._extraLibs) {
this._removedExtraLibs[filePath] = this._extraLibs[filePath].version;
}
this._extraLibs = /* @__PURE__ */ Object.create(null);
if (libs && libs.length > 0) {
for (const lib of libs) {
const filePath = lib.filePath || `ts:extralib-${Math.random().toString(36).substring(2, 15)}`;
const content = lib.content;
let myVersion = 1;
if (this._removedExtraLibs[filePath]) {
myVersion = this._removedExtraLibs[filePath] + 1;
}
this._extraLibs[filePath] = {
content,
version: myVersion
};
}
}
this._fireOnDidExtraLibsChangeSoon();
}
_fireOnDidExtraLibsChangeSoon() {
if (this._onDidExtraLibsChangeTimeout !== -1) {
return;
}
this._onDidExtraLibsChangeTimeout = window.setTimeout(() => {
this._onDidExtraLibsChangeTimeout = -1;
this._onDidExtraLibsChange.fire(void 0);
}, 0);
}
getCompilerOptions() {
return this._compilerOptions;
}
setCompilerOptions(options) {
this._compilerOptions = options || /* @__PURE__ */ Object.create(null);
this._onDidChange.fire(void 0);
}
getDiagnosticsOptions() {
return this._diagnosticsOptions;
}
setDiagnosticsOptions(options) {
this._diagnosticsOptions = options || /* @__PURE__ */ Object.create(null);
this._onDidChange.fire(void 0);
}
setWorkerOptions(options) {
this._workerOptions = options || /* @__PURE__ */ Object.create(null);
this._onDidChange.fire(void 0);
}
setInlayHintsOptions(options) {
this._inlayHintsOptions = options || /* @__PURE__ */ Object.create(null);
this._onDidChange.fire(void 0);
}
setMaximumWorkerIdleTime(value) {
}
setEagerModelSync(value) {
this._eagerModelSync = value;
}
getEagerModelSync() {
return this._eagerModelSync;
}
setModeConfiguration(modeConfiguration) {
this._modeConfiguration = modeConfiguration || /* @__PURE__ */ Object.create(null);
this._onDidChange.fire(void 0);
}
}
const typescriptVersion = typescriptVersion$1;
const modeConfigurationDefault = {
completionItems: true,
hovers: true,
documentSymbols: true,
definitions: true,
references: true,
documentHighlights: true,
rename: true,
diagnostics: true,
documentRangeFormattingEdits: true,
signatureHelp: true,
onTypeFormattingEdits: true,
codeActions: true,
inlayHints: true
};
const typescriptDefaults = new LanguageServiceDefaultsImpl(
{ allowNonTsExtensions: true, target: 99 /* Latest */ },
{ noSemanticValidation: false, noSyntaxValidation: false, onlyVisible: false },
{},
{},
modeConfigurationDefault
);
const javascriptDefaults = new LanguageServiceDefaultsImpl(
{ allowNonTsExtensions: true, allowJs: true, target: 99 /* Latest */ },
{ noSemanticValidation: true, noSyntaxValidation: false, onlyVisible: false },
{},
{},
modeConfigurationDefault
);
const getTypeScriptWorker = () => {
return getMode().then((mode) => mode.getTypeScriptWorker());
};
const getJavaScriptWorker = () => {
return getMode().then((mode) => mode.getJavaScriptWorker());
};
function getMode() {
return import('./tsMode.js');
}
languages.onLanguage("typescript", () => {
return getMode().then((mode) => mode.setupTypeScript(typescriptDefaults));
});
languages.onLanguage("javascript", () => {
return getMode().then((mode) => mode.setupJavaScript(javascriptDefaults));
});
export { JsxEmit, ModuleKind, ModuleResolutionKind, NewLineKind, ScriptTarget, getJavaScriptWorker, getTypeScriptWorker, javascriptDefaults, typescriptDefaults, typescriptVersion };
@@ -0,0 +1,14 @@
import { initialize } from '../../common/initialize.js';
import * as typescriptServices from './lib/typescriptServices.js';
export { typescriptServices as ts };
import { create } from './tsWorker.js';
export { TypeScriptWorker } from './tsWorker.js';
export { libFileMap } from './lib/lib.js';
self.onmessage = () => {
initialize((ctx, createData) => {
return create(ctx, createData);
});
};
export { create, initialize };
@@ -0,0 +1,212 @@
import { WorkerManager } from './workerManager.js';
import { SuggestAdapter, SignatureHelpAdapter, QuickInfoAdapter, DocumentHighlightAdapter, DefinitionAdapter, LibFiles, ReferenceAdapter, OutlineAdapter, RenameAdapter, FormatAdapter, FormatOnTypeAdapter, CodeActionAdaptor, InlayHintsAdapter, DiagnosticsAdapter } from './languageFeatures.js';
export { Adapter, FormatHelper, Kind, flattenDiagnosticMessageText } from './languageFeatures.js';
import '../../editor/browser/coreCommands.js';
import '../../editor/browser/widget/codeEditor/codeEditorWidget.js';
import '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';
import '../../editor/contrib/anchorSelect/browser/anchorSelect.js';
import '../../editor/contrib/bracketMatching/browser/bracketMatching.js';
import '../../editor/contrib/caretOperations/browser/caretOperations.js';
import '../../editor/contrib/caretOperations/browser/transpose.js';
import '../../editor/contrib/clipboard/browser/clipboard.js';
import '../../editor/contrib/codeAction/browser/codeActionContributions.js';
import '../../editor/contrib/codelens/browser/codelensController.js';
import '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';
import '../../editor/contrib/comment/browser/comment.js';
import '../../editor/contrib/contextmenu/browser/contextmenu.js';
import '../../editor/contrib/cursorUndo/browser/cursorUndo.js';
import '../../editor/contrib/dnd/browser/dnd.js';
import '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';
import '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';
import '../../editor/contrib/find/browser/findController.js';
import '../../editor/contrib/folding/browser/folding.js';
import '../../editor/contrib/fontZoom/browser/fontZoom.js';
import '../../editor/contrib/format/browser/formatActions.js';
import '../../editor/contrib/documentSymbols/browser/documentSymbols.js';
import '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';
import '../../editor/contrib/inlineProgress/browser/inlineProgress.js';
import '../../editor/contrib/gotoSymbol/browser/goToCommands.js';
import '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';
import '../../editor/contrib/gotoError/browser/gotoError.js';
import '../../editor/contrib/gpu/browser/gpuActions.js';
import '../../editor/contrib/hover/browser/hoverContribution.js';
import '../../editor/contrib/indentation/browser/indentation.js';
import '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';
import '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';
import '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';
import '../../editor/contrib/lineSelection/browser/lineSelection.js';
import '../../editor/contrib/linesOperations/browser/linesOperations.js';
import '../../editor/contrib/linkedEditing/browser/linkedEditing.js';
import '../../editor/contrib/links/browser/links.js';
import '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';
import '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';
import '../../editor/contrib/multicursor/browser/multicursor.js';
import '../../editor/contrib/parameterHints/browser/parameterHints.js';
import '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';
import '../../editor/contrib/rename/browser/rename.js';
import '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';
import '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';
import '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';
import '../../editor/contrib/smartSelect/browser/smartSelect.js';
import '../../editor/contrib/snippet/browser/snippetController2.js';
import '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';
import '../../editor/contrib/suggest/browser/suggestController.js';
import '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';
import '../../editor/contrib/tokenization/browser/tokenization.js';
import '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';
import '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';
import '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';
import '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';
import '../../editor/contrib/wordOperations/browser/wordOperations.js';
import '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';
import '../../editor/contrib/readOnlyMessage/browser/contribution.js';
import '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';
import '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';
import '../../editor/common/standaloneStrings.js';
import '../../base/browser/ui/codicons/codicon/codicon.css';
import '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';
import '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';
import '../../editor/standalone/browser/inspectTokens/inspectTokens.js';
import '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';
import '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';
import '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';
import { languages } from '../../editor/editor.api2.js';
let javaScriptWorker;
let typeScriptWorker;
function setupTypeScript(defaults) {
typeScriptWorker = setupMode(defaults, "typescript");
}
function setupJavaScript(defaults) {
javaScriptWorker = setupMode(defaults, "javascript");
}
function getJavaScriptWorker() {
return new Promise((resolve, reject) => {
if (!javaScriptWorker) {
return reject("JavaScript not registered!");
}
resolve(javaScriptWorker);
});
}
function getTypeScriptWorker() {
return new Promise((resolve, reject) => {
if (!typeScriptWorker) {
return reject("TypeScript not registered!");
}
resolve(typeScriptWorker);
});
}
function setupMode(defaults, modeId) {
const providers = [];
const client = new WorkerManager(modeId, defaults);
const worker = (...uris) => {
return client.getLanguageServiceWorker(...uris);
};
const libFiles = new LibFiles(worker);
function registerProviders() {
const { modeConfiguration } = defaults;
disposeAll(providers);
if (modeConfiguration.completionItems) {
providers.push(
languages.registerCompletionItemProvider(
modeId,
new SuggestAdapter(worker)
)
);
}
if (modeConfiguration.signatureHelp) {
providers.push(
languages.registerSignatureHelpProvider(
modeId,
new SignatureHelpAdapter(worker)
)
);
}
if (modeConfiguration.hovers) {
providers.push(
languages.registerHoverProvider(modeId, new QuickInfoAdapter(worker))
);
}
if (modeConfiguration.documentHighlights) {
providers.push(
languages.registerDocumentHighlightProvider(
modeId,
new DocumentHighlightAdapter(worker)
)
);
}
if (modeConfiguration.definitions) {
providers.push(
languages.registerDefinitionProvider(
modeId,
new DefinitionAdapter(libFiles, worker)
)
);
}
if (modeConfiguration.references) {
providers.push(
languages.registerReferenceProvider(
modeId,
new ReferenceAdapter(libFiles, worker)
)
);
}
if (modeConfiguration.documentSymbols) {
providers.push(
languages.registerDocumentSymbolProvider(
modeId,
new OutlineAdapter(worker)
)
);
}
if (modeConfiguration.rename) {
providers.push(
languages.registerRenameProvider(
modeId,
new RenameAdapter(libFiles, worker)
)
);
}
if (modeConfiguration.documentRangeFormattingEdits) {
providers.push(
languages.registerDocumentRangeFormattingEditProvider(
modeId,
new FormatAdapter(worker)
)
);
}
if (modeConfiguration.onTypeFormattingEdits) {
providers.push(
languages.registerOnTypeFormattingEditProvider(
modeId,
new FormatOnTypeAdapter(worker)
)
);
}
if (modeConfiguration.codeActions) {
providers.push(
languages.registerCodeActionProvider(modeId, new CodeActionAdaptor(worker))
);
}
if (modeConfiguration.inlayHints) {
providers.push(
languages.registerInlayHintsProvider(modeId, new InlayHintsAdapter(worker))
);
}
if (modeConfiguration.diagnostics) {
providers.push(new DiagnosticsAdapter(libFiles, defaults, modeId, worker));
}
}
registerProviders();
return worker;
}
function disposeAll(disposables) {
while (disposables.length) {
disposables.pop().dispose();
}
}
export { CodeActionAdaptor, DefinitionAdapter, DiagnosticsAdapter, DocumentHighlightAdapter, FormatAdapter, FormatOnTypeAdapter, InlayHintsAdapter, LibFiles, OutlineAdapter, QuickInfoAdapter, ReferenceAdapter, RenameAdapter, SignatureHelpAdapter, SuggestAdapter, WorkerManager, getJavaScriptWorker, getTypeScriptWorker, setupJavaScript, setupTypeScript };
@@ -0,0 +1,352 @@
import * as typescriptServices from './lib/typescriptServices.js';
import { typescript, createLanguageService, ScriptKind } from './lib/typescriptServices.js';
import { libFileMap } from './lib/lib.js';
function fileNameIsLib(resource) {
if (typeof resource === "string") {
if (/^file:\/\/\//.test(resource)) {
return !!libFileMap[resource.substr(8)];
}
return false;
}
if (resource.path.indexOf("/lib.") === 0) {
return !!libFileMap[resource.path.slice(1)];
}
return false;
}
class TypeScriptWorker {
constructor(ctx, createData) {
this._extraLibs = /* @__PURE__ */ Object.create(null);
this._languageService = createLanguageService(this);
this._ctx = ctx;
this._compilerOptions = createData.compilerOptions;
this._extraLibs = createData.extraLibs;
this._inlayHintsOptions = createData.inlayHintsOptions;
}
// --- language service host ---------------
getCompilationSettings() {
return this._compilerOptions;
}
getLanguageService() {
return this._languageService;
}
getExtraLibs() {
return this._extraLibs;
}
getScriptFileNames() {
const allModels = this._ctx.getMirrorModels().map((model) => model.uri);
const models = allModels.filter((uri) => !fileNameIsLib(uri)).map((uri) => uri.toString());
return models.concat(Object.keys(this._extraLibs));
}
_getModel(fileName) {
let models = this._ctx.getMirrorModels();
for (let i = 0; i < models.length; i++) {
const uri = models[i].uri;
if (uri.toString() === fileName || uri.toString(true) === fileName) {
return models[i];
}
}
return null;
}
getScriptVersion(fileName) {
let model = this._getModel(fileName);
if (model) {
return model.version.toString();
} else if (this.isDefaultLibFileName(fileName)) {
return "1";
} else if (fileName in this._extraLibs) {
return String(this._extraLibs[fileName].version);
}
return "";
}
async getScriptText(fileName) {
return this._getScriptText(fileName);
}
_getScriptText(fileName) {
let text;
let model = this._getModel(fileName);
const libizedFileName = "lib." + fileName + ".d.ts";
if (model) {
text = model.getValue();
} else if (fileName in libFileMap) {
text = libFileMap[fileName];
} else if (libizedFileName in libFileMap) {
text = libFileMap[libizedFileName];
} else if (fileName in this._extraLibs) {
text = this._extraLibs[fileName].content;
} else {
return;
}
return text;
}
getScriptSnapshot(fileName) {
const text = this._getScriptText(fileName);
if (text === void 0) {
return;
}
return {
getText: (start, end) => text.substring(start, end),
getLength: () => text.length,
getChangeRange: () => void 0
};
}
getScriptKind(fileName) {
const suffix = fileName.substr(fileName.lastIndexOf(".") + 1);
switch (suffix) {
case "ts":
return ScriptKind.TS;
case "tsx":
return ScriptKind.TSX;
case "js":
return ScriptKind.JS;
case "jsx":
return ScriptKind.JSX;
default:
return this.getCompilationSettings().allowJs ? ScriptKind.JS : ScriptKind.TS;
}
}
getCurrentDirectory() {
return "";
}
getDefaultLibFileName(options) {
switch (options.target) {
case 99:
const esnext = "lib.esnext.full.d.ts";
if (esnext in libFileMap || esnext in this._extraLibs) return esnext;
case 7:
case 6:
case 5:
case 4:
case 3:
case 2:
default:
const eslib = `lib.es${2013 + (options.target || 99)}.full.d.ts`;
if (eslib in libFileMap || eslib in this._extraLibs) {
return eslib;
}
return "lib.es6.d.ts";
// We don't use lib.es2015.full.d.ts due to breaking change.
case 1:
case 0:
return "lib.d.ts";
}
}
isDefaultLibFileName(fileName) {
return fileName === this.getDefaultLibFileName(this._compilerOptions);
}
readFile(path) {
return this._getScriptText(path);
}
fileExists(path) {
return this._getScriptText(path) !== void 0;
}
async getLibFiles() {
return libFileMap;
}
// --- language features
static clearFiles(tsDiagnostics) {
const diagnostics = [];
for (const tsDiagnostic of tsDiagnostics) {
const diagnostic = { ...tsDiagnostic };
diagnostic.file = diagnostic.file ? { fileName: diagnostic.file.fileName } : void 0;
if (tsDiagnostic.relatedInformation) {
diagnostic.relatedInformation = [];
for (const tsRelatedDiagnostic of tsDiagnostic.relatedInformation) {
const relatedDiagnostic = { ...tsRelatedDiagnostic };
relatedDiagnostic.file = relatedDiagnostic.file ? { fileName: relatedDiagnostic.file.fileName } : void 0;
diagnostic.relatedInformation.push(relatedDiagnostic);
}
}
diagnostics.push(diagnostic);
}
return diagnostics;
}
async getSyntacticDiagnostics(fileName) {
if (fileNameIsLib(fileName)) {
return [];
}
const diagnostics = this._languageService.getSyntacticDiagnostics(fileName);
return TypeScriptWorker.clearFiles(diagnostics);
}
async getSemanticDiagnostics(fileName) {
if (fileNameIsLib(fileName)) {
return [];
}
const diagnostics = this._languageService.getSemanticDiagnostics(fileName);
return TypeScriptWorker.clearFiles(diagnostics);
}
async getSuggestionDiagnostics(fileName) {
if (fileNameIsLib(fileName)) {
return [];
}
const diagnostics = this._languageService.getSuggestionDiagnostics(fileName);
return TypeScriptWorker.clearFiles(diagnostics);
}
async getCompilerOptionsDiagnostics(fileName) {
if (fileNameIsLib(fileName)) {
return [];
}
const diagnostics = this._languageService.getCompilerOptionsDiagnostics();
return TypeScriptWorker.clearFiles(diagnostics);
}
async getCompletionsAtPosition(fileName, position) {
if (fileNameIsLib(fileName)) {
return void 0;
}
return this._languageService.getCompletionsAtPosition(fileName, position, void 0);
}
async getCompletionEntryDetails(fileName, position, entry) {
return this._languageService.getCompletionEntryDetails(
fileName,
position,
entry,
void 0,
void 0,
void 0,
void 0
);
}
async getSignatureHelpItems(fileName, position, options) {
if (fileNameIsLib(fileName)) {
return void 0;
}
return this._languageService.getSignatureHelpItems(fileName, position, options);
}
async getQuickInfoAtPosition(fileName, position) {
if (fileNameIsLib(fileName)) {
return void 0;
}
return this._languageService.getQuickInfoAtPosition(fileName, position);
}
async getDocumentHighlights(fileName, position, filesToSearch) {
if (fileNameIsLib(fileName)) {
return void 0;
}
return this._languageService.getDocumentHighlights(fileName, position, filesToSearch);
}
async getDefinitionAtPosition(fileName, position) {
if (fileNameIsLib(fileName)) {
return void 0;
}
return this._languageService.getDefinitionAtPosition(fileName, position);
}
async getReferencesAtPosition(fileName, position) {
if (fileNameIsLib(fileName)) {
return void 0;
}
return this._languageService.getReferencesAtPosition(fileName, position);
}
async getNavigationTree(fileName) {
if (fileNameIsLib(fileName)) {
return void 0;
}
return this._languageService.getNavigationTree(fileName);
}
async getFormattingEditsForDocument(fileName, options) {
if (fileNameIsLib(fileName)) {
return [];
}
return this._languageService.getFormattingEditsForDocument(fileName, options);
}
async getFormattingEditsForRange(fileName, start, end, options) {
if (fileNameIsLib(fileName)) {
return [];
}
return this._languageService.getFormattingEditsForRange(fileName, start, end, options);
}
async getFormattingEditsAfterKeystroke(fileName, postion, ch, options) {
if (fileNameIsLib(fileName)) {
return [];
}
return this._languageService.getFormattingEditsAfterKeystroke(fileName, postion, ch, options);
}
async findRenameLocations(fileName, position, findInStrings, findInComments, providePrefixAndSuffixTextForRename) {
if (fileNameIsLib(fileName)) {
return void 0;
}
return this._languageService.findRenameLocations(
fileName,
position,
findInStrings,
findInComments,
providePrefixAndSuffixTextForRename
);
}
async getRenameInfo(fileName, position, options) {
if (fileNameIsLib(fileName)) {
return { canRename: false, localizedErrorMessage: "Cannot rename in lib file" };
}
return this._languageService.getRenameInfo(fileName, position, options);
}
async getEmitOutput(fileName, emitOnlyDtsFiles, forceDtsEmit) {
if (fileNameIsLib(fileName)) {
return { outputFiles: [], emitSkipped: true };
}
const emitOutput = this._languageService.getEmitOutput(
fileName,
emitOnlyDtsFiles,
forceDtsEmit
);
const diagnostics = emitOutput.diagnostics ? TypeScriptWorker.clearFiles(emitOutput.diagnostics) : void 0;
return { ...emitOutput, diagnostics };
}
async getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions) {
if (fileNameIsLib(fileName)) {
return [];
}
const preferences = {};
try {
return this._languageService.getCodeFixesAtPosition(
fileName,
start,
end,
errorCodes,
formatOptions,
preferences
);
} catch {
return [];
}
}
async updateExtraLibs(extraLibs) {
this._extraLibs = extraLibs;
}
async provideInlayHints(fileName, start, end) {
if (fileNameIsLib(fileName)) {
return [];
}
const preferences = this._inlayHintsOptions ?? {};
const span = {
start,
length: end - start
};
try {
return this._languageService.provideInlayHints(fileName, span, preferences);
} catch {
return [];
}
}
}
function create(ctx, createData) {
let TSWorkerClass = TypeScriptWorker;
if (createData.customWorkerPath) {
if (typeof importScripts === "undefined") {
console.warn(
"Monaco is not using webworkers for background tasks, and that is needed to support the customWorkerPath flag"
);
} else {
self.importScripts(createData.customWorkerPath);
const workerFactoryFunc = self.customTSWorkerFactory;
if (!workerFactoryFunc) {
throw new Error(
`The script at ${createData.customWorkerPath} does not add customTSWorkerFactory to self`
);
}
TSWorkerClass = workerFactoryFunc(TypeScriptWorker, typescriptServices, libFileMap);
}
}
return new TSWorkerClass(ctx, createData);
}
globalThis.ts = typescript;
export { TypeScriptWorker, create };
@@ -0,0 +1,147 @@
import '../../editor/browser/coreCommands.js';
import '../../editor/browser/widget/codeEditor/codeEditorWidget.js';
import '../../editor/browser/widget/diffEditor/diffEditor.contribution.js';
import '../../editor/contrib/anchorSelect/browser/anchorSelect.js';
import '../../editor/contrib/bracketMatching/browser/bracketMatching.js';
import '../../editor/contrib/caretOperations/browser/caretOperations.js';
import '../../editor/contrib/caretOperations/browser/transpose.js';
import '../../editor/contrib/clipboard/browser/clipboard.js';
import '../../editor/contrib/codeAction/browser/codeActionContributions.js';
import '../../editor/contrib/codelens/browser/codelensController.js';
import '../../editor/contrib/colorPicker/browser/colorPickerContribution.js';
import '../../editor/contrib/comment/browser/comment.js';
import '../../editor/contrib/contextmenu/browser/contextmenu.js';
import '../../editor/contrib/cursorUndo/browser/cursorUndo.js';
import '../../editor/contrib/dnd/browser/dnd.js';
import '../../editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js';
import '../../editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js';
import '../../editor/contrib/find/browser/findController.js';
import '../../editor/contrib/folding/browser/folding.js';
import '../../editor/contrib/fontZoom/browser/fontZoom.js';
import '../../editor/contrib/format/browser/formatActions.js';
import '../../editor/contrib/documentSymbols/browser/documentSymbols.js';
import '../../editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js';
import '../../editor/contrib/inlineProgress/browser/inlineProgress.js';
import '../../editor/contrib/gotoSymbol/browser/goToCommands.js';
import '../../editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js';
import '../../editor/contrib/gotoError/browser/gotoError.js';
import '../../editor/contrib/gpu/browser/gpuActions.js';
import '../../editor/contrib/hover/browser/hoverContribution.js';
import '../../editor/contrib/indentation/browser/indentation.js';
import '../../editor/contrib/inlayHints/browser/inlayHintsContribution.js';
import '../../editor/contrib/inPlaceReplace/browser/inPlaceReplace.js';
import '../../editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js';
import '../../editor/contrib/lineSelection/browser/lineSelection.js';
import '../../editor/contrib/linesOperations/browser/linesOperations.js';
import '../../editor/contrib/linkedEditing/browser/linkedEditing.js';
import '../../editor/contrib/links/browser/links.js';
import '../../editor/contrib/longLinesHelper/browser/longLinesHelper.js';
import '../../editor/contrib/middleScroll/browser/middleScroll.contribution.js';
import '../../editor/contrib/multicursor/browser/multicursor.js';
import '../../editor/contrib/parameterHints/browser/parameterHints.js';
import '../../editor/contrib/placeholderText/browser/placeholderText.contribution.js';
import '../../editor/contrib/rename/browser/rename.js';
import '../../editor/contrib/sectionHeaders/browser/sectionHeaders.js';
import '../../editor/contrib/semanticTokens/browser/documentSemanticTokens.js';
import '../../editor/contrib/semanticTokens/browser/viewportSemanticTokens.js';
import '../../editor/contrib/smartSelect/browser/smartSelect.js';
import '../../editor/contrib/snippet/browser/snippetController2.js';
import '../../editor/contrib/stickyScroll/browser/stickyScrollContribution.js';
import '../../editor/contrib/suggest/browser/suggestController.js';
import '../../editor/contrib/suggest/browser/suggestInlineCompletions.js';
import '../../editor/contrib/tokenization/browser/tokenization.js';
import '../../editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js';
import '../../editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js';
import '../../editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js';
import '../../editor/contrib/wordHighlighter/browser/wordHighlighter.js';
import '../../editor/contrib/wordOperations/browser/wordOperations.js';
import '../../editor/contrib/wordPartOperations/browser/wordPartOperations.js';
import '../../editor/contrib/readOnlyMessage/browser/contribution.js';
import '../../editor/contrib/diffEditorBreadcrumbs/browser/contribution.js';
import '../../editor/contrib/floatingMenu/browser/floatingMenu.contribution.js';
import '../../editor/common/standaloneStrings.js';
import '../../base/browser/ui/codicons/codicon/codicon.css';
import '../../base/browser/ui/codicons/codicon/codicon-modifiers.css';
import '../../editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js';
import '../../editor/standalone/browser/inspectTokens/inspectTokens.js';
import '../../editor/standalone/browser/quickAccess/standaloneHelpQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.js';
import '../../editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js';
import '../../editor/standalone/browser/referenceSearch/standaloneReferenceSearch.js';
import '../../editor/standalone/browser/toggleHighContrast/toggleHighContrast.js';
import { editor } from '../../editor/editor.api2.js';
import { createWebWorker } from '../../common/workers.js';
class WorkerManager {
constructor(_modeId, _defaults) {
this._modeId = _modeId;
this._defaults = _defaults;
this._worker = null;
this._client = null;
this._configChangeListener = this._defaults.onDidChange(() => this._stopWorker());
this._updateExtraLibsToken = 0;
this._extraLibsChangeListener = this._defaults.onDidExtraLibsChange(
() => this._updateExtraLibs()
);
}
dispose() {
this._configChangeListener.dispose();
this._extraLibsChangeListener.dispose();
this._stopWorker();
}
_stopWorker() {
if (this._worker) {
this._worker.dispose();
this._worker = null;
}
this._client = null;
}
async _updateExtraLibs() {
if (!this._worker) {
return;
}
const myToken = ++this._updateExtraLibsToken;
const proxy = await this._worker.getProxy();
if (this._updateExtraLibsToken !== myToken) {
return;
}
proxy.updateExtraLibs(this._defaults.getExtraLibs());
}
_getClient() {
if (!this._client) {
this._client = (async () => {
this._worker = createWebWorker({
// module that exports the create() method and returns a `TypeScriptWorker` instance
moduleId: "vs/language/typescript/tsWorker",
createWorker: () => new Worker(new URL('ts.worker.js', import.meta.url), { type: "module" }),
label: this._modeId,
keepIdleModels: true,
// passed in to the create() method
createData: {
compilerOptions: this._defaults.getCompilerOptions(),
extraLibs: this._defaults.getExtraLibs(),
customWorkerPath: this._defaults.workerOptions.customWorkerPath,
inlayHintsOptions: this._defaults.inlayHintsOptions
}
});
if (this._defaults.getEagerModelSync()) {
return await this._worker.withSyncedResources(
editor.getModels().filter((model) => model.getLanguageId() === this._modeId).map((model) => model.uri)
);
}
return await this._worker.getProxy();
})();
}
return this._client;
}
async getLanguageServiceWorker(...resources) {
const client = await this._getClient();
if (this._worker) {
await this._worker.withSyncedResources(resources);
}
return client;
}
}
export { WorkerManager };