@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.
Files changed (53) hide show
  1. package/es/editor-contribution.d.ts.map +1 -1
  2. package/es/editor-contribution.js +2 -1
  3. package/es/language/python/data/snippets/python.snippets.json +0 -30
  4. package/es/libro-e2-editor.d.ts +5 -5
  5. package/es/libro-e2-editor.d.ts.map +1 -1
  6. package/es/libro-e2-editor.js +68 -65
  7. package/es/libro-e2-preload.d.ts.map +1 -1
  8. package/es/libro-e2-preload.js +1 -3
  9. package/package.json +7 -7
  10. package/src/editor-contribution.ts +2 -5
  11. package/src/language/python/data/snippets/python.snippets.json +0 -30
  12. package/src/libro-e2-editor.ts +55 -39
  13. package/src/libro-e2-preload.ts +0 -2
  14. package/es/language/lsp/completion-provider.d.ts +0 -13
  15. package/es/language/lsp/completion-provider.d.ts.map +0 -1
  16. package/es/language/lsp/completion-provider.js +0 -294
  17. package/es/language/lsp/diagnostic-provider.d.ts +0 -27
  18. package/es/language/lsp/diagnostic-provider.d.ts.map +0 -1
  19. package/es/language/lsp/diagnostic-provider.js +0 -230
  20. package/es/language/lsp/format-provider.d.ts +0 -9
  21. package/es/language/lsp/format-provider.d.ts.map +0 -1
  22. package/es/language/lsp/format-provider.js +0 -143
  23. package/es/language/lsp/hover-provider.d.ts +0 -8
  24. package/es/language/lsp/hover-provider.d.ts.map +0 -1
  25. package/es/language/lsp/hover-provider.js +0 -136
  26. package/es/language/lsp/language-feature-provider.d.ts +0 -22
  27. package/es/language/lsp/language-feature-provider.d.ts.map +0 -1
  28. package/es/language/lsp/language-feature-provider.js +0 -194
  29. package/es/language/lsp/lsp-contribution.d.ts +0 -22
  30. package/es/language/lsp/lsp-contribution.d.ts.map +0 -1
  31. package/es/language/lsp/lsp-contribution.js +0 -135
  32. package/es/language/lsp/module.d.ts +0 -2
  33. package/es/language/lsp/module.d.ts.map +0 -1
  34. package/es/language/lsp/module.js +0 -3
  35. package/es/language/lsp/semantic-highlight-provider.d.ts +0 -9
  36. package/es/language/lsp/semantic-highlight-provider.d.ts.map +0 -1
  37. package/es/language/lsp/semantic-highlight-provider.js +0 -41
  38. package/es/language/lsp/signature-help-provider.d.ts +0 -8
  39. package/es/language/lsp/signature-help-provider.d.ts.map +0 -1
  40. package/es/language/lsp/signature-help-provider.js +0 -108
  41. package/es/language/lsp/type-concerters.d.ts +0 -7
  42. package/es/language/lsp/type-concerters.d.ts.map +0 -1
  43. package/es/language/lsp/type-concerters.js +0 -35
  44. package/src/language/lsp/completion-provider.ts +0 -213
  45. package/src/language/lsp/diagnostic-provider.ts +0 -168
  46. package/src/language/lsp/format-provider.ts +0 -88
  47. package/src/language/lsp/hover-provider.ts +0 -98
  48. package/src/language/lsp/language-feature-provider.ts +0 -107
  49. package/src/language/lsp/lsp-contribution.ts +0 -129
  50. package/src/language/lsp/module.ts +0 -5
  51. package/src/language/lsp/semantic-highlight-provider.ts +0 -26
  52. package/src/language/lsp/signature-help-provider.ts +0 -65
  53. 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
- }