@@ -26,8 +26,7 @@ import { SamTemplateCodeLensProvider } from '../codelens/samTemplateCodeLensProv
26
26
import * as jsLensProvider from '../codelens/typescriptCodeLensProvider'
27
27
import { ExtContext , VSCODE_EXTENSION_ID } from '../extensions'
28
28
import { getIdeProperties , getIdeType , IDE , isCloud9 } from '../extensionUtilities'
29
- import { getLogger } from '../logger/logger'
30
- import { TelemetryService } from '../telemetry/telemetryService'
29
+ import { PerfLog , getLogger } from '../logger/logger'
31
30
import { NoopWatcher } from '../fs/watchedFiles'
32
31
import { detectSamCli } from './cli/samCliDetection'
33
32
import { CodelensRootRegistry } from '../fs/codelensRootRegistry'
@@ -43,20 +42,41 @@ import { registerSync } from './sync'
43
42
44
43
const sharedDetectSamCli = shared ( detectSamCli )
45
44
45
+ const supportedLanguages : {
46
+ [ language : string ] : codelensUtils . OverridableCodeLensProvider
47
+ } = { }
48
+
46
49
/**
47
50
* Activate SAM-related functionality.
48
51
*/
49
52
export async function activate ( ctx : ExtContext ) : Promise < void > {
53
+ let didActivateCodeLensProviders = false
50
54
await createYamlExtensionPrompt ( )
51
55
const config = SamCliSettings . instance
52
56
53
- ctx . extensionContext . subscriptions . push (
54
- ...( await activateCodeLensProviders ( ctx , config , ctx . outputChannel , ctx . telemetryService ) )
55
- )
57
+ // Do this "on-demand" because it is slow.
58
+ async function activateSlowCodeLensesOnce ( ) : Promise < void > {
59
+ if ( ! didActivateCodeLensProviders ) {
60
+ didActivateCodeLensProviders = true
61
+ const disposeable = await activateCodefileOverlays ( ctx , config )
62
+ ctx . extensionContext . subscriptions . push ( ...disposeable )
63
+ }
64
+ }
65
+
66
+ if ( config . get ( 'enableCodeLenses' , false ) ) {
67
+ activateSlowCodeLensesOnce ( )
68
+ }
56
69
57
- await registerServerlessCommands ( ctx , config )
70
+ await registerCommands ( ctx , config )
71
+ Commands . register ( 'aws.addSamDebugConfig' , async ( ) => {
72
+ if ( ! didActivateCodeLensProviders ) {
73
+ await activateSlowCodeLensesOnce ( )
74
+ await samDebugConfigCmd ( )
75
+ }
76
+ } )
58
77
59
78
ctx . extensionContext . subscriptions . push (
79
+ activateSamYamlOverlays ( ) ,
60
80
vscode . debug . registerDebugConfigurationProvider ( AWS_SAM_DEBUG_TYPE , new SamDebugConfigProvider ( ctx ) )
61
81
)
62
82
@@ -72,10 +92,19 @@ export async function activate(ctx: ExtContext): Promise<void> {
72
92
)
73
93
)
74
94
75
- config . onDidChange ( event => {
76
- if ( event . key === 'location' ) {
77
- // This only shows a message (passive=true), does not set anything.
78
- sharedDetectSamCli ( { passive : true , showMessage : true } )
95
+ config . onDidChange ( async event => {
96
+ switch ( event . key ) {
97
+ case 'location' :
98
+ // This only shows a message (passive=true), does not set anything.
99
+ sharedDetectSamCli ( { passive : true , showMessage : true } )
100
+ break
101
+ case 'enableCodeLenses' :
102
+ if ( config . get ( event . key , false ) && ! didActivateCodeLensProviders ) {
103
+ await activateSlowCodeLensesOnce ( )
104
+ }
105
+ break
106
+ default :
107
+ break
79
108
}
80
109
} )
81
110
@@ -88,7 +117,7 @@ export async function activate(ctx: ExtContext): Promise<void> {
88
117
registerSync ( )
89
118
}
90
119
91
- async function registerServerlessCommands ( ctx : ExtContext , settings : SamCliSettings ) : Promise < void > {
120
+ async function registerCommands ( ctx : ExtContext , settings : SamCliSettings ) : Promise < void > {
92
121
lazyLoadSamTemplateStrings ( )
93
122
ctx . extensionContext . subscriptions . push (
94
123
Commands . register ( { id : 'aws.samcli.detect' , autoconnect : false } , ( ) =>
@@ -123,6 +152,10 @@ async function registerServerlessCommands(ctx: ExtContext, settings: SamCliSetti
123
152
settings,
124
153
}
125
154
)
155
+ } ) ,
156
+ Commands . register ( { id : 'aws.toggleSamCodeLenses' , autoconnect : false } , async ( ) => {
157
+ const toggled = ! settings . get ( 'enableCodeLenses' , false )
158
+ settings . update ( 'enableCodeLenses' , toggled )
126
159
} )
127
160
)
128
161
}
@@ -158,12 +191,70 @@ async function activateCodeLensRegistry(context: ExtContext) {
158
191
context . extensionContext . subscriptions . push ( globals . codelensRootRegistry )
159
192
}
160
193
161
- async function activateCodeLensProviders (
194
+ async function samDebugConfigCmd ( ) {
195
+ const activeEditor = vscode . window . activeTextEditor
196
+ if ( ! activeEditor ) {
197
+ getLogger ( ) . error ( `aws.addSamDebugConfig was called without an active text editor` )
198
+ vscode . window . showErrorMessage (
199
+ localize ( 'AWS.pickDebugHandler.noEditor' , 'Toolkit could not find an active editor' )
200
+ )
201
+
202
+ return
203
+ }
204
+ const document = activeEditor . document
205
+ const provider = supportedLanguages [ document . languageId ]
206
+ if ( ! provider ) {
207
+ getLogger ( ) . error ( `aws.addSamDebugConfig called on a document with an invalid language: ${ document . languageId } ` )
208
+ vscode . window . showErrorMessage (
209
+ localize (
210
+ 'AWS.pickDebugHandler.invalidLanguage' ,
211
+ 'Toolkit cannot detect handlers in language: {0}' ,
212
+ document . languageId
213
+ )
214
+ )
215
+
216
+ return
217
+ }
218
+
219
+ // TODO: No reason for this to depend on the codelense provider (which scans the whole workspace and creates filewatchers).
220
+ const lenses = ( await provider . provideCodeLenses ( document , new vscode . CancellationTokenSource ( ) . token , true ) ) ?? [ ]
221
+ codelensUtils . invokeCodeLensCommandPalette ( document , lenses )
222
+ }
223
+
224
+ /**
225
+ * Creates vscode.CodeLensProvider for SAM "template.yaml" files.
226
+ *
227
+ * Used for:
228
+ * 1. showing codelenses in SAM template.yaml files
229
+ */
230
+ function activateSamYamlOverlays ( ) : vscode . Disposable {
231
+ return vscode . languages . registerCodeLensProvider (
232
+ [
233
+ {
234
+ language : 'yaml' ,
235
+ scheme : 'file' ,
236
+ pattern : '**/*template.{yml,yaml}' ,
237
+ } ,
238
+ ] ,
239
+ new SamTemplateCodeLensProvider ( )
240
+ )
241
+ }
242
+
243
+ /**
244
+ * EXPENSIVE AND SLOW. Creates filewatchers and vscode.CodeLensProvider objects
245
+ * for codefiles (as opposed to SAM template.yaml files).
246
+ *
247
+ * Used for:
248
+ * 1. showing codelenses
249
+ * 2. "Add SAM Debug Configuration" command (TODO: remove dependency on
250
+ * codelense provider (which scans the whole workspace and creates
251
+ * filewatchers)).
252
+ */
253
+ async function activateCodefileOverlays (
162
254
context : ExtContext ,
163
- configuration : SamCliSettings ,
164
- toolkitOutputChannel : vscode . OutputChannel ,
165
- telemetryService : TelemetryService
255
+ configuration : SamCliSettings
166
256
) : Promise < vscode . Disposable [ ] > {
257
+ const perflog = new PerfLog ( 'activateCodefileOverlays' )
167
258
const disposables : vscode . Disposable [ ] = [ ]
168
259
const tsCodeLensProvider = codelensUtils . makeTypescriptCodeLensProvider ( configuration )
169
260
const pyCodeLensProvider = await codelensUtils . makePythonCodeLensProvider ( configuration )
@@ -175,12 +266,8 @@ async function activateCodeLensProviders(
175
266
// the event to notify on when their results change.
176
267
await activateCodeLensRegistry ( context )
177
268
178
- const supportedLanguages : {
179
- [ language : string ] : codelensUtils . OverridableCodeLensProvider
180
- } = {
181
- [ jsLensProvider . javascriptLanguage ] : tsCodeLensProvider ,
182
- [ pyLensProvider . pythonLanguage ] : pyCodeLensProvider ,
183
- }
269
+ supportedLanguages [ jsLensProvider . javascriptLanguage ] = tsCodeLensProvider
270
+ supportedLanguages [ pyLensProvider . pythonLanguage ] = pyCodeLensProvider
184
271
185
272
if ( ! isCloud9 ( ) ) {
186
273
supportedLanguages [ javaLensProvider . javaLanguage ] = javaCodeLensProvider
@@ -189,66 +276,13 @@ async function activateCodeLensProviders(
189
276
supportedLanguages [ jsLensProvider . typescriptLanguage ] = tsCodeLensProvider
190
277
}
191
278
192
- disposables . push (
193
- vscode . languages . registerCodeLensProvider (
194
- [
195
- {
196
- language : 'yaml' ,
197
- scheme : 'file' ,
198
- pattern : '**/*template.{yml,yaml}' ,
199
- } ,
200
- ] ,
201
- new SamTemplateCodeLensProvider ( )
202
- )
203
- )
204
-
205
279
disposables . push ( vscode . languages . registerCodeLensProvider ( jsLensProvider . typescriptAllFiles , tsCodeLensProvider ) )
206
280
disposables . push ( vscode . languages . registerCodeLensProvider ( pyLensProvider . pythonAllfiles , pyCodeLensProvider ) )
207
281
disposables . push ( vscode . languages . registerCodeLensProvider ( javaLensProvider . javaAllfiles , javaCodeLensProvider ) )
208
282
disposables . push ( vscode . languages . registerCodeLensProvider ( csLensProvider . csharpAllfiles , csCodeLensProvider ) )
209
283
disposables . push ( vscode . languages . registerCodeLensProvider ( goLensProvider . goAllfiles , goCodeLensProvider ) )
210
284
211
- disposables . push (
212
- Commands . register ( { id : 'aws.toggleSamCodeLenses' , autoconnect : false } , async ( ) => {
213
- const toggled = ! configuration . get ( 'enableCodeLenses' , false )
214
- configuration . update ( 'enableCodeLenses' , toggled )
215
- } )
216
- )
217
-
218
- disposables . push (
219
- Commands . register ( 'aws.addSamDebugConfig' , async ( ) => {
220
- const activeEditor = vscode . window . activeTextEditor
221
- if ( ! activeEditor ) {
222
- getLogger ( ) . error ( `aws.addSamDebugConfig was called without an active text editor` )
223
- vscode . window . showErrorMessage (
224
- localize ( 'AWS.pickDebugHandler.noEditor' , 'Toolkit could not find an active editor' )
225
- )
226
-
227
- return
228
- }
229
- const document = activeEditor . document
230
- const provider = supportedLanguages [ document . languageId ]
231
- if ( ! provider ) {
232
- getLogger ( ) . error (
233
- `aws.addSamDebugConfig called on a document with an invalid language: ${ document . languageId } `
234
- )
235
- vscode . window . showErrorMessage (
236
- localize (
237
- 'AWS.pickDebugHandler.invalidLanguage' ,
238
- 'Toolkit cannot detect handlers in language: {0}' ,
239
- document . languageId
240
- )
241
- )
242
-
243
- return
244
- }
245
-
246
- const lenses =
247
- ( await provider . provideCodeLenses ( document , new vscode . CancellationTokenSource ( ) . token , true ) ) ?? [ ]
248
- codelensUtils . invokeCodeLensCommandPalette ( document , lenses )
249
- } )
250
- )
251
-
285
+ perflog . done ( )
252
286
return disposables
253
287
}
254
288
0 commit comments