@@ -11,6 +11,7 @@ import config from "./config";
1111
1212export 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