Skip to content

Commit 693886c

Browse files
authored
Merge pull request #212 from elm-tooling/new-language-server-version
New language server version
2 parents b444bcd + f83fb20 commit 693886c

File tree

9 files changed

+69
-88
lines changed

9 files changed

+69
-88
lines changed

package-lock.json

Lines changed: 20 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
"pjson": "1.0.9",
2323
"request": "^2.88.0",
2424
"rxjs": "^6.5.4",
25-
"vscode-languageserver": "^5.2.1",
25+
"vscode-languageserver": "^6.1.0",
26+
"vscode-languageserver-textdocument": "^1.0.0",
2627
"vscode-uri": "^2.1.1",
2728
"web-tree-sitter": "^0.16.0",
2829
"ws": "^7.2.1"

src/capabilityCalculator.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,6 @@ export class CapabilityCalculator {
1818
this.clientCapabilities;
1919

2020
return {
21-
// Perform incremental syncs
22-
// Incremental sync is disabled for now due to not being able to get the
23-
// old text in ASTProvider
24-
// textDocumentSync: TextDocumentSyncKind.Incremental,
2521
codeActionProvider: true,
2622
codeLensProvider: {
2723
resolveProvider: true,

src/elmWorkspace.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import globby from "globby";
33
import os from "os";
44
import path from "path";
55
import util from "util";
6-
import { IConnection } from "vscode-languageserver";
6+
import { IConnection, ProgressType } from "vscode-languageserver";
77
import { URI } from "vscode-uri";
88
import Parser, { Tree } from "web-tree-sitter";
99
import { Forest } from "./forest";
1010
import { Imports } from "./imports";
1111
import * as utils from "./util/elmUtils";
1212
import { Settings } from "./util/settings";
13+
import { WorkDoneProgress } from "vscode-languageserver/lib/progress";
1314

1415
const readFile = util.promisify(fs.readFile);
1516
const readdir = util.promisify(fs.readdir);
@@ -42,8 +43,8 @@ export class ElmWorkspace {
4243
this.imports = new Imports(parser);
4344
}
4445

45-
public async init() {
46-
await this.initWorkspace();
46+
public async init(progress: WorkDoneProgress) {
47+
await this.initWorkspace(progress);
4748
}
4849

4950
public hasDocument(uri: URI): boolean {
@@ -68,7 +69,9 @@ export class ElmWorkspace {
6869
return this.rootPath;
6970
}
7071

71-
private async initWorkspace() {
72+
private async initWorkspace(x: WorkDoneProgress) {
73+
let progress = 0;
74+
x.begin("Indexing", progress);
7275
let elmVersion;
7376
try {
7477
elmVersion = await utils.getElmVersion(
@@ -183,18 +186,24 @@ export class ElmWorkspace {
183186
}
184187

185188
const promiseList: Promise<void>[] = [];
189+
const progressSteps = (elmFilePaths.length * 2) / 100;
186190
for (const filePath of elmFilePaths) {
191+
progress += progressSteps;
192+
x.report(progressSteps);
187193
promiseList.push(this.readAndAddToForest(filePath));
188194
}
189195
await Promise.all(promiseList);
190196

191197
this.forest.treeIndex.forEach(item => {
198+
progress += progressSteps;
199+
x.report(progressSteps);
192200
this.connection.console.info(
193201
`Adding imports ${URI.parse(item.uri).fsPath}`,
194202
);
195203
this.imports.updateImports(item.uri, item.tree, this.forest);
196204
});
197205

206+
x.done();
198207
this.connection.console.info("Done parsing all files.");
199208
} catch (error) {
200209
this.connection.console.error(error.stack);

src/index.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ const connection: IConnection = createConnection(ProposedFeatures.all);
2828
let server: ILanguageServer;
2929

3030
connection.onInitialize(
31-
async (params: InitializeParams): Promise<InitializeResult> => {
31+
async (
32+
params: InitializeParams,
33+
cancel,
34+
progress,
35+
): Promise<InitializeResult> => {
3236
await Parser.init();
3337
const absolute = Path.join(__dirname, "tree-sitter-elm.wasm");
3438
const pathToWasm = Path.relative(process.cwd(), absolute);
@@ -40,7 +44,7 @@ connection.onInitialize(
4044
parser.setLanguage(language);
4145

4246
const { Server } = await import("./server");
43-
server = new Server(connection, params, parser);
47+
server = new Server(connection, params, parser, progress);
4448
await server.init();
4549

4650
return server.capabilities;

src/providers/astProvider.ts

Lines changed: 1 addition & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {
88
import { URI } from "vscode-uri";
99
import Parser, { Point, SyntaxNode, Tree } from "web-tree-sitter";
1010
import { ElmWorkspace } from "../elmWorkspace";
11-
import { Position } from "../position";
1211
import { IDocumentEvents } from "../util/documentEvents";
1312
import { ElmWorkspaceMatcher } from "../util/elmWorkspaceMatcher";
1413

@@ -50,58 +49,11 @@ export class ASTProvider {
5049
}
5150

5251
for (const changeEvent of params.contentChanges) {
53-
if (changeEvent.range && changeEvent.rangeLength) {
54-
// range is range of the change. end is exclusive
55-
// rangeLength is length of text removed
56-
// text is new text
57-
const { range, rangeLength, text } = changeEvent;
58-
const startIndex: number = range.start.line * range.start.character;
59-
const oldEndIndex: number = startIndex + rangeLength - 1;
60-
if (tree) {
61-
tree.edit({
62-
// end index for new version of text
63-
newEndIndex: range.end.line * range.end.character - 1,
64-
// position in new doc change ended
65-
newEndPosition: Position.FROM_VS_POSITION(range.end).toTSPosition(),
66-
67-
// end index for old version of text
68-
oldEndIndex,
69-
// position in old doc change ended.
70-
oldEndPosition: this.computeEndPosition(
71-
startIndex,
72-
oldEndIndex,
73-
tree,
74-
),
75-
76-
// index in old doc the change started
77-
startIndex,
78-
// position in old doc change started
79-
startPosition: Position.FROM_VS_POSITION(
80-
range.start,
81-
).toTSPosition(),
82-
});
83-
tree = this.parser.parse(text, tree);
84-
}
85-
} else {
86-
tree = this.parser.parse(changeEvent.text);
87-
}
52+
tree = this.parser.parse(changeEvent.text);
8853
}
8954
if (tree) {
9055
forest.setTree(document.uri, true, true, tree);
9156
imports.updateImports(document.uri, tree, forest);
9257
}
9358
};
94-
95-
private computeEndPosition = (
96-
startIndex: number,
97-
endIndex: number,
98-
tree: Tree,
99-
): Point => {
100-
const node: SyntaxNode = tree.rootNode.descendantForIndex(
101-
startIndex,
102-
endIndex,
103-
);
104-
105-
return node.endPosition;
106-
};
10759
}

src/providers/diagnostics/diagnosticsProvider.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { Diagnostic, IConnection, TextDocument } from "vscode-languageserver";
1+
import {
2+
Diagnostic,
3+
IConnection,
4+
TextDocument,
5+
FileChangeType,
6+
} from "vscode-languageserver";
27
import { URI } from "vscode-uri";
38
import { ElmWorkspace } from "../../elmWorkspace";
49
import { ElmWorkspaceMatcher } from "../../util/elmWorkspaceMatcher";
@@ -62,6 +67,20 @@ export class DiagnosticsProvider {
6267
this.events.on("save", d =>
6368
this.getDiagnostics(d, true, elmAnalyseTrigger),
6469
);
70+
71+
this.connection.onDidChangeWatchedFiles(event => {
72+
const newDeleteEvents = event.changes
73+
.filter(a => a.type === FileChangeType.Deleted)
74+
.map(a => a.uri);
75+
76+
newDeleteEvents.forEach(uri => {
77+
this.currentDiagnostics.elmAnalyse.delete(uri);
78+
this.currentDiagnostics.elmMake.delete(uri);
79+
this.currentDiagnostics.elmTest.delete(uri);
80+
});
81+
this.sendDiagnostics();
82+
});
83+
6584
if (this.elmAnalyseDiagnostics) {
6685
this.elmAnalyseDiagnostics.on(
6786
"new-diagnostics",

src/server.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
import { DocumentEvents } from "./util/documentEvents";
3030
import { Settings } from "./util/settings";
3131
import { TextDocumentEvents } from "./util/textDocumentEvents";
32+
import { WorkDoneProgress } from "vscode-languageserver/lib/progress";
3233

3334
export interface ILanguageServer {
3435
readonly capabilities: InitializeResult;
@@ -45,9 +46,9 @@ export class Server implements ILanguageServer {
4546
private connection: Connection,
4647
private params: InitializeParams,
4748
private parser: Parser,
49+
private progress: WorkDoneProgress,
4850
) {
4951
this.calculator = new CapabilityCalculator(params.capabilities);
50-
5152
const initializationOptions = this.params.initializationOptions ?? {};
5253
this.settings = new Settings(
5354
this.connection,
@@ -108,7 +109,7 @@ export class Server implements ILanguageServer {
108109
}
109110

110111
public async init() {
111-
this.elmWorkspaces.forEach(async it => await it.init());
112+
this.elmWorkspaces.forEach(async it => await it.init(this.progress));
112113
}
113114

114115
public async registerInitializedProviders() {

src/util/textDocumentEvents.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import {
44
DidCloseTextDocumentParams,
55
DidOpenTextDocumentParams,
66
DidSaveTextDocumentParams,
7-
TextDocument,
8-
TextDocumentContentChangeEvent,
97
} from "vscode-languageserver";
8+
import {
9+
TextDocumentContentChangeEvent,
10+
TextDocument,
11+
} from "vscode-languageserver-textdocument";
1012
import { IDocumentEvents } from "./documentEvents";
1113

1214
type DidChangeCallback = (document: TextDocument) => void;

0 commit comments

Comments
 (0)