Version 1.0
This commit is contained in:
Generated
Vendored
+716
@@ -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 };
|
||||
+8
@@ -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
@@ -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
@@ -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 };
|
||||
+1
@@ -0,0 +1 @@
|
||||
export {}
|
||||
+184
@@ -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 };
|
||||
+64
@@ -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 };
|
||||
+8
@@ -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
@@ -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
@@ -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 };
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
export {}
|
||||
+181
@@ -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 };
|
||||
+64
@@ -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 };
|
||||
+8
@@ -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
@@ -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
@@ -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 };
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
export {}
|
||||
+144
@@ -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 };
|
||||
+189
@@ -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 };
|
||||
+65
@@ -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 };
|
||||
Generated
Vendored
+1009
File diff suppressed because it is too large
Load Diff
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
export {}
|
||||
Generated
Vendored
+302
@@ -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 };
|
||||
+14
@@ -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 };
|
||||
+212
@@ -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 };
|
||||
+352
@@ -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 };
|
||||
+147
@@ -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 };
|
||||
Reference in New Issue
Block a user