@kerebron/extension-lsp 0.8.5 → 0.8.6
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/esm/ExtensionLsp.d.ts +1 -7
- package/esm/ExtensionLsp.d.ts.map +1 -1
- package/esm/ExtensionLsp.js +62 -79
- package/esm/ExtensionLsp.js.map +1 -1
- package/esm/LSPClient.d.ts +60 -15
- package/esm/LSPClient.d.ts.map +1 -1
- package/esm/LSPClient.js +91 -40
- package/esm/LSPClient.js.map +1 -1
- package/esm/LSPPlugin.d.ts +6 -35
- package/esm/LSPPlugin.d.ts.map +1 -1
- package/esm/LSPPlugin.js +40 -165
- package/esm/LSPPlugin.js.map +1 -1
- package/esm/LSPSync.d.ts +28 -0
- package/esm/LSPSync.d.ts.map +1 -0
- package/esm/LSPSync.js +111 -0
- package/esm/LSPSync.js.map +1 -0
- package/esm/computeIncrementalChanges.d.ts +1 -0
- package/esm/computeIncrementalChanges.d.ts.map +1 -1
- package/esm/computeIncrementalChanges.js +11 -0
- package/esm/computeIncrementalChanges.js.map +1 -1
- package/esm/mod.d.ts +0 -1
- package/esm/mod.d.ts.map +1 -1
- package/esm/mod.js +0 -1
- package/esm/mod.js.map +1 -1
- package/package.json +4 -7
- package/src/ExtensionLsp.ts +91 -94
- package/src/LSPClient.ts +217 -54
- package/src/LSPPlugin.ts +59 -292
- package/src/LSPSync.ts +169 -0
- package/src/computeIncrementalChanges.ts +17 -0
- package/src/mod.ts +0 -1
- package/esm/LSPWorkspace.d.ts +0 -39
- package/esm/LSPWorkspace.d.ts.map +0 -1
- package/esm/LSPWorkspace.js +0 -118
- package/esm/LSPWorkspace.js.map +0 -1
- package/esm/createLspAutocomplete.d.ts +0 -17
- package/esm/createLspAutocomplete.d.ts.map +0 -1
- package/esm/createLspAutocomplete.js +0 -68
- package/esm/createLspAutocomplete.js.map +0 -1
- package/esm/types.d.ts +0 -19
- package/esm/types.d.ts.map +0 -1
- package/esm/types.js +0 -2
- package/esm/types.js.map +0 -1
- package/esm/workspace.d.ts +0 -33
- package/esm/workspace.d.ts.map +0 -1
- package/esm/workspace.js +0 -23
- package/esm/workspace.js.map +0 -1
- package/src/LSPWorkspace.ts +0 -172
- package/src/createLspAutocomplete.ts +0 -98
- package/src/types.ts +0 -14
- package/src/workspace.ts +0 -53
package/esm/LSPWorkspace.js
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { TextDocumentSyncKind } from 'vscode-languageserver-protocol';
|
|
2
|
-
import { Workspace } from './workspace.js';
|
|
3
|
-
import { computeIncrementalChanges } from './computeIncrementalChanges.js';
|
|
4
|
-
class LSPWorkspaceFile {
|
|
5
|
-
uri;
|
|
6
|
-
languageId;
|
|
7
|
-
version;
|
|
8
|
-
content;
|
|
9
|
-
mapper;
|
|
10
|
-
source;
|
|
11
|
-
syncedContent = '';
|
|
12
|
-
diagnostics = [];
|
|
13
|
-
constructor(uri, languageId, version, content, mapper, source) {
|
|
14
|
-
this.uri = uri;
|
|
15
|
-
this.languageId = languageId;
|
|
16
|
-
this.version = version;
|
|
17
|
-
this.content = content;
|
|
18
|
-
this.mapper = mapper;
|
|
19
|
-
this.source = source;
|
|
20
|
-
}
|
|
21
|
-
getUi() {
|
|
22
|
-
return this.source.ui;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
export class LSPWorkspace extends Workspace {
|
|
26
|
-
client;
|
|
27
|
-
files = [];
|
|
28
|
-
fileVersions = Object.create(null);
|
|
29
|
-
constructor(client) {
|
|
30
|
-
super();
|
|
31
|
-
this.client = client;
|
|
32
|
-
}
|
|
33
|
-
nextFileVersion(uri) {
|
|
34
|
-
return this.fileVersions[uri] = (this.fileVersions[uri] ?? -1) + 1;
|
|
35
|
-
}
|
|
36
|
-
async connected() {
|
|
37
|
-
super.connected();
|
|
38
|
-
for await (const file of this.files) {
|
|
39
|
-
const result = await this.client.didOpen(file);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
disconnected() {
|
|
43
|
-
for (const file of this.files) {
|
|
44
|
-
this.client.workspace.closeFile(file.uri);
|
|
45
|
-
}
|
|
46
|
-
super.disconnected();
|
|
47
|
-
}
|
|
48
|
-
syncFiles() {
|
|
49
|
-
if (!this.client.supportSync) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
for (const file of this.files) {
|
|
53
|
-
this.changedFile(file.uri);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
async changedFile(uri) {
|
|
57
|
-
const file = this.files.find((f) => f.uri == uri) || null;
|
|
58
|
-
if (file) {
|
|
59
|
-
const { content, mapper } = await file.source.getMappedContent();
|
|
60
|
-
if (!this.isConnected) {
|
|
61
|
-
file.content = content;
|
|
62
|
-
file.mapper = mapper;
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
if (await this.client.notification('textDocument/didChange', {
|
|
66
|
-
textDocument: { uri: file.uri, version: file.version },
|
|
67
|
-
contentChanges: contentChangesFor(file, content, mapper, this.client.supportSync == TextDocumentSyncKind.Incremental),
|
|
68
|
-
})) {
|
|
69
|
-
file.syncedContent = file.content;
|
|
70
|
-
file.content = content;
|
|
71
|
-
file.mapper = mapper;
|
|
72
|
-
file.version = this.nextFileVersion(file.uri);
|
|
73
|
-
file.diagnostics = [];
|
|
74
|
-
this.dispatchEvent(new CustomEvent('fileChanged', {
|
|
75
|
-
detail: {
|
|
76
|
-
uri: file.uri,
|
|
77
|
-
file,
|
|
78
|
-
},
|
|
79
|
-
}));
|
|
80
|
-
}
|
|
81
|
-
await this.client.notification('textDocument/diagnostic', {
|
|
82
|
-
textDocument: {
|
|
83
|
-
uri: file.uri,
|
|
84
|
-
},
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
async openFile(uri, languageId, source) {
|
|
89
|
-
// if (uri) {}
|
|
90
|
-
if (this.getFile(uri)) {
|
|
91
|
-
this.closeFile(uri);
|
|
92
|
-
}
|
|
93
|
-
const mappedContent = await source.getMappedContent();
|
|
94
|
-
const { content, mapper } = mappedContent;
|
|
95
|
-
const file = new LSPWorkspaceFile(uri, languageId, this.nextFileVersion(uri), content, mapper, source);
|
|
96
|
-
this.files.push(file);
|
|
97
|
-
this.client.didOpen(file);
|
|
98
|
-
}
|
|
99
|
-
closeFile(uri) {
|
|
100
|
-
const file = this.getFile(uri);
|
|
101
|
-
if (file) {
|
|
102
|
-
this.files = this.files.filter((f) => f.uri !== uri);
|
|
103
|
-
this.client.didClose(uri);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
var Sync;
|
|
108
|
-
(function (Sync) {
|
|
109
|
-
Sync[Sync["AlwaysIfSmaller"] = 1024] = "AlwaysIfSmaller";
|
|
110
|
-
})(Sync || (Sync = {}));
|
|
111
|
-
function contentChangesFor(file, newContent, mapper, supportInc) {
|
|
112
|
-
if (!supportInc || newContent.length < Sync.AlwaysIfSmaller) {
|
|
113
|
-
return [{ text: newContent }];
|
|
114
|
-
}
|
|
115
|
-
const changes = computeIncrementalChanges(file.content, newContent);
|
|
116
|
-
return changes.reverse();
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=LSPWorkspace.js.map
|
package/esm/LSPWorkspace.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LSPWorkspace.js","sourceRoot":"","sources":["../src/LSPWorkspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { DefaultRenderer } from '@kerebron/extension-ui/autocomplete/DefaultRenderer';
|
|
2
|
-
import { AutocompleteConfig } from '@kerebron/extension-ui/autocomplete';
|
|
3
|
-
import { ExtensionLsp } from './ExtensionLsp.js';
|
|
4
|
-
interface CompletionItem {
|
|
5
|
-
label: string;
|
|
6
|
-
detail: string;
|
|
7
|
-
insertText: string;
|
|
8
|
-
}
|
|
9
|
-
export declare class CustomRenderer extends DefaultRenderer<CompletionItem> {
|
|
10
|
-
createListItem(item: CompletionItem, cnt: number): any;
|
|
11
|
-
}
|
|
12
|
-
export declare function cleanPlaceholders(input: string): string;
|
|
13
|
-
export declare function createLspAutocomplete(extensionLsp: ExtensionLsp): {
|
|
14
|
-
autocompleteConfig: AutocompleteConfig;
|
|
15
|
-
};
|
|
16
|
-
export {};
|
|
17
|
-
//# sourceMappingURL=createLspAutocomplete.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createLspAutocomplete.d.ts","sourceRoot":"","sources":["../src/createLspAutocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qDAAqD,CAAC;AAGtF,OAAO,EACL,kBAAkB,EAGnB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAe,SAAQ,eAAe,CAAC,cAAc,CAAC;IACxD,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM;CAa1D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,YAAY,GACzB;IAAE,kBAAkB,EAAE,kBAAkB,CAAA;CAAE,CAyD5C"}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { DefaultRenderer } from '@kerebron/extension-ui/autocomplete/DefaultRenderer';
|
|
2
|
-
export class CustomRenderer extends DefaultRenderer {
|
|
3
|
-
createListItem(item, cnt) {
|
|
4
|
-
const li = document.createElement('li');
|
|
5
|
-
if (cnt === this.pos) {
|
|
6
|
-
li.classList.add('active');
|
|
7
|
-
}
|
|
8
|
-
li.innerText = item.label;
|
|
9
|
-
li.title = item.detail;
|
|
10
|
-
li.style.cursor = 'pointer';
|
|
11
|
-
li.addEventListener('click', () => {
|
|
12
|
-
this.command(item);
|
|
13
|
-
});
|
|
14
|
-
return li;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
export function cleanPlaceholders(input) {
|
|
18
|
-
const regex = /\$\{\d+:([^}]+)}/g;
|
|
19
|
-
return input.replace(regex, '$1');
|
|
20
|
-
}
|
|
21
|
-
export function createLspAutocomplete(extensionLsp) {
|
|
22
|
-
const editor = extensionLsp.getEditor();
|
|
23
|
-
const renderer = new CustomRenderer(editor);
|
|
24
|
-
const config = {
|
|
25
|
-
// renderer,
|
|
26
|
-
// matchers: [createRegexMatcher([/\w+/, /(^|\s)@\w*/, /^#\w*/])],
|
|
27
|
-
getItems: async (query, props) => {
|
|
28
|
-
const { mapper } = await extensionLsp.source.getMappedContent();
|
|
29
|
-
const lspPos = mapper.toRawTextLspPos(props.range.from);
|
|
30
|
-
const client = extensionLsp.getClient(extensionLsp.mainLang);
|
|
31
|
-
if (client) {
|
|
32
|
-
client.syncFiles();
|
|
33
|
-
try {
|
|
34
|
-
const completions = await client.request('textDocument/completion', {
|
|
35
|
-
textDocument: { uri: extensionLsp.uri },
|
|
36
|
-
position: lspPos,
|
|
37
|
-
context: { triggerKind: 2, triggerCharacter: query },
|
|
38
|
-
});
|
|
39
|
-
if (Array.isArray(completions)) {
|
|
40
|
-
return completions;
|
|
41
|
-
}
|
|
42
|
-
return completions.items;
|
|
43
|
-
}
|
|
44
|
-
catch (err) {
|
|
45
|
-
console.error(err.message);
|
|
46
|
-
return [];
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
return [];
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
onSelect: async (selected, range) => {
|
|
54
|
-
const rawText = cleanPlaceholders(selected.insertText);
|
|
55
|
-
const slice = await extensionLsp.extensionMarkdown.fromMarkdown(rawText);
|
|
56
|
-
if (slice.content.content.length === 1) {
|
|
57
|
-
const first = slice.content.content[0];
|
|
58
|
-
if (first.isBlock) {
|
|
59
|
-
editor.chain().insertBlockSmart(range.from, first).run();
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
editor.chain().replaceRangeSlice(range, slice).run();
|
|
64
|
-
},
|
|
65
|
-
};
|
|
66
|
-
return { autocompleteConfig: config };
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=createLspAutocomplete.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createLspAutocomplete.js","sourceRoot":"","sources":["../src/createLspAutocomplete.ts"],"names":[],"mappings":"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"}
|
package/esm/types.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export type LspPosition = {
|
|
2
|
-
line: number;
|
|
3
|
-
character: number;
|
|
4
|
-
};
|
|
5
|
-
export type LspRange = {
|
|
6
|
-
start: LspPosition;
|
|
7
|
-
end: LspPosition;
|
|
8
|
-
};
|
|
9
|
-
export interface Diagnostic {
|
|
10
|
-
range: LspRange;
|
|
11
|
-
severity?: number;
|
|
12
|
-
source?: string;
|
|
13
|
-
message: string;
|
|
14
|
-
}
|
|
15
|
-
export interface PublishDiagnosticsParams {
|
|
16
|
-
uri: string;
|
|
17
|
-
diagnostics: Diagnostic[];
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=types.d.ts.map
|
package/esm/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9D,MAAM,MAAM,QAAQ,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,WAAW,CAAA;CAAE,CAAC;AAEhE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,QAAQ,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B"}
|
package/esm/types.js
DELETED
package/esm/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/esm/workspace.d.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { EditorUi } from '@kerebron/editor';
|
|
2
|
-
import { PositionMapper } from '@kerebron/extension-markdown/PositionMapper';
|
|
3
|
-
export interface LSPSource {
|
|
4
|
-
ui: EditorUi;
|
|
5
|
-
getMappedContent(): Promise<{
|
|
6
|
-
content: string;
|
|
7
|
-
mapper: PositionMapper;
|
|
8
|
-
}>;
|
|
9
|
-
}
|
|
10
|
-
export interface WorkspaceFile {
|
|
11
|
-
uri: string;
|
|
12
|
-
languageId: string;
|
|
13
|
-
version: number;
|
|
14
|
-
content: string;
|
|
15
|
-
source: LSPSource;
|
|
16
|
-
getUi(): EditorUi | undefined;
|
|
17
|
-
mapper: PositionMapper;
|
|
18
|
-
}
|
|
19
|
-
export declare abstract class Workspace extends EventTarget {
|
|
20
|
-
abstract files: WorkspaceFile[];
|
|
21
|
-
protected isConnected: boolean;
|
|
22
|
-
constructor();
|
|
23
|
-
getFile(uri: string): WorkspaceFile | null;
|
|
24
|
-
abstract syncFiles(): void;
|
|
25
|
-
requestFile(uri: string): Promise<WorkspaceFile | null>;
|
|
26
|
-
abstract openFile(uri: string, languageId: string, source: LSPSource): void;
|
|
27
|
-
abstract changedFile(uri: string): void;
|
|
28
|
-
abstract closeFile(uri: string): void;
|
|
29
|
-
connected(): Promise<void>;
|
|
30
|
-
disconnected(): void;
|
|
31
|
-
getUi(uri: string): Promise<EditorUi | undefined>;
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=workspace.d.ts.map
|
package/esm/workspace.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAE7E,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,QAAQ,CAAC;IACb,gBAAgB,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;CAC1E;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,IAAI,QAAQ,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,8BAAsB,SAAU,SAAQ,WAAW;IACjD,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC;IAChC,SAAS,CAAC,WAAW,UAAS;;IAM9B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAI1C,QAAQ,CAAC,SAAS,IAAI,IAAI;IAE1B,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIvD,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI;IAC3E,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IACvC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAE/B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,YAAY,IAAI,IAAI;IAIpB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;CAIlD"}
|
package/esm/workspace.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export class Workspace extends EventTarget {
|
|
2
|
-
isConnected = false;
|
|
3
|
-
constructor() {
|
|
4
|
-
super();
|
|
5
|
-
}
|
|
6
|
-
getFile(uri) {
|
|
7
|
-
return this.files.find((f) => f.uri == uri) || null;
|
|
8
|
-
}
|
|
9
|
-
requestFile(uri) {
|
|
10
|
-
return Promise.resolve(this.getFile(uri));
|
|
11
|
-
}
|
|
12
|
-
async connected() {
|
|
13
|
-
this.isConnected = true;
|
|
14
|
-
}
|
|
15
|
-
disconnected() {
|
|
16
|
-
this.isConnected = false;
|
|
17
|
-
}
|
|
18
|
-
getUi(uri) {
|
|
19
|
-
const file = this.getFile(uri);
|
|
20
|
-
return Promise.resolve(file ? file.getUi() : undefined);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=workspace.js.map
|
package/esm/workspace.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAgB,SAAU,SAAQ,WAAW;IAEvC,WAAW,GAAG,KAAK,CAAC;IAE9B;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC;IACtD,CAAC;IAID,WAAW,CAAC,GAAW;QACrB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IAMD,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,YAAY;QACV,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAW;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;CACF"}
|
package/src/LSPWorkspace.ts
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import type * as lsp from 'vscode-languageserver-protocol';
|
|
2
|
-
import { TextDocumentSyncKind } from 'vscode-languageserver-protocol';
|
|
3
|
-
|
|
4
|
-
import type { EditorUi } from '@kerebron/editor';
|
|
5
|
-
import { Workspace, WorkspaceFile } from './workspace.js';
|
|
6
|
-
|
|
7
|
-
import { PositionMapper } from '@kerebron/extension-markdown/PositionMapper';
|
|
8
|
-
|
|
9
|
-
import { LSPClient } from './LSPClient.js';
|
|
10
|
-
import { computeIncrementalChanges } from './computeIncrementalChanges.js';
|
|
11
|
-
|
|
12
|
-
export interface LSPSource {
|
|
13
|
-
ui: EditorUi;
|
|
14
|
-
getMappedContent(): Promise<{ content: string; mapper: PositionMapper }>;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
class LSPWorkspaceFile implements WorkspaceFile {
|
|
18
|
-
public syncedContent: string = '';
|
|
19
|
-
public diagnostics: Array<lsp.Diagnostic> = [];
|
|
20
|
-
|
|
21
|
-
constructor(
|
|
22
|
-
readonly uri: string,
|
|
23
|
-
readonly languageId: string,
|
|
24
|
-
public version: number,
|
|
25
|
-
public content: string,
|
|
26
|
-
public mapper: PositionMapper,
|
|
27
|
-
public source: LSPSource,
|
|
28
|
-
) {
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
getUi() {
|
|
32
|
-
return this.source.ui;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export class LSPWorkspace extends Workspace {
|
|
37
|
-
files: LSPWorkspaceFile[] = [];
|
|
38
|
-
private fileVersions: { [uri: string]: number } = Object.create(null);
|
|
39
|
-
|
|
40
|
-
constructor(private client: LSPClient) {
|
|
41
|
-
super();
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
nextFileVersion(uri: string) {
|
|
45
|
-
return this.fileVersions[uri] = (this.fileVersions[uri] ?? -1) + 1;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
override async connected(): Promise<void> {
|
|
49
|
-
super.connected();
|
|
50
|
-
for await (const file of this.files) {
|
|
51
|
-
const result = await this.client.didOpen(file);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
override disconnected(): void {
|
|
56
|
-
for (const file of this.files) {
|
|
57
|
-
this.client.workspace.closeFile(file.uri);
|
|
58
|
-
}
|
|
59
|
-
super.disconnected();
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
syncFiles() {
|
|
63
|
-
if (!this.client.supportSync) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
for (const file of this.files) {
|
|
68
|
-
this.changedFile(file.uri);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
async changedFile(uri: string) {
|
|
73
|
-
const file = this.files.find((f) => f.uri == uri) || null;
|
|
74
|
-
|
|
75
|
-
if (file) {
|
|
76
|
-
const { content, mapper } = await file.source.getMappedContent();
|
|
77
|
-
|
|
78
|
-
if (!this.isConnected) {
|
|
79
|
-
file.content = content;
|
|
80
|
-
file.mapper = mapper;
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (
|
|
85
|
-
await this.client.notification<lsp.DidChangeTextDocumentParams>(
|
|
86
|
-
'textDocument/didChange',
|
|
87
|
-
{
|
|
88
|
-
textDocument: { uri: file.uri, version: file.version },
|
|
89
|
-
contentChanges: contentChangesFor(
|
|
90
|
-
file,
|
|
91
|
-
content,
|
|
92
|
-
mapper,
|
|
93
|
-
this.client.supportSync == TextDocumentSyncKind.Incremental,
|
|
94
|
-
),
|
|
95
|
-
},
|
|
96
|
-
)
|
|
97
|
-
) {
|
|
98
|
-
file.syncedContent = file.content;
|
|
99
|
-
file.content = content;
|
|
100
|
-
file.mapper = mapper;
|
|
101
|
-
file.version = this.nextFileVersion(file.uri);
|
|
102
|
-
file.diagnostics = [];
|
|
103
|
-
|
|
104
|
-
this.dispatchEvent(
|
|
105
|
-
new CustomEvent('fileChanged', { // TODO: clear diagnosrics
|
|
106
|
-
detail: {
|
|
107
|
-
uri: file.uri,
|
|
108
|
-
file,
|
|
109
|
-
},
|
|
110
|
-
}),
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
await this.client.notification<lsp.DocumentDiagnosticParams>(
|
|
115
|
-
'textDocument/diagnostic',
|
|
116
|
-
{
|
|
117
|
-
textDocument: {
|
|
118
|
-
uri: file.uri,
|
|
119
|
-
},
|
|
120
|
-
},
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
async openFile(uri: string, languageId: string, source: LSPSource) {
|
|
126
|
-
// if (uri) {}
|
|
127
|
-
|
|
128
|
-
if (this.getFile(uri)) {
|
|
129
|
-
this.closeFile(uri);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const mappedContent = await source.getMappedContent();
|
|
133
|
-
const { content, mapper } = mappedContent;
|
|
134
|
-
const file = new LSPWorkspaceFile(
|
|
135
|
-
uri,
|
|
136
|
-
languageId,
|
|
137
|
-
this.nextFileVersion(uri),
|
|
138
|
-
content,
|
|
139
|
-
mapper,
|
|
140
|
-
source,
|
|
141
|
-
);
|
|
142
|
-
this.files.push(file);
|
|
143
|
-
|
|
144
|
-
this.client.didOpen(file);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
closeFile(uri: string) {
|
|
148
|
-
const file = this.getFile(uri);
|
|
149
|
-
if (file) {
|
|
150
|
-
this.files = this.files.filter((f) => f.uri !== uri);
|
|
151
|
-
this.client.didClose(uri);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
const enum Sync {
|
|
157
|
-
AlwaysIfSmaller = 1024,
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function contentChangesFor(
|
|
161
|
-
file: WorkspaceFile,
|
|
162
|
-
newContent: string,
|
|
163
|
-
mapper: PositionMapper,
|
|
164
|
-
supportInc: boolean,
|
|
165
|
-
): lsp.TextDocumentContentChangeEvent[] {
|
|
166
|
-
if (!supportInc || newContent.length < Sync.AlwaysIfSmaller) {
|
|
167
|
-
return [{ text: newContent }];
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
const changes = computeIncrementalChanges(file.content, newContent);
|
|
171
|
-
return changes.reverse();
|
|
172
|
-
}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { DefaultRenderer } from '@kerebron/extension-ui/autocomplete/DefaultRenderer';
|
|
2
|
-
import { type CoreEditor, TextRange } from '@kerebron/editor';
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
AutocompleteConfig,
|
|
6
|
-
type AutocompleteProps,
|
|
7
|
-
createRegexMatcher,
|
|
8
|
-
} from '@kerebron/extension-ui/autocomplete';
|
|
9
|
-
|
|
10
|
-
import { ExtensionLsp } from './ExtensionLsp.js';
|
|
11
|
-
|
|
12
|
-
interface CompletionItem {
|
|
13
|
-
label: string;
|
|
14
|
-
detail: string;
|
|
15
|
-
insertText: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export class CustomRenderer extends DefaultRenderer<CompletionItem> {
|
|
19
|
-
override createListItem(item: CompletionItem, cnt: number) { // override
|
|
20
|
-
const li = document.createElement('li');
|
|
21
|
-
if (cnt === this.pos) {
|
|
22
|
-
li.classList.add('active');
|
|
23
|
-
}
|
|
24
|
-
li.innerText = item.label;
|
|
25
|
-
li.title = item.detail;
|
|
26
|
-
li.style.cursor = 'pointer';
|
|
27
|
-
li.addEventListener('click', () => {
|
|
28
|
-
this.command(item);
|
|
29
|
-
});
|
|
30
|
-
return li;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function cleanPlaceholders(input: string): string {
|
|
35
|
-
const regex = /\$\{\d+:([^}]+)}/g;
|
|
36
|
-
return input.replace(regex, '$1');
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function createLspAutocomplete(
|
|
40
|
-
extensionLsp: ExtensionLsp,
|
|
41
|
-
): { autocompleteConfig: AutocompleteConfig } {
|
|
42
|
-
const editor: CoreEditor = extensionLsp.getEditor();
|
|
43
|
-
const renderer = new CustomRenderer(editor);
|
|
44
|
-
|
|
45
|
-
const config: AutocompleteConfig = {
|
|
46
|
-
// renderer,
|
|
47
|
-
// matchers: [createRegexMatcher([/\w+/, /(^|\s)@\w*/, /^#\w*/])],
|
|
48
|
-
getItems: async (query: string, props: AutocompleteProps) => {
|
|
49
|
-
const { mapper } = await extensionLsp.source.getMappedContent();
|
|
50
|
-
|
|
51
|
-
const lspPos = mapper.toRawTextLspPos(props.range.from);
|
|
52
|
-
|
|
53
|
-
const client = extensionLsp.getClient(extensionLsp.mainLang);
|
|
54
|
-
if (client) {
|
|
55
|
-
client.syncFiles();
|
|
56
|
-
try {
|
|
57
|
-
const completions:
|
|
58
|
-
| { items: CompletionItem[] }
|
|
59
|
-
| Array<CompletionItem> = await client.request(
|
|
60
|
-
'textDocument/completion',
|
|
61
|
-
{
|
|
62
|
-
textDocument: { uri: extensionLsp.uri },
|
|
63
|
-
position: lspPos,
|
|
64
|
-
context: { triggerKind: 2, triggerCharacter: query },
|
|
65
|
-
},
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
if (Array.isArray(completions)) {
|
|
69
|
-
return completions;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return completions.items;
|
|
73
|
-
} catch (err: any) {
|
|
74
|
-
console.error(err.message);
|
|
75
|
-
return [];
|
|
76
|
-
}
|
|
77
|
-
} else {
|
|
78
|
-
return [];
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
onSelect: async (selected: CompletionItem, range: TextRange) => {
|
|
82
|
-
const rawText = cleanPlaceholders(selected.insertText);
|
|
83
|
-
const slice = await extensionLsp.extensionMarkdown.fromMarkdown(rawText);
|
|
84
|
-
|
|
85
|
-
if (slice.content.content.length === 1) {
|
|
86
|
-
const first = slice.content.content[0];
|
|
87
|
-
if (first.isBlock) {
|
|
88
|
-
editor.chain().insertBlockSmart(range.from, first).run();
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
editor.chain().replaceRangeSlice(range, slice).run();
|
|
94
|
-
},
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
return { autocompleteConfig: config };
|
|
98
|
-
}
|
package/src/types.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export type LspPosition = { line: number; character: number };
|
|
2
|
-
export type LspRange = { start: LspPosition; end: LspPosition };
|
|
3
|
-
|
|
4
|
-
export interface Diagnostic {
|
|
5
|
-
range: LspRange;
|
|
6
|
-
severity?: number;
|
|
7
|
-
source?: string;
|
|
8
|
-
message: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface PublishDiagnosticsParams {
|
|
12
|
-
uri: string;
|
|
13
|
-
diagnostics: Diagnostic[];
|
|
14
|
-
}
|
package/src/workspace.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import type { EditorUi } from '@kerebron/editor';
|
|
2
|
-
import { PositionMapper } from '@kerebron/extension-markdown/PositionMapper';
|
|
3
|
-
|
|
4
|
-
export interface LSPSource {
|
|
5
|
-
ui: EditorUi;
|
|
6
|
-
getMappedContent(): Promise<{ content: string; mapper: PositionMapper }>;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export interface WorkspaceFile {
|
|
10
|
-
uri: string;
|
|
11
|
-
languageId: string;
|
|
12
|
-
version: number;
|
|
13
|
-
content: string;
|
|
14
|
-
source: LSPSource;
|
|
15
|
-
getUi(): EditorUi | undefined;
|
|
16
|
-
mapper: PositionMapper;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export abstract class Workspace extends EventTarget {
|
|
20
|
-
abstract files: WorkspaceFile[];
|
|
21
|
-
protected isConnected = false;
|
|
22
|
-
|
|
23
|
-
constructor() {
|
|
24
|
-
super();
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
getFile(uri: string): WorkspaceFile | null {
|
|
28
|
-
return this.files.find((f) => f.uri == uri) || null;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
abstract syncFiles(): void;
|
|
32
|
-
|
|
33
|
-
requestFile(uri: string): Promise<WorkspaceFile | null> {
|
|
34
|
-
return Promise.resolve(this.getFile(uri));
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
abstract openFile(uri: string, languageId: string, source: LSPSource): void;
|
|
38
|
-
abstract changedFile(uri: string): void;
|
|
39
|
-
abstract closeFile(uri: string): void;
|
|
40
|
-
|
|
41
|
-
async connected(): Promise<void> {
|
|
42
|
-
this.isConnected = true;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
disconnected(): void {
|
|
46
|
-
this.isConnected = false;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
getUi(uri: string): Promise<EditorUi | undefined> {
|
|
50
|
-
const file = this.getFile(uri);
|
|
51
|
-
return Promise.resolve(file ? file.getUi() : undefined);
|
|
52
|
-
}
|
|
53
|
-
}
|