@difizen/libro-cofine-editor 0.1.18 → 0.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/editor-contribution.d.ts.map +1 -1
- package/es/editor-contribution.js +2 -1
- package/es/language/python/data/snippets/python.snippets.json +0 -30
- package/es/libro-e2-editor.d.ts +5 -5
- package/es/libro-e2-editor.d.ts.map +1 -1
- package/es/libro-e2-editor.js +68 -65
- package/es/libro-e2-preload.d.ts.map +1 -1
- package/es/libro-e2-preload.js +1 -3
- package/package.json +7 -7
- package/src/editor-contribution.ts +2 -5
- package/src/language/python/data/snippets/python.snippets.json +0 -30
- package/src/libro-e2-editor.ts +55 -39
- package/src/libro-e2-preload.ts +0 -2
- package/es/language/lsp/completion-provider.d.ts +0 -13
- package/es/language/lsp/completion-provider.d.ts.map +0 -1
- package/es/language/lsp/completion-provider.js +0 -294
- package/es/language/lsp/diagnostic-provider.d.ts +0 -27
- package/es/language/lsp/diagnostic-provider.d.ts.map +0 -1
- package/es/language/lsp/diagnostic-provider.js +0 -230
- package/es/language/lsp/format-provider.d.ts +0 -9
- package/es/language/lsp/format-provider.d.ts.map +0 -1
- package/es/language/lsp/format-provider.js +0 -143
- package/es/language/lsp/hover-provider.d.ts +0 -8
- package/es/language/lsp/hover-provider.d.ts.map +0 -1
- package/es/language/lsp/hover-provider.js +0 -136
- package/es/language/lsp/language-feature-provider.d.ts +0 -22
- package/es/language/lsp/language-feature-provider.d.ts.map +0 -1
- package/es/language/lsp/language-feature-provider.js +0 -194
- package/es/language/lsp/lsp-contribution.d.ts +0 -22
- package/es/language/lsp/lsp-contribution.d.ts.map +0 -1
- package/es/language/lsp/lsp-contribution.js +0 -135
- package/es/language/lsp/module.d.ts +0 -2
- package/es/language/lsp/module.d.ts.map +0 -1
- package/es/language/lsp/module.js +0 -3
- package/es/language/lsp/semantic-highlight-provider.d.ts +0 -9
- package/es/language/lsp/semantic-highlight-provider.d.ts.map +0 -1
- package/es/language/lsp/semantic-highlight-provider.js +0 -41
- package/es/language/lsp/signature-help-provider.d.ts +0 -8
- package/es/language/lsp/signature-help-provider.d.ts.map +0 -1
- package/es/language/lsp/signature-help-provider.js +0 -108
- package/es/language/lsp/type-concerters.d.ts +0 -7
- package/es/language/lsp/type-concerters.d.ts.map +0 -1
- package/es/language/lsp/type-concerters.js +0 -35
- package/src/language/lsp/completion-provider.ts +0 -213
- package/src/language/lsp/diagnostic-provider.ts +0 -168
- package/src/language/lsp/format-provider.ts +0 -88
- package/src/language/lsp/hover-provider.ts +0 -98
- package/src/language/lsp/language-feature-provider.ts +0 -107
- package/src/language/lsp/lsp-contribution.ts +0 -129
- package/src/language/lsp/module.ts +0 -5
- package/src/language/lsp/semantic-highlight-provider.ts +0 -26
- package/src/language/lsp/signature-help-provider.ts +0 -65
- package/src/language/lsp/type-concerters.ts +0 -72
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
3
|
-
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
4
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
5
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
6
|
-
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7
|
-
import { languages } from '@difizen/monaco-editor-core';
|
|
8
|
-
import * as lsp from 'vscode-languageserver-protocol';
|
|
9
|
-
var _from = new Map([[lsp.CompletionItemKind.Method, languages.CompletionItemKind.Method], [lsp.CompletionItemKind.Function, languages.CompletionItemKind.Function], [lsp.CompletionItemKind.Constructor, languages.CompletionItemKind.Constructor], [lsp.CompletionItemKind.Field, languages.CompletionItemKind.Field], [lsp.CompletionItemKind.Variable, languages.CompletionItemKind.Variable], [lsp.CompletionItemKind.Class, languages.CompletionItemKind.Class], [lsp.CompletionItemKind.Interface, languages.CompletionItemKind.Interface], [lsp.CompletionItemKind.Struct, languages.CompletionItemKind.Struct], [lsp.CompletionItemKind.Module, languages.CompletionItemKind.Module], [lsp.CompletionItemKind.Property, languages.CompletionItemKind.Property], [lsp.CompletionItemKind.Unit, languages.CompletionItemKind.Unit], [lsp.CompletionItemKind.Value, languages.CompletionItemKind.Value], [lsp.CompletionItemKind.Constant, languages.CompletionItemKind.Constant], [lsp.CompletionItemKind.Enum, languages.CompletionItemKind.Enum], [lsp.CompletionItemKind.EnumMember, languages.CompletionItemKind.EnumMember], [lsp.CompletionItemKind.Keyword, languages.CompletionItemKind.Keyword], [lsp.CompletionItemKind.Snippet, languages.CompletionItemKind.Snippet], [lsp.CompletionItemKind.Text, languages.CompletionItemKind.Text], [lsp.CompletionItemKind.Color, languages.CompletionItemKind.Color], [lsp.CompletionItemKind.File, languages.CompletionItemKind.File], [lsp.CompletionItemKind.Reference, languages.CompletionItemKind.Reference], [lsp.CompletionItemKind.Folder, languages.CompletionItemKind.Folder], [lsp.CompletionItemKind.Event, languages.CompletionItemKind.Event], [lsp.CompletionItemKind.Operator, languages.CompletionItemKind.Operator], [lsp.CompletionItemKind.TypeParameter, languages.CompletionItemKind.TypeParameter]
|
|
10
|
-
// [lsp.CompletionItemKind.Issue, languages.CompletionItemKind.Issue],
|
|
11
|
-
// [lsp.CompletionItemKind.User, languages.CompletionItemKind.User],
|
|
12
|
-
]);
|
|
13
|
-
var _to = new Map([[languages.CompletionItemKind.Method, lsp.CompletionItemKind.Method], [languages.CompletionItemKind.Function, lsp.CompletionItemKind.Function], [languages.CompletionItemKind.Constructor, lsp.CompletionItemKind.Constructor], [languages.CompletionItemKind.Field, lsp.CompletionItemKind.Field], [languages.CompletionItemKind.Variable, lsp.CompletionItemKind.Variable], [languages.CompletionItemKind.Class, lsp.CompletionItemKind.Class], [languages.CompletionItemKind.Interface, lsp.CompletionItemKind.Interface], [languages.CompletionItemKind.Struct, lsp.CompletionItemKind.Struct], [languages.CompletionItemKind.Module, lsp.CompletionItemKind.Module], [languages.CompletionItemKind.Property, lsp.CompletionItemKind.Property], [languages.CompletionItemKind.Unit, lsp.CompletionItemKind.Unit], [languages.CompletionItemKind.Value, lsp.CompletionItemKind.Value], [languages.CompletionItemKind.Constant, lsp.CompletionItemKind.Constant], [languages.CompletionItemKind.Enum, lsp.CompletionItemKind.Enum], [languages.CompletionItemKind.EnumMember, lsp.CompletionItemKind.EnumMember], [languages.CompletionItemKind.Keyword, lsp.CompletionItemKind.Keyword], [languages.CompletionItemKind.Snippet, lsp.CompletionItemKind.Snippet], [languages.CompletionItemKind.Text, lsp.CompletionItemKind.Text], [languages.CompletionItemKind.Color, lsp.CompletionItemKind.Color], [languages.CompletionItemKind.File, lsp.CompletionItemKind.File], [languages.CompletionItemKind.Reference, lsp.CompletionItemKind.Reference], [languages.CompletionItemKind.Folder, lsp.CompletionItemKind.Folder], [languages.CompletionItemKind.Event, lsp.CompletionItemKind.Event], [languages.CompletionItemKind.Operator, lsp.CompletionItemKind.Operator], [languages.CompletionItemKind.TypeParameter, lsp.CompletionItemKind.TypeParameter]
|
|
14
|
-
// [languages.CompletionItemKind.User, lsp.CompletionItemKind.User],
|
|
15
|
-
// [languages.CompletionItemKind.Issue, lsp.CompletionItemKind.Issue],
|
|
16
|
-
]);
|
|
17
|
-
export var CompletionItemKind = /*#__PURE__*/function () {
|
|
18
|
-
function CompletionItemKind() {
|
|
19
|
-
_classCallCheck(this, CompletionItemKind);
|
|
20
|
-
}
|
|
21
|
-
_createClass(CompletionItemKind, null, [{
|
|
22
|
-
key: "from",
|
|
23
|
-
value: function from(kind) {
|
|
24
|
-
var _from$get;
|
|
25
|
-
return (_from$get = _from.get(kind)) !== null && _from$get !== void 0 ? _from$get : languages.CompletionItemKind.Property;
|
|
26
|
-
}
|
|
27
|
-
}, {
|
|
28
|
-
key: "to",
|
|
29
|
-
value: function to(kind) {
|
|
30
|
-
var _to$get;
|
|
31
|
-
return (_to$get = _to.get(kind)) !== null && _to$get !== void 0 ? _to$get : lsp.CompletionItemKind.Property;
|
|
32
|
-
}
|
|
33
|
-
}]);
|
|
34
|
-
return CompletionItemKind;
|
|
35
|
-
}();
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
import { CompletionTriggerKind } from '@difizen/libro-lsp';
|
|
2
|
-
import { languages } from '@difizen/monaco-editor-core';
|
|
3
|
-
import type monaco from '@difizen/monaco-editor-core';
|
|
4
|
-
import * as lsp from 'vscode-languageserver-protocol';
|
|
5
|
-
import { InsertReplaceEdit } from 'vscode-languageserver-protocol';
|
|
6
|
-
|
|
7
|
-
import { LangaugeFeatureProvider } from './language-feature-provider.js';
|
|
8
|
-
import { CompletionItemKind } from './type-concerters.js';
|
|
9
|
-
|
|
10
|
-
export class CompletionProvider
|
|
11
|
-
extends LangaugeFeatureProvider
|
|
12
|
-
implements monaco.languages.CompletionItemProvider
|
|
13
|
-
{
|
|
14
|
-
triggerCharacters: ['.', '[', '"', "'"];
|
|
15
|
-
|
|
16
|
-
public provideCompletionItems = async (
|
|
17
|
-
model: monaco.editor.ITextModel,
|
|
18
|
-
position: monaco.Position,
|
|
19
|
-
): Promise<monaco.languages.CompletionList | undefined> => {
|
|
20
|
-
const result = await this.provideCompletionItemsFromLSPServer(model, position);
|
|
21
|
-
return result;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
protected provideCompletionItemsFromKernel = async (
|
|
25
|
-
model: monaco.editor.ITextModel,
|
|
26
|
-
position: monaco.Position,
|
|
27
|
-
): Promise<monaco.languages.CompletionList | undefined> => {
|
|
28
|
-
const editor = this.getEditorByModel(model);
|
|
29
|
-
if (!editor || editor.getOption('lspEnabled') !== true) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const reply = await editor.completionProvider?.({
|
|
34
|
-
cursorPosition: editor.getOffsetAt({
|
|
35
|
-
column: position.column,
|
|
36
|
-
line: position.lineNumber,
|
|
37
|
-
}),
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
const start = reply?.cursor_start
|
|
41
|
-
? editor.getPositionAt(reply?.cursor_start)
|
|
42
|
-
: editor.getCursorPosition();
|
|
43
|
-
const end = reply?.cursor_end
|
|
44
|
-
? editor.getPositionAt(reply?.cursor_end)
|
|
45
|
-
: editor.getCursorPosition();
|
|
46
|
-
|
|
47
|
-
const suggestion: languages.CompletionItem[] = (reply?.matches ?? []).map(
|
|
48
|
-
(match) => {
|
|
49
|
-
return {
|
|
50
|
-
label: match,
|
|
51
|
-
kind: languages.CompletionItemKind.Text,
|
|
52
|
-
insertText: match,
|
|
53
|
-
range: {
|
|
54
|
-
startColumn: start?.column,
|
|
55
|
-
startLineNumber: start?.line,
|
|
56
|
-
endColumn: end?.column,
|
|
57
|
-
endLineNumber: end?.line,
|
|
58
|
-
},
|
|
59
|
-
} as languages.CompletionItem;
|
|
60
|
-
},
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
return {
|
|
64
|
-
suggestions: suggestion as any,
|
|
65
|
-
};
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
protected provideCompletionItemsFromLSPServer = async (
|
|
69
|
-
model: monaco.editor.ITextModel,
|
|
70
|
-
position: monaco.Position,
|
|
71
|
-
): Promise<monaco.languages.CompletionList | undefined> => {
|
|
72
|
-
const provider = await this.getProvider(model);
|
|
73
|
-
if (!provider) {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
const editor = this.getEditorByModel(model);
|
|
77
|
-
if (!editor || editor.getOption('lspEnabled') !== true) {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const { lspConnection, editor: docEditor, virtualDocument: doc } = provider;
|
|
82
|
-
|
|
83
|
-
if (!lspConnection.isReady || !lspConnection.provides('completionProvider')) {
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const virtualPos = doc.transformEditorToVirtual(docEditor, {
|
|
88
|
-
line: position.lineNumber - 1,
|
|
89
|
-
ch: position.column,
|
|
90
|
-
isEditor: true,
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
if (!virtualPos) {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const result = await lspConnection.clientRequests[
|
|
98
|
-
'textDocument/completion'
|
|
99
|
-
].request({
|
|
100
|
-
position: { line: virtualPos.line, character: virtualPos.ch },
|
|
101
|
-
textDocument: {
|
|
102
|
-
uri: doc.documentInfo.uri,
|
|
103
|
-
},
|
|
104
|
-
context: {
|
|
105
|
-
triggerKind: CompletionTriggerKind.Invoked,
|
|
106
|
-
},
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
const items = 'items' in result ? result.items : result;
|
|
110
|
-
|
|
111
|
-
const word = model.getWordUntilPosition(position);
|
|
112
|
-
const range = {
|
|
113
|
-
startLineNumber: position.lineNumber,
|
|
114
|
-
endLineNumber: position.lineNumber,
|
|
115
|
-
startColumn: word.startColumn,
|
|
116
|
-
endColumn: position.column,
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
const suggestions: monaco.languages.CompletionItem[] = items.map(
|
|
120
|
-
(item: lsp.CompletionItem) => {
|
|
121
|
-
return this.transformCompletion(item, range);
|
|
122
|
-
},
|
|
123
|
-
);
|
|
124
|
-
|
|
125
|
-
if (Array.isArray(result)) {
|
|
126
|
-
return { suggestions };
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return {
|
|
130
|
-
incomplete: result.isIncomplete,
|
|
131
|
-
suggestions,
|
|
132
|
-
};
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
resolveCompletionItem = async (
|
|
136
|
-
item: monaco.languages.CompletionItem,
|
|
137
|
-
token: monaco.CancellationToken,
|
|
138
|
-
): Promise<monaco.languages.CompletionItem | undefined> => {
|
|
139
|
-
const original = (item as any).__original as lsp.CompletionItem | undefined;
|
|
140
|
-
if (!original) {
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
const lspConnection = await this.getLSPConnection();
|
|
144
|
-
const itemResult =
|
|
145
|
-
await lspConnection.clientRequests['completionItem/resolve'].request(original);
|
|
146
|
-
if (token.isCancellationRequested) {
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
const resolve = this.transformCompletion(itemResult, item.range);
|
|
150
|
-
return resolve;
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
transformCompletion(
|
|
154
|
-
item: lsp.CompletionItem,
|
|
155
|
-
range: monaco.IRange | monaco.languages.CompletionItemRanges,
|
|
156
|
-
): monaco.languages.CompletionItem {
|
|
157
|
-
const converted: monaco.languages.CompletionItem = {
|
|
158
|
-
...item,
|
|
159
|
-
label: item.label,
|
|
160
|
-
sortText: item.sortText,
|
|
161
|
-
filterText: item.filterText,
|
|
162
|
-
insertText: item.insertText ? item.insertText : item.label,
|
|
163
|
-
kind: CompletionItemKind.from(item.kind ?? lsp.CompletionItemKind.Property),
|
|
164
|
-
detail: item.detail,
|
|
165
|
-
documentation: item.documentation,
|
|
166
|
-
command: item.command
|
|
167
|
-
? {
|
|
168
|
-
id: item.command.command,
|
|
169
|
-
title: item.command.title,
|
|
170
|
-
arguments: item.command?.arguments,
|
|
171
|
-
}
|
|
172
|
-
: undefined,
|
|
173
|
-
range,
|
|
174
|
-
additionalTextEdits: undefined,
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
// FIXME: text edit 生成的range有可能在其他的editor上,这里似乎无法处理
|
|
178
|
-
if (item.textEdit) {
|
|
179
|
-
converted.insertText = item.textEdit.newText;
|
|
180
|
-
if (InsertReplaceEdit.is(item.textEdit)) {
|
|
181
|
-
converted.range = {
|
|
182
|
-
insert: convertRange(item.textEdit.insert),
|
|
183
|
-
replace: convertRange(item.textEdit.replace),
|
|
184
|
-
};
|
|
185
|
-
} else {
|
|
186
|
-
converted.range = convertRange(item.textEdit.range);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
if (item.additionalTextEdits) {
|
|
191
|
-
converted.additionalTextEdits = item.additionalTextEdits.map((edit) => {
|
|
192
|
-
return {
|
|
193
|
-
range: convertRange(edit.range),
|
|
194
|
-
text: edit.newText,
|
|
195
|
-
};
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Stash a few additional pieces of information.
|
|
200
|
-
(converted as any).__original = item;
|
|
201
|
-
|
|
202
|
-
return converted;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
function convertRange(range: lsp.Range): monaco.IRange {
|
|
207
|
-
return {
|
|
208
|
-
startLineNumber: range.start.line + 1,
|
|
209
|
-
startColumn: range.start.character + 1,
|
|
210
|
-
endLineNumber: range.end.line + 1,
|
|
211
|
-
endColumn: range.end.character + 1,
|
|
212
|
-
};
|
|
213
|
-
}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import type { LibroService } from '@difizen/libro-core';
|
|
2
|
-
import { EditorCellView } from '@difizen/libro-core';
|
|
3
|
-
import type { ILSPDocumentConnectionManager } from '@difizen/libro-lsp';
|
|
4
|
-
import { DisposableCollection } from '@difizen/mana-app';
|
|
5
|
-
import type { Disposable } from '@difizen/mana-app';
|
|
6
|
-
import * as monaco from '@difizen/monaco-editor-core';
|
|
7
|
-
|
|
8
|
-
import { LibroE2Editor } from '../../libro-e2-editor.js';
|
|
9
|
-
import { MonacoRange, MonacoUri } from '../../types.js';
|
|
10
|
-
|
|
11
|
-
import { LangaugeFeatureProvider } from './language-feature-provider.js';
|
|
12
|
-
|
|
13
|
-
export enum MarkerSeverity {
|
|
14
|
-
Hint = 1,
|
|
15
|
-
Info = 2,
|
|
16
|
-
Warning = 4,
|
|
17
|
-
Error = 8,
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const vererityMap = {
|
|
21
|
-
1: MarkerSeverity.Error,
|
|
22
|
-
2: MarkerSeverity.Warning,
|
|
23
|
-
3: MarkerSeverity.Info,
|
|
24
|
-
4: MarkerSeverity.Hint,
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export class DiagnosticProvider extends LangaugeFeatureProvider implements Disposable {
|
|
28
|
-
protected toDispose = new DisposableCollection();
|
|
29
|
-
constructor(
|
|
30
|
-
libroService: LibroService,
|
|
31
|
-
lspDocumentConnectionManager: ILSPDocumentConnectionManager,
|
|
32
|
-
) {
|
|
33
|
-
super(libroService, lspDocumentConnectionManager);
|
|
34
|
-
this.processDiagnostic();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
protected diagnosticList: {
|
|
38
|
-
model: monaco.editor.ITextModel;
|
|
39
|
-
markers: monaco.editor.IMarkerData[];
|
|
40
|
-
}[] = [];
|
|
41
|
-
|
|
42
|
-
protected addDiagnostic(
|
|
43
|
-
model: monaco.editor.ITextModel,
|
|
44
|
-
marker: monaco.editor.IMarkerData,
|
|
45
|
-
) {
|
|
46
|
-
if (
|
|
47
|
-
!this.diagnosticList.some((d) => d.model.uri.toString() === model.uri.toString())
|
|
48
|
-
) {
|
|
49
|
-
this.diagnosticList.push({
|
|
50
|
-
model,
|
|
51
|
-
markers: [marker],
|
|
52
|
-
});
|
|
53
|
-
} else {
|
|
54
|
-
this.diagnosticList
|
|
55
|
-
.find((d) => d.model.uri.toString() === model.uri.toString())
|
|
56
|
-
?.markers.push(marker);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
protected clearDiagnostic() {
|
|
61
|
-
this.libroService.active?.model.cells.forEach((item) => {
|
|
62
|
-
if (EditorCellView.is(item)) {
|
|
63
|
-
if (item.editor instanceof LibroE2Editor) {
|
|
64
|
-
const model = item.editor.monacoEditor?.getModel();
|
|
65
|
-
if (model) {
|
|
66
|
-
monaco.editor.setModelMarkers(model, 'libro-e2', []);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
protected displayDiagnostic() {
|
|
74
|
-
this.clearDiagnostic();
|
|
75
|
-
this.diagnosticList.forEach((d) => {
|
|
76
|
-
monaco.editor.setModelMarkers(d.model, 'libro-e2', d.markers);
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
async processDiagnostic() {
|
|
81
|
-
const lspConnection = await this.getLSPConnection();
|
|
82
|
-
const toDispose = lspConnection.serverNotifications[
|
|
83
|
-
'textDocument/publishDiagnostics'
|
|
84
|
-
].event(async (e) => {
|
|
85
|
-
this.diagnosticList = [];
|
|
86
|
-
await Promise.all(
|
|
87
|
-
e.diagnostics.map(async (diagnostic) => {
|
|
88
|
-
const { range } = diagnostic;
|
|
89
|
-
// the diagnostic range must be in current editor
|
|
90
|
-
const editor = await this.getEditorFromLSPPosition(range);
|
|
91
|
-
if (!editor || editor.getOption('lspEnabled') !== true) {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
const model = editor?.monacoEditor?.getModel();
|
|
95
|
-
if (!model) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const virtualDocument = await this.getVirtualDocument();
|
|
100
|
-
if (!virtualDocument) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const editorStart = virtualDocument.transformVirtualToEditor({
|
|
105
|
-
line: range.start.line,
|
|
106
|
-
ch: range.start.character,
|
|
107
|
-
isVirtual: true,
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
const editorEnd = virtualDocument.transformVirtualToEditor({
|
|
111
|
-
line: range.end.line,
|
|
112
|
-
ch: range.end.character,
|
|
113
|
-
isVirtual: true,
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
if (!editorStart || !editorEnd) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const markerRange = new MonacoRange(
|
|
121
|
-
editorStart.line + 1,
|
|
122
|
-
editorStart.ch,
|
|
123
|
-
editorEnd.line + 1,
|
|
124
|
-
editorEnd.ch,
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
const marker: monaco.editor.IMarkerData = {
|
|
128
|
-
source: diagnostic.source,
|
|
129
|
-
tags: diagnostic.tags,
|
|
130
|
-
message: diagnostic.message,
|
|
131
|
-
code: String(diagnostic.code),
|
|
132
|
-
severity: diagnostic.severity
|
|
133
|
-
? vererityMap[diagnostic.severity]
|
|
134
|
-
: monaco.MarkerSeverity.Info,
|
|
135
|
-
relatedInformation: diagnostic.relatedInformation?.map((item) => {
|
|
136
|
-
return {
|
|
137
|
-
message: item.message,
|
|
138
|
-
resource: MonacoUri.parse(item.location.uri),
|
|
139
|
-
startLineNumber: markerRange.startLineNumber,
|
|
140
|
-
startColumn: markerRange.startColumn,
|
|
141
|
-
endLineNumber: markerRange.endLineNumber,
|
|
142
|
-
endColumn: markerRange.endColumn,
|
|
143
|
-
};
|
|
144
|
-
}),
|
|
145
|
-
startLineNumber: editorStart.line + 1,
|
|
146
|
-
startColumn: editorStart.ch + 1,
|
|
147
|
-
endLineNumber: editorEnd.line + 1,
|
|
148
|
-
endColumn: editorEnd.ch + 1,
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
this.addDiagnostic(model, marker);
|
|
152
|
-
}),
|
|
153
|
-
);
|
|
154
|
-
|
|
155
|
-
this.displayDiagnostic();
|
|
156
|
-
});
|
|
157
|
-
this.toDispose.push(toDispose);
|
|
158
|
-
}
|
|
159
|
-
disposed = false;
|
|
160
|
-
dispose() {
|
|
161
|
-
if (this.disposed) {
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
this.toDispose.dispose();
|
|
165
|
-
this.clearDiagnostic();
|
|
166
|
-
this.disposed = true;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import type monaco from '@difizen/monaco-editor-core';
|
|
2
|
-
|
|
3
|
-
import { LangaugeFeatureProvider } from './language-feature-provider.js';
|
|
4
|
-
|
|
5
|
-
export class FormatProvider
|
|
6
|
-
extends LangaugeFeatureProvider
|
|
7
|
-
implements
|
|
8
|
-
monaco.languages.DocumentFormattingEditProvider,
|
|
9
|
-
monaco.languages.DocumentRangeFormattingEditProvider
|
|
10
|
-
{
|
|
11
|
-
displayName = 'libro-e2-format';
|
|
12
|
-
|
|
13
|
-
provideDocumentRangeFormattingEdits = async (
|
|
14
|
-
model: monaco.editor.ITextModel,
|
|
15
|
-
range: monaco.Range,
|
|
16
|
-
options: monaco.languages.FormattingOptions,
|
|
17
|
-
token: monaco.CancellationToken,
|
|
18
|
-
): Promise<monaco.languages.TextEdit[]> => {
|
|
19
|
-
return this.formatDocumentByRange(model, range, options, token);
|
|
20
|
-
};
|
|
21
|
-
provideDocumentFormattingEdits = async (
|
|
22
|
-
model: monaco.editor.ITextModel,
|
|
23
|
-
options: monaco.languages.FormattingOptions,
|
|
24
|
-
token: monaco.CancellationToken,
|
|
25
|
-
): Promise<monaco.languages.TextEdit[]> => {
|
|
26
|
-
return this.formatDocumentByRange(model, model.getFullModelRange(), options, token);
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
formatDocumentByRange = async (
|
|
30
|
-
model: monaco.editor.ITextModel,
|
|
31
|
-
range: monaco.Range,
|
|
32
|
-
options: monaco.languages.FormattingOptions,
|
|
33
|
-
token: monaco.CancellationToken,
|
|
34
|
-
): Promise<monaco.languages.TextEdit[]> => {
|
|
35
|
-
const provider = await this.getProvider(model);
|
|
36
|
-
if (!provider) {
|
|
37
|
-
return [];
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const { virtualDocument: doc } = provider;
|
|
41
|
-
const lspConnection = await this.getLSPConnection();
|
|
42
|
-
const result = await lspConnection.clientRequests[
|
|
43
|
-
'textDocument/rangeFormatting'
|
|
44
|
-
].request({
|
|
45
|
-
// TODO: range transform
|
|
46
|
-
// TODO: pyright-extend supoport range format
|
|
47
|
-
range: {
|
|
48
|
-
start: {
|
|
49
|
-
line: range.startLineNumber - 1,
|
|
50
|
-
character: range.startColumn - 1,
|
|
51
|
-
},
|
|
52
|
-
end: {
|
|
53
|
-
line: range.endLineNumber - 1,
|
|
54
|
-
character: range.endColumn - 1,
|
|
55
|
-
},
|
|
56
|
-
},
|
|
57
|
-
textDocument: {
|
|
58
|
-
uri: doc.documentInfo.uri,
|
|
59
|
-
},
|
|
60
|
-
options: {
|
|
61
|
-
insertSpaces: options.insertSpaces,
|
|
62
|
-
tabSize: options.tabSize,
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
if (token.isCancellationRequested) {
|
|
67
|
-
return [];
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (!result) {
|
|
71
|
-
return [];
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const edits: monaco.languages.TextEdit[] = result.map((item) => {
|
|
75
|
-
return {
|
|
76
|
-
range: {
|
|
77
|
-
startColumn: item.range.start.character + 1,
|
|
78
|
-
startLineNumber: item.range.start.line + 1,
|
|
79
|
-
endColumn: item.range.end.character + 1,
|
|
80
|
-
endLineNumber: item.range.end.line + 1,
|
|
81
|
-
},
|
|
82
|
-
text: item.newText,
|
|
83
|
-
};
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
return edits;
|
|
87
|
-
};
|
|
88
|
-
}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import type monaco from '@difizen/monaco-editor-core';
|
|
2
|
-
import type * as lsp from 'vscode-languageserver-protocol';
|
|
3
|
-
|
|
4
|
-
import { MonacoRange } from '../../types.js';
|
|
5
|
-
|
|
6
|
-
import { LangaugeFeatureProvider } from './language-feature-provider.js';
|
|
7
|
-
|
|
8
|
-
export class HoverProvider
|
|
9
|
-
extends LangaugeFeatureProvider
|
|
10
|
-
implements monaco.languages.HoverProvider
|
|
11
|
-
{
|
|
12
|
-
provideHover = async (
|
|
13
|
-
model: monaco.editor.ITextModel,
|
|
14
|
-
position: monaco.Position,
|
|
15
|
-
token: monaco.CancellationToken,
|
|
16
|
-
): Promise<monaco.languages.Hover | undefined> => {
|
|
17
|
-
const editor = this.getEditorByModel(model);
|
|
18
|
-
if (!editor || editor.getOption('lspEnabled') !== true) {
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
const provider = await this.getProvider(model);
|
|
22
|
-
if (!provider) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const { lspConnection, editor: docEditor, virtualDocument: doc } = provider;
|
|
27
|
-
|
|
28
|
-
const virtualPos = doc.transformEditorToVirtual(docEditor, {
|
|
29
|
-
line: position.lineNumber - 1, // lsp is zero based, monaco is one based
|
|
30
|
-
ch: position.column,
|
|
31
|
-
isEditor: true,
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
if (!virtualPos) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const result = await lspConnection.clientRequests['textDocument/hover'].request({
|
|
39
|
-
position: { line: virtualPos.line, character: virtualPos.ch },
|
|
40
|
-
textDocument: {
|
|
41
|
-
uri: doc.documentInfo.uri,
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
if (!result) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const { contents, range } = result;
|
|
50
|
-
|
|
51
|
-
const resultContents = [{ value: formatContents(contents) }];
|
|
52
|
-
|
|
53
|
-
let resultRange: monaco.Range | undefined;
|
|
54
|
-
|
|
55
|
-
if (range) {
|
|
56
|
-
const editorStart = doc.transformVirtualToEditor({
|
|
57
|
-
line: range.start.line,
|
|
58
|
-
ch: range.start.character,
|
|
59
|
-
isVirtual: true,
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
const editorEnd = doc.transformVirtualToEditor({
|
|
63
|
-
line: range.end.line,
|
|
64
|
-
ch: range.end.character,
|
|
65
|
-
isVirtual: true,
|
|
66
|
-
});
|
|
67
|
-
if (editorStart && editorEnd) {
|
|
68
|
-
resultRange = new MonacoRange(
|
|
69
|
-
editorStart.line + 1,
|
|
70
|
-
editorStart.ch + 1,
|
|
71
|
-
editorEnd.line + 1,
|
|
72
|
-
editorEnd.ch + 1,
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (token.isCancellationRequested) {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
contents: resultContents,
|
|
83
|
-
range: resultRange,
|
|
84
|
-
};
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function formatContents(
|
|
89
|
-
contents: lsp.MarkupContent | lsp.MarkedString | lsp.MarkedString[],
|
|
90
|
-
): string {
|
|
91
|
-
if (Array.isArray(contents)) {
|
|
92
|
-
return contents.map((c) => formatContents(c) + '\n\n').join('');
|
|
93
|
-
} else if (typeof contents === 'string') {
|
|
94
|
-
return contents;
|
|
95
|
-
} else {
|
|
96
|
-
return contents.value;
|
|
97
|
-
}
|
|
98
|
-
}
|