1
1
import * as vscode from 'vscode' ;
2
- import { Generator } from './generator' ;
2
+ import { workspace } from 'vscode' ;
3
+ import { Commands , PythonLanguage } from '../common/constants' ;
4
+ import { isNotInstalledError } from '../common/helpers' ;
3
5
import { Installer , InstallerResponse , Product } from '../common/installer' ;
4
6
import { fsExistsAsync } from '../common/utils' ;
5
- import { isNotInstalledError } from '../common/helpers' ;
6
- import { PythonLanguage , Commands } from '../common/constants' ;
7
+ import { Generator } from './generator' ;
7
8
import { WorkspaceSymbolProvider } from './provider' ;
8
- import { workspace } from 'vscode' ;
9
9
10
10
const MAX_NUMBER_OF_ATTEMPTS_TO_INSTALL_AND_BUILD = 2 ;
11
11
12
12
export class WorkspaceSymbols implements vscode . Disposable {
13
13
private disposables : vscode . Disposable [ ] ;
14
14
private generators : Generator [ ] = [ ] ;
15
15
private installer : Installer ;
16
+ // tslint:disable-next-line:no-any
17
+ private timeout : any ;
16
18
constructor ( private outputChannel : vscode . OutputChannel ) {
17
19
this . disposables = [ ] ;
18
20
this . disposables . push ( this . outputChannel ) ;
@@ -21,12 +23,14 @@ export class WorkspaceSymbols implements vscode.Disposable {
21
23
this . registerCommands ( ) ;
22
24
this . initializeGenerators ( ) ;
23
25
vscode . languages . registerWorkspaceSymbolProvider ( new WorkspaceSymbolProvider ( this . generators , this . outputChannel ) ) ;
24
- this . buildWorkspaceSymbols ( true ) ;
25
26
this . disposables . push ( vscode . workspace . onDidChangeWorkspaceFolders ( ( ) => this . initializeGenerators ( ) ) ) ;
26
27
}
28
+ public dispose ( ) {
29
+ this . disposables . forEach ( d => d . dispose ( ) ) ;
30
+ }
27
31
private initializeGenerators ( ) {
28
32
while ( this . generators . length > 0 ) {
29
- const generator = this . generators . shift ( ) ;
33
+ const generator = this . generators . shift ( ) ! ;
30
34
generator . dispose ( ) ;
31
35
}
32
36
@@ -36,38 +40,36 @@ export class WorkspaceSymbols implements vscode.Disposable {
36
40
} ) ;
37
41
}
38
42
}
39
- registerCommands ( ) {
40
- this . disposables . push ( vscode . commands . registerCommand ( Commands . Build_Workspace_Symbols , ( rebuild : boolean = true , token ?: vscode . CancellationToken ) => {
41
- this . buildWorkspaceSymbols ( rebuild , token ) ;
43
+ private registerCommands ( ) {
44
+ this . disposables . push ( vscode . commands . registerCommand ( Commands . Build_Workspace_Symbols , async ( rebuild : boolean = true , token ?: vscode . CancellationToken ) => {
45
+ const promises = this . buildWorkspaceSymbols ( rebuild , token ) ;
46
+ return Promise . all ( promises ) ;
42
47
} ) ) ;
43
48
}
44
- registerOnSaveHandlers ( ) {
49
+ private registerOnSaveHandlers ( ) {
45
50
this . disposables . push ( vscode . workspace . onDidSaveTextDocument ( this . onDidSaveTextDocument . bind ( this ) ) ) ;
46
51
}
47
- onDidSaveTextDocument ( textDocument : vscode . TextDocument ) {
52
+ private onDidSaveTextDocument ( textDocument : vscode . TextDocument ) {
48
53
if ( textDocument . languageId === PythonLanguage . language ) {
49
54
this . rebuildTags ( ) ;
50
55
}
51
56
}
52
- private timeout : number ;
53
- rebuildTags ( ) {
57
+ private rebuildTags ( ) {
54
58
if ( this . timeout ) {
55
- clearTimeout ( this . timeout ) ;
59
+ clearTimeout ( this . timeout ! ) ;
56
60
this . timeout = null ;
57
61
}
58
62
this . timeout = setTimeout ( ( ) => {
59
63
this . buildWorkspaceSymbols ( true ) ;
60
64
} , 5000 ) ;
61
65
}
62
- dispose ( ) {
63
- this . disposables . forEach ( d => d . dispose ( ) ) ;
64
- }
65
- async buildWorkspaceSymbols ( rebuild : boolean = true , token ?: vscode . CancellationToken ) : Promise < any > {
66
+ // tslint:disable-next-line:no-any
67
+ private buildWorkspaceSymbols ( rebuild : boolean = true , token ?: vscode . CancellationToken ) : Promise < any > [ ] {
66
68
if ( token && token . isCancellationRequested ) {
67
- return Promise . resolve ( [ ] ) ;
69
+ return [ ] ;
68
70
}
69
71
if ( this . generators . length === 0 ) {
70
- return Promise . resolve ( [ ] ) ;
72
+ return [ ] ;
71
73
}
72
74
73
75
let promptPromise : Promise < InstallerResponse > ;
@@ -77,17 +79,16 @@ export class WorkspaceSymbols implements vscode.Disposable {
77
79
return ;
78
80
}
79
81
const exists = await fsExistsAsync ( generator . tagFilePath ) ;
80
- // if file doesn't exist, then run the ctag generator
81
- // Or check if required to rebuild
82
+ // If file doesn't exist, then run the ctag generator,
83
+ // or check if required to rebuild.
82
84
if ( ! rebuild && exists ) {
83
85
return ;
84
86
}
85
- for ( let counter = 0 ; counter < MAX_NUMBER_OF_ATTEMPTS_TO_INSTALL_AND_BUILD ; counter ++ ) {
87
+ for ( let counter = 0 ; counter < MAX_NUMBER_OF_ATTEMPTS_TO_INSTALL_AND_BUILD ; counter += 1 ) {
86
88
try {
87
89
await generator . generateWorkspaceTags ( ) ;
88
90
return ;
89
- }
90
- catch ( error ) {
91
+ } catch ( error ) {
91
92
if ( ! isNotInstalledError ( error ) ) {
92
93
this . outputChannel . show ( ) ;
93
94
return ;
@@ -96,13 +97,12 @@ export class WorkspaceSymbols implements vscode.Disposable {
96
97
if ( ! token || token . isCancellationRequested ) {
97
98
return ;
98
99
}
99
- // Display prompt once for all workspaces
100
+ // Display prompt once for all workspaces.
100
101
if ( promptPromise ) {
101
102
promptResponse = await promptPromise ;
102
103
continue ;
103
- }
104
- else {
105
- promptPromise = this . installer . promptToInstall ( Product . ctags , workspace . workspaceFolders [ 0 ] . uri ) ;
104
+ } else {
105
+ promptPromise = this . installer . promptToInstall ( Product . ctags , workspace . workspaceFolders [ 0 ] ! . uri ) ;
106
106
promptResponse = await promptPromise ;
107
107
}
108
108
if ( promptResponse !== InstallerResponse . Installed || ( ! token || token . isCancellationRequested ) ) {
@@ -112,4 +112,3 @@ export class WorkspaceSymbols implements vscode.Disposable {
112
112
} ) ;
113
113
}
114
114
}
115
-
0 commit comments