Skip to content

Commit 2201665

Browse files
authored
fix: handlers wait for buffer to be loaded (#72)
1 parent 413eb20 commit 2201665

File tree

4 files changed

+29
-16
lines changed

4 files changed

+29
-16
lines changed

src/handles/documentSymbol.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ import {IFunction, IIdentifier} from "../server/buffer";
66
import {documents} from "../server/documents";
77
import config from "../server/config";
88

9-
export const documentSymbolProvider = (params: DocumentSymbolParams): DocumentSymbol[] | SymbolInformation[] => {
9+
export const documentSymbolProvider = async (params: DocumentSymbolParams): Promise<DocumentSymbol[] | SymbolInformation[]> => {
1010
const documentSymbols: DocumentSymbol[] = []
1111
const { textDocument } = params
12-
const buffer = workspace.getBufferByUri(textDocument.uri)
12+
const buffer = await workspace.getBufferByUri(textDocument.uri)
1313
const document = documents.get(textDocument.uri)
1414
if (!buffer || !document) {
1515
return documentSymbols

src/handles/foldingRange.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import {FoldingRange, FoldingRangeParams} from "vscode-languageserver";
22

33
import {workspace} from "../server/workspaces";
44

5-
export const foldingRangeProvider = (params: FoldingRangeParams) => {
5+
export const foldingRangeProvider = async (params: FoldingRangeParams) => {
66
const res: FoldingRange[] = [];
77
const { textDocument } = params;
8-
const buffer = workspace.getBufferByUri(textDocument.uri);
8+
const buffer = await workspace.getBufferByUri(textDocument.uri);
99
if (!buffer) {
1010
return res;
1111
}

src/handles/selectionRange.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import {SelectionRangeParams, SelectionRange, Range, Position} from "vscode-lang
33
import {workspace} from "../server/workspaces";
44
import {documents} from "../server/documents";
55

6-
export const selectionRangeProvider = (params: SelectionRangeParams): SelectionRange[] => {
6+
export const selectionRangeProvider = async (params: SelectionRangeParams): Promise<SelectionRange[]> => {
77
const selectRanges: SelectionRange[] = [];
88
const { textDocument, positions } = params;
99
if (!positions || positions.length === 0) {
1010
return selectRanges
1111
}
12-
const buffer = workspace.getBufferByUri(textDocument.uri);
12+
const buffer = await workspace.getBufferByUri(textDocument.uri);
1313
const document = documents.get(textDocument.uri)
1414
if (!buffer || !document) {
1515
return selectRanges;

src/server/workspaces.ts

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import config from "./config";
1111

1212
export class Workspace {
1313
private buffers: Record<string, Buffer> = {};
14+
private pendingBuffers: Record<string, Promise<Buffer>> = {};
1415

1516
public isExistsBuffer(uri: string) {
1617
if (this.buffers[uri]) {
@@ -26,19 +27,31 @@ export class Workspace {
2627
if (this.buffers[uri]) {
2728
this.buffers[uri].updateBufferByNode(node);
2829
} else {
29-
let projectRoot = await findProjectRoot(
30-
URI.parse(uri).fsPath,
31-
config.indexes.projectRootPatterns,
32-
);
33-
if (config.vimruntime.trim() !== '' && projectRoot.indexOf(config.vimruntime) === 0) {
34-
projectRoot = config.vimruntime;
35-
}
36-
this.buffers[uri] = new Buffer(uri, projectRoot, node);
30+
const loadPromise = this.loadBuffer(uri, node)
31+
this.pendingBuffers[uri] = loadPromise
32+
this.buffers[uri] = await loadPromise
33+
delete this.pendingBuffers[uri]
34+
}
35+
}
36+
37+
private async loadBuffer(uri: string, node: INode) : Promise<Buffer> {
38+
let projectRoot = await findProjectRoot(
39+
URI.parse(uri).fsPath,
40+
config.indexes.projectRootPatterns,
41+
);
42+
if (config.vimruntime.trim() !== '' && projectRoot.indexOf(config.vimruntime) === 0) {
43+
projectRoot = config.vimruntime;
3744
}
45+
return new Buffer(uri, projectRoot, node);
3846
}
3947

40-
public getBufferByUri(uri: string): Buffer | undefined {
41-
return this.buffers[uri];
48+
public getBufferByUri(uri: string): Promise<Buffer | undefined> {
49+
if (this.buffers[uri]) {
50+
return Promise.resolve(this.buffers[uri])
51+
} else if (this.pendingBuffers[uri]) {
52+
return this.pendingBuffers[uri]
53+
}
54+
return Promise.resolve(undefined)
4255
}
4356

4457
public getFunctionItems(uri: string) {

0 commit comments

Comments
 (0)