| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611 |
- /*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
- import * as cssService from './_deps/vscode-css-languageservice/cssLanguageService.js';
- import { languages, editor, Uri, Range, MarkerSeverity } from './fillers/monaco-editor-core.js';
- // --- diagnostics --- ---
- var DiagnosticsAdapter = /** @class */ (function () {
- function DiagnosticsAdapter(_languageId, _worker, defaults) {
- var _this = this;
- this._languageId = _languageId;
- this._worker = _worker;
- this._disposables = [];
- this._listener = Object.create(null);
- var onModelAdd = function (model) {
- var modeId = model.getModeId();
- if (modeId !== _this._languageId) {
- return;
- }
- var handle;
- _this._listener[model.uri.toString()] = model.onDidChangeContent(function () {
- window.clearTimeout(handle);
- handle = window.setTimeout(function () { return _this._doValidate(model.uri, modeId); }, 500);
- });
- _this._doValidate(model.uri, modeId);
- };
- var onModelRemoved = function (model) {
- editor.setModelMarkers(model, _this._languageId, []);
- var uriStr = model.uri.toString();
- var 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(function (event) {
- onModelRemoved(event.model);
- onModelAdd(event.model);
- }));
- defaults.onDidChange(function (_) {
- editor.getModels().forEach(function (model) {
- if (model.getModeId() === _this._languageId) {
- onModelRemoved(model);
- onModelAdd(model);
- }
- });
- });
- this._disposables.push({
- dispose: function () {
- for (var key in _this._listener) {
- _this._listener[key].dispose();
- }
- }
- });
- editor.getModels().forEach(onModelAdd);
- }
- DiagnosticsAdapter.prototype.dispose = function () {
- this._disposables.forEach(function (d) { return d && d.dispose(); });
- this._disposables = [];
- };
- DiagnosticsAdapter.prototype._doValidate = function (resource, languageId) {
- this._worker(resource)
- .then(function (worker) {
- return worker.doValidation(resource.toString());
- })
- .then(function (diagnostics) {
- var markers = diagnostics.map(function (d) { return toDiagnostics(resource, d); });
- var model = editor.getModel(resource);
- if (model && model.getModeId() === languageId) {
- editor.setModelMarkers(model, languageId, markers);
- }
- })
- .then(undefined, function (err) {
- console.error(err);
- });
- };
- return DiagnosticsAdapter;
- }());
- export { DiagnosticsAdapter };
- function toSeverity(lsSeverity) {
- switch (lsSeverity) {
- case cssService.DiagnosticSeverity.Error:
- return MarkerSeverity.Error;
- case cssService.DiagnosticSeverity.Warning:
- return MarkerSeverity.Warning;
- case cssService.DiagnosticSeverity.Information:
- return MarkerSeverity.Info;
- case cssService.DiagnosticSeverity.Hint:
- return MarkerSeverity.Hint;
- default:
- return MarkerSeverity.Info;
- }
- }
- function toDiagnostics(resource, diag) {
- var 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: code,
- source: diag.source
- };
- }
- // --- completion ------
- 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) {
- var mItemKind = languages.CompletionItemKind;
- switch (kind) {
- case cssService.CompletionItemKind.Text:
- return mItemKind.Text;
- case cssService.CompletionItemKind.Method:
- return mItemKind.Method;
- case cssService.CompletionItemKind.Function:
- return mItemKind.Function;
- case cssService.CompletionItemKind.Constructor:
- return mItemKind.Constructor;
- case cssService.CompletionItemKind.Field:
- return mItemKind.Field;
- case cssService.CompletionItemKind.Variable:
- return mItemKind.Variable;
- case cssService.CompletionItemKind.Class:
- return mItemKind.Class;
- case cssService.CompletionItemKind.Interface:
- return mItemKind.Interface;
- case cssService.CompletionItemKind.Module:
- return mItemKind.Module;
- case cssService.CompletionItemKind.Property:
- return mItemKind.Property;
- case cssService.CompletionItemKind.Unit:
- return mItemKind.Unit;
- case cssService.CompletionItemKind.Value:
- return mItemKind.Value;
- case cssService.CompletionItemKind.Enum:
- return mItemKind.Enum;
- case cssService.CompletionItemKind.Keyword:
- return mItemKind.Keyword;
- case cssService.CompletionItemKind.Snippet:
- return mItemKind.Snippet;
- case cssService.CompletionItemKind.Color:
- return mItemKind.Color;
- case cssService.CompletionItemKind.File:
- return mItemKind.File;
- case cssService.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 } : undefined;
- }
- var CompletionAdapter = /** @class */ (function () {
- function CompletionAdapter(_worker) {
- this._worker = _worker;
- }
- Object.defineProperty(CompletionAdapter.prototype, "triggerCharacters", {
- get: function () {
- return ['/', '-', ':'];
- },
- enumerable: false,
- configurable: true
- });
- CompletionAdapter.prototype.provideCompletionItems = function (model, position, context, token) {
- var resource = model.uri;
- return this._worker(resource)
- .then(function (worker) {
- return worker.doComplete(resource.toString(), fromPosition(position));
- })
- .then(function (info) {
- if (!info) {
- return;
- }
- var wordInfo = model.getWordUntilPosition(position);
- var wordRange = new Range(position.lineNumber, wordInfo.startColumn, position.lineNumber, wordInfo.endColumn);
- var items = info.items.map(function (entry) {
- var 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 === cssService.InsertTextFormat.Snippet) {
- item.insertTextRules = languages.CompletionItemInsertTextRule.InsertAsSnippet;
- }
- return item;
- });
- return {
- isIncomplete: info.isIncomplete,
- suggestions: items
- };
- });
- };
- return CompletionAdapter;
- }());
- export { CompletionAdapter };
- 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)];
- }
- // --- hover ------
- var HoverAdapter = /** @class */ (function () {
- function HoverAdapter(_worker) {
- this._worker = _worker;
- }
- HoverAdapter.prototype.provideHover = function (model, position, token) {
- var resource = model.uri;
- return this._worker(resource)
- .then(function (worker) {
- return worker.doHover(resource.toString(), fromPosition(position));
- })
- .then(function (info) {
- if (!info) {
- return;
- }
- return {
- range: toRange(info.range),
- contents: toMarkedStringArray(info.contents)
- };
- });
- };
- return HoverAdapter;
- }());
- export { HoverAdapter };
- // --- document highlights ------
- function toDocumentHighlightKind(kind) {
- switch (kind) {
- case cssService.DocumentHighlightKind.Read:
- return languages.DocumentHighlightKind.Read;
- case cssService.DocumentHighlightKind.Write:
- return languages.DocumentHighlightKind.Write;
- case cssService.DocumentHighlightKind.Text:
- return languages.DocumentHighlightKind.Text;
- }
- return languages.DocumentHighlightKind.Text;
- }
- var DocumentHighlightAdapter = /** @class */ (function () {
- function DocumentHighlightAdapter(_worker) {
- this._worker = _worker;
- }
- DocumentHighlightAdapter.prototype.provideDocumentHighlights = function (model, position, token) {
- var resource = model.uri;
- return this._worker(resource)
- .then(function (worker) {
- return worker.findDocumentHighlights(resource.toString(), fromPosition(position));
- })
- .then(function (entries) {
- if (!entries) {
- return;
- }
- return entries.map(function (entry) {
- return {
- range: toRange(entry.range),
- kind: toDocumentHighlightKind(entry.kind)
- };
- });
- });
- };
- return DocumentHighlightAdapter;
- }());
- export { DocumentHighlightAdapter };
- // --- definition ------
- function toLocation(location) {
- return {
- uri: Uri.parse(location.uri),
- range: toRange(location.range)
- };
- }
- var DefinitionAdapter = /** @class */ (function () {
- function DefinitionAdapter(_worker) {
- this._worker = _worker;
- }
- DefinitionAdapter.prototype.provideDefinition = function (model, position, token) {
- var resource = model.uri;
- return this._worker(resource)
- .then(function (worker) {
- return worker.findDefinition(resource.toString(), fromPosition(position));
- })
- .then(function (definition) {
- if (!definition) {
- return;
- }
- return [toLocation(definition)];
- });
- };
- return DefinitionAdapter;
- }());
- export { DefinitionAdapter };
- // --- references ------
- var ReferenceAdapter = /** @class */ (function () {
- function ReferenceAdapter(_worker) {
- this._worker = _worker;
- }
- ReferenceAdapter.prototype.provideReferences = function (model, position, context, token) {
- var resource = model.uri;
- return this._worker(resource)
- .then(function (worker) {
- return worker.findReferences(resource.toString(), fromPosition(position));
- })
- .then(function (entries) {
- if (!entries) {
- return;
- }
- return entries.map(toLocation);
- });
- };
- return ReferenceAdapter;
- }());
- export { ReferenceAdapter };
- // --- rename ------
- function toWorkspaceEdit(edit) {
- if (!edit || !edit.changes) {
- return void 0;
- }
- var resourceEdits = [];
- for (var uri in edit.changes) {
- var _uri = Uri.parse(uri);
- // let edits: languages.TextEdit[] = [];
- for (var _i = 0, _a = edit.changes[uri]; _i < _a.length; _i++) {
- var e = _a[_i];
- resourceEdits.push({
- resource: _uri,
- edit: {
- range: toRange(e.range),
- text: e.newText
- }
- });
- }
- }
- return {
- edits: resourceEdits
- };
- }
- var RenameAdapter = /** @class */ (function () {
- function RenameAdapter(_worker) {
- this._worker = _worker;
- }
- RenameAdapter.prototype.provideRenameEdits = function (model, position, newName, token) {
- var resource = model.uri;
- return this._worker(resource)
- .then(function (worker) {
- return worker.doRename(resource.toString(), fromPosition(position), newName);
- })
- .then(function (edit) {
- return toWorkspaceEdit(edit);
- });
- };
- return RenameAdapter;
- }());
- export { RenameAdapter };
- // --- document symbols ------
- function toSymbolKind(kind) {
- var mKind = languages.SymbolKind;
- switch (kind) {
- case cssService.SymbolKind.File:
- return mKind.Array;
- case cssService.SymbolKind.Module:
- return mKind.Module;
- case cssService.SymbolKind.Namespace:
- return mKind.Namespace;
- case cssService.SymbolKind.Package:
- return mKind.Package;
- case cssService.SymbolKind.Class:
- return mKind.Class;
- case cssService.SymbolKind.Method:
- return mKind.Method;
- case cssService.SymbolKind.Property:
- return mKind.Property;
- case cssService.SymbolKind.Field:
- return mKind.Field;
- case cssService.SymbolKind.Constructor:
- return mKind.Constructor;
- case cssService.SymbolKind.Enum:
- return mKind.Enum;
- case cssService.SymbolKind.Interface:
- return mKind.Interface;
- case cssService.SymbolKind.Function:
- return mKind.Function;
- case cssService.SymbolKind.Variable:
- return mKind.Variable;
- case cssService.SymbolKind.Constant:
- return mKind.Constant;
- case cssService.SymbolKind.String:
- return mKind.String;
- case cssService.SymbolKind.Number:
- return mKind.Number;
- case cssService.SymbolKind.Boolean:
- return mKind.Boolean;
- case cssService.SymbolKind.Array:
- return mKind.Array;
- }
- return mKind.Function;
- }
- var DocumentSymbolAdapter = /** @class */ (function () {
- function DocumentSymbolAdapter(_worker) {
- this._worker = _worker;
- }
- DocumentSymbolAdapter.prototype.provideDocumentSymbols = function (model, token) {
- var resource = model.uri;
- return this._worker(resource)
- .then(function (worker) { return worker.findDocumentSymbols(resource.toString()); })
- .then(function (items) {
- if (!items) {
- return;
- }
- return items.map(function (item) { return ({
- name: item.name,
- detail: '',
- containerName: item.containerName,
- kind: toSymbolKind(item.kind),
- tags: [],
- range: toRange(item.location.range),
- selectionRange: toRange(item.location.range)
- }); });
- });
- };
- return DocumentSymbolAdapter;
- }());
- export { DocumentSymbolAdapter };
- var DocumentColorAdapter = /** @class */ (function () {
- function DocumentColorAdapter(_worker) {
- this._worker = _worker;
- }
- DocumentColorAdapter.prototype.provideDocumentColors = function (model, token) {
- var resource = model.uri;
- return this._worker(resource)
- .then(function (worker) { return worker.findDocumentColors(resource.toString()); })
- .then(function (infos) {
- if (!infos) {
- return;
- }
- return infos.map(function (item) { return ({
- color: item.color,
- range: toRange(item.range)
- }); });
- });
- };
- DocumentColorAdapter.prototype.provideColorPresentations = function (model, info, token) {
- var resource = model.uri;
- return this._worker(resource)
- .then(function (worker) {
- return worker.getColorPresentations(resource.toString(), info.color, fromRange(info.range));
- })
- .then(function (presentations) {
- if (!presentations) {
- return;
- }
- return presentations.map(function (presentation) {
- var item = {
- label: presentation.label
- };
- if (presentation.textEdit) {
- item.textEdit = toTextEdit(presentation.textEdit);
- }
- if (presentation.additionalTextEdits) {
- item.additionalTextEdits = presentation.additionalTextEdits.map(toTextEdit);
- }
- return item;
- });
- });
- };
- return DocumentColorAdapter;
- }());
- export { DocumentColorAdapter };
- var FoldingRangeAdapter = /** @class */ (function () {
- function FoldingRangeAdapter(_worker) {
- this._worker = _worker;
- }
- FoldingRangeAdapter.prototype.provideFoldingRanges = function (model, context, token) {
- var resource = model.uri;
- return this._worker(resource)
- .then(function (worker) { return worker.getFoldingRanges(resource.toString(), context); })
- .then(function (ranges) {
- if (!ranges) {
- return;
- }
- return ranges.map(function (range) {
- var result = {
- start: range.startLine + 1,
- end: range.endLine + 1
- };
- if (typeof range.kind !== 'undefined') {
- result.kind = toFoldingRangeKind(range.kind);
- }
- return result;
- });
- });
- };
- return FoldingRangeAdapter;
- }());
- export { FoldingRangeAdapter };
- function toFoldingRangeKind(kind) {
- switch (kind) {
- case cssService.FoldingRangeKind.Comment:
- return languages.FoldingRangeKind.Comment;
- case cssService.FoldingRangeKind.Imports:
- return languages.FoldingRangeKind.Imports;
- case cssService.FoldingRangeKind.Region:
- return languages.FoldingRangeKind.Region;
- }
- }
- var SelectionRangeAdapter = /** @class */ (function () {
- function SelectionRangeAdapter(_worker) {
- this._worker = _worker;
- }
- SelectionRangeAdapter.prototype.provideSelectionRanges = function (model, positions, token) {
- var resource = model.uri;
- return this._worker(resource)
- .then(function (worker) { return worker.getSelectionRanges(resource.toString(), positions.map(fromPosition)); })
- .then(function (selectionRanges) {
- if (!selectionRanges) {
- return;
- }
- return selectionRanges.map(function (selectionRange) {
- var result = [];
- while (selectionRange) {
- result.push({ range: toRange(selectionRange.range) });
- selectionRange = selectionRange.parent;
- }
- return result;
- });
- });
- };
- return SelectionRangeAdapter;
- }());
- export { SelectionRangeAdapter };
|