1- import { CompletionItem , CompletionParams , DidChangeConfigurationNotification , DidChangeConfigurationParams , DidChangeWatchedFilesParams , DocumentSymbolParams , FoldingRange , FoldingRangeParams , Hover , HoverParams , SemanticTokensParams , SemanticTokensRangeParams , SymbolInformation , TextDocuments , WorkspaceFoldersChangeEvent , _Connection } from 'vscode-languageserver' ;
2- import { BaseProjectDocument , ProjectDocument } from './document' ;
1+ import { CancellationToken , CancellationTokenSource , CompletionItem , CompletionParams , DidChangeConfigurationNotification , DidChangeConfigurationParams , DidChangeWatchedFilesParams , DocumentSymbolParams , FoldingRange , FoldingRangeParams , Hover , HoverParams , SemanticTokensParams , SemanticTokensRangeParams , SymbolInformation , TextDocuments , WorkspaceFoldersChangeEvent , _Connection } from 'vscode-languageserver' ;
2+ import { BaseProjectDocument } from './document' ;
33import { LanguageServerConfiguration } from '../server' ;
44import { hasConfigurationCapability } from '../capabilities/workspaceFolder' ;
55import { TextDocument } from 'vscode-languageserver-textdocument' ;
@@ -11,13 +11,13 @@ import { TextDocument } from 'vscode-languageserver-textdocument';
1111 */
1212export class Workspace {
1313 private _events : WorkspaceEvents ;
14- private _documents : ProjectDocument [ ] = [ ] ;
15- private _activeDocument ?: ProjectDocument ;
14+ private _documents : BaseProjectDocument [ ] = [ ] ;
15+ private _activeDocument ?: BaseProjectDocument ;
1616 private _publicScopeDeclarations : Map < string , any > = new Map ( ) ;
1717
1818 readonly connection : _Connection ;
1919
20- activateDocument ( document : ProjectDocument ) {
20+ activateDocument ( document : BaseProjectDocument ) {
2121 this . _activeDocument = document ;
2222 }
2323
@@ -59,8 +59,9 @@ class WorkspaceEvents {
5959 private readonly _workspace : Workspace ;
6060 private readonly _documents : TextDocuments < TextDocument > ;
6161 private readonly _configuration : LanguageServerConfiguration ;
62+ private _parseCancellationToken ?: CancellationTokenSource ;
6263
63- activeDocument ?: ProjectDocument ;
64+ activeDocument ?: BaseProjectDocument ;
6465
6566 constructor ( params : { connection : _Connection , workspace : Workspace , configuration : LanguageServerConfiguration } ) {
6667 this . _workspace = params . workspace ;
@@ -72,17 +73,16 @@ class WorkspaceEvents {
7273 }
7374
7475 private initialiseConnectionEvents ( connection : _Connection ) {
75- console . log ( 'Initialising connection events...' ) ;
7676 connection . onInitialized ( ( ) => this . onInitialized ( ) ) ;
7777 connection . onCompletion ( params => this . onCompletion ( params ) ) ;
7878 connection . onCompletionResolve ( item => this . onCompletionResolve ( item ) ) ;
7979 connection . onDidChangeConfiguration ( params => this . onDidChangeConfiguration ( params ) ) ;
8080 connection . onDidChangeWatchedFiles ( params => this . onDidChangeWatchedFiles ( params ) ) ;
81- connection . onDocumentSymbol ( async ( params ) => await this . onDocumentSymbolAsync ( params ) ) ;
81+ connection . onDocumentSymbol ( async ( params , token ) => await this . onDocumentSymbolAsync ( params , token ) ) ;
8282 connection . onHover ( params => this . onHover ( params ) ) ;
8383
8484 if ( hasConfigurationCapability ( this . _configuration ) ) {
85- connection . onFoldingRanges ( ( params ) => this . onFoldingRanges ( params ) ) ;
85+ connection . onFoldingRanges ( async ( params , token ) => this . onFoldingRanges ( params , token ) ) ;
8686 }
8787
8888 connection . onRequest ( ( method : string , params : object | object [ ] | any ) => {
@@ -101,19 +101,16 @@ class WorkspaceEvents {
101101 }
102102
103103 private initialiseDocumentsEvents ( ) {
104- console . log ( 'Initialising documents events...' ) ;
105104 this . _documents . onDidChangeContent ( async ( e ) => await this . onDidChangeContentAsync ( e . document ) ) ;
106105 }
107106
108107 /** Connection event handlers */
109108
110109 private onCompletion ( params : CompletionParams ) : never [ ] {
111- console . log ( `onCompletion: ${ params } ` ) ;
112110 return [ ] ;
113111 }
114112
115113 private onCompletionResolve ( item : CompletionItem ) : CompletionItem {
116- console . log ( `onCompletionResolve: ${ item . label } ` ) ;
117114 return item ;
118115 }
119116
@@ -127,16 +124,15 @@ class WorkspaceEvents {
127124
128125 // TODO: Should trigger a full workspace refresh.
129126 private onDidChangeWorkspaceFolders ( e : WorkspaceFoldersChangeEvent ) {
130- console . log ( `onDidChangeWorkspaceFolders: ${ e } ` ) ;
131127 this . _workspace . connection . console . log ( `Workspace folder change event received.\n${ e } ` ) ;
132128 }
133129
134- private async onDocumentSymbolAsync ( params : DocumentSymbolParams ) : Promise < SymbolInformation [ ] > {
135- return await this . activeDocument ?. languageServerSymbolInformationAsync ( ) ?? [ ] ;
130+ private async onDocumentSymbolAsync ( params : DocumentSymbolParams , token : CancellationToken ) : Promise < SymbolInformation [ ] > {
131+ return await this . activeDocument ?. languageServerSymbolInformationAsync ( token ) ?? [ ] ;
136132 }
137133
138- private onFoldingRanges ( params : FoldingRangeParams ) : FoldingRange [ ] {
139- return this . _workspace . activeDocument ?. foldableElements ?? [ ] ;
134+ private async onFoldingRanges ( params : FoldingRangeParams , token : CancellationToken ) : Promise < FoldingRange [ ] > {
135+ return await this . _workspace . activeDocument ?. getFoldingRanges ( token ) ?? [ ] ;
140136 }
141137
142138 private onHover ( params : HoverParams ) : Hover {
@@ -163,9 +159,13 @@ class WorkspaceEvents {
163159 * @param doc The document that changed.
164160 */
165161 async onDidChangeContentAsync ( doc : TextDocument ) {
162+ // this._parseCancellationToken?.cancel();
163+ // this._parseCancellationToken?.dispose();
164+
166165 this . activeDocument = BaseProjectDocument . create ( this . _workspace , doc ) ;
167- await this . activeDocument . parseAsync ( ) ;
166+ this . _parseCancellationToken = new CancellationTokenSource ( ) ;
167+ await this . activeDocument . parseAsync ( this . _parseCancellationToken . token ) ;
168+ this . _parseCancellationToken = undefined ;
168169 this . _workspace . activateDocument ( this . activeDocument ) ;
169170 }
170-
171- }
171+ }
0 commit comments