@@ -38,6 +38,7 @@ import { logAndReturn } from '../Utility/Async/returns';
38
38
import { is } from '../Utility/System/guards' ;
39
39
import * as util from '../common' ;
40
40
import { isWindows } from '../constants' ;
41
+ import { instrument , isInstrumentationEnabled } from '../instrumentation' ;
41
42
import { DebugProtocolParams , Logger , ShowWarningParams , getDiagnosticsChannel , getOutputChannelLogger , logDebugProtocol , logLocalized , showWarning } from '../logger' ;
42
43
import { localizedStringCount , lookupString } from '../nativeStrings' ;
43
44
import { SessionState } from '../sessionState' ;
@@ -840,6 +841,16 @@ export interface Client {
840
841
}
841
842
842
843
export function createClient ( workspaceFolder ?: vscode . WorkspaceFolder ) : Client {
844
+ if ( isInstrumentationEnabled ) {
845
+ instrument ( vscode . languages , { name : "languages" } ) ;
846
+ instrument ( vscode . window , { name : "window" } ) ;
847
+ instrument ( vscode . workspace , { name : "workspace" } ) ;
848
+ instrument ( vscode . commands , { name : "commands" } ) ;
849
+ instrument ( vscode . debug , { name : "debug" } ) ;
850
+ instrument ( vscode . env , { name : "env" } ) ;
851
+ instrument ( vscode . extensions , { name : "extensions" } ) ;
852
+ return instrument ( new DefaultClient ( workspaceFolder ) , { ignore : [ "enqueue" , "onInterval" , "logTelemetry" ] } ) ;
853
+ }
843
854
return new DefaultClient ( workspaceFolder ) ;
844
855
}
845
856
@@ -1323,31 +1334,33 @@ export class DefaultClient implements Client {
1323
1334
this . currentCopilotHoverEnabled = new PersistentWorkspaceState < string > ( "cpp.copilotHover" , settings . copilotHover ) ;
1324
1335
if ( settings . copilotHover !== "disabled" ) {
1325
1336
this . copilotHoverProvider = new CopilotHoverProvider ( this ) ;
1326
- this . disposables . push ( vscode . languages . registerHoverProvider ( util . documentSelector , this . copilotHoverProvider ) ) ;
1337
+ this . disposables . push ( vscode . languages . registerHoverProvider ( util . documentSelector , instrument ( this . copilotHoverProvider ) ) ) ;
1327
1338
}
1339
+
1328
1340
if ( settings . copilotHover !== this . currentCopilotHoverEnabled . Value ) {
1329
1341
this . currentCopilotHoverEnabled . Value = settings . copilotHover ;
1330
1342
}
1331
- this . disposables . push ( vscode . languages . registerHoverProvider ( util . documentSelector , this . hoverProvider ) ) ;
1332
- this . disposables . push ( vscode . languages . registerInlayHintsProvider ( util . documentSelector , this . inlayHintsProvider ) ) ;
1333
- this . disposables . push ( vscode . languages . registerRenameProvider ( util . documentSelector , new RenameProvider ( this ) ) ) ;
1334
- this . disposables . push ( vscode . languages . registerReferenceProvider ( util . documentSelector , new FindAllReferencesProvider ( this ) ) ) ;
1335
- this . disposables . push ( vscode . languages . registerWorkspaceSymbolProvider ( new WorkspaceSymbolProvider ( this ) ) ) ;
1336
- this . disposables . push ( vscode . languages . registerDocumentSymbolProvider ( util . documentSelector , new DocumentSymbolProvider ( ) , undefined ) ) ;
1337
- this . disposables . push ( vscode . languages . registerCodeActionsProvider ( util . documentSelector , new CodeActionProvider ( this ) , undefined ) ) ;
1338
- this . disposables . push ( vscode . languages . registerCallHierarchyProvider ( util . documentSelector , new CallHierarchyProvider ( this ) ) ) ;
1343
+ this . disposables . push ( vscode . languages . registerHoverProvider ( util . documentSelector , instrument ( this . hoverProvider ) ) ) ;
1344
+ this . disposables . push ( vscode . languages . registerInlayHintsProvider ( util . documentSelector , instrument ( this . inlayHintsProvider ) ) ) ;
1345
+ this . disposables . push ( vscode . languages . registerRenameProvider ( util . documentSelector , instrument ( new RenameProvider ( this ) ) ) ) ;
1346
+ this . disposables . push ( vscode . languages . registerReferenceProvider ( util . documentSelector , instrument ( new FindAllReferencesProvider ( this ) ) ) ) ;
1347
+ this . disposables . push ( vscode . languages . registerWorkspaceSymbolProvider ( instrument ( new WorkspaceSymbolProvider ( this ) ) ) ) ;
1348
+ this . disposables . push ( vscode . languages . registerDocumentSymbolProvider ( util . documentSelector , instrument ( new DocumentSymbolProvider ( ) ) , undefined ) ) ;
1349
+ this . disposables . push ( vscode . languages . registerCodeActionsProvider ( util . documentSelector , instrument ( new CodeActionProvider ( this ) ) , undefined ) ) ;
1350
+ this . disposables . push ( vscode . languages . registerCallHierarchyProvider ( util . documentSelector , instrument ( new CallHierarchyProvider ( this ) ) ) ) ;
1351
+
1339
1352
// Because formatting and codeFolding can vary per folder, we need to register these providers once
1340
1353
// and leave them registered. The decision of whether to provide results needs to be made on a per folder basis,
1341
1354
// within the providers themselves.
1342
- this . documentFormattingProviderDisposable = vscode . languages . registerDocumentFormattingEditProvider ( util . documentSelector , new DocumentFormattingEditProvider ( this ) ) ;
1343
- this . formattingRangeProviderDisposable = vscode . languages . registerDocumentRangeFormattingEditProvider ( util . documentSelector , new DocumentRangeFormattingEditProvider ( this ) ) ;
1344
- this . onTypeFormattingProviderDisposable = vscode . languages . registerOnTypeFormattingEditProvider ( util . documentSelector , new OnTypeFormattingEditProvider ( this ) , ";" , "}" , "\n" ) ;
1355
+ this . documentFormattingProviderDisposable = vscode . languages . registerDocumentFormattingEditProvider ( util . documentSelector , instrument ( new DocumentFormattingEditProvider ( this ) ) ) ;
1356
+ this . formattingRangeProviderDisposable = vscode . languages . registerDocumentRangeFormattingEditProvider ( util . documentSelector , instrument ( new DocumentRangeFormattingEditProvider ( this ) ) ) ;
1357
+ this . onTypeFormattingProviderDisposable = vscode . languages . registerOnTypeFormattingEditProvider ( util . documentSelector , instrument ( new OnTypeFormattingEditProvider ( this ) ) , ";" , "}" , "\n" ) ;
1345
1358
1346
1359
this . codeFoldingProvider = new FoldingRangeProvider ( this ) ;
1347
- this . codeFoldingProviderDisposable = vscode . languages . registerFoldingRangeProvider ( util . documentSelector , this . codeFoldingProvider ) ;
1360
+ this . codeFoldingProviderDisposable = vscode . languages . registerFoldingRangeProvider ( util . documentSelector , instrument ( this . codeFoldingProvider ) ) ;
1348
1361
1349
1362
if ( settings . isEnhancedColorizationEnabled && semanticTokensLegend ) {
1350
- this . semanticTokensProvider = new SemanticTokensProvider ( ) ;
1363
+ this . semanticTokensProvider = instrument ( new SemanticTokensProvider ( ) ) ;
1351
1364
this . semanticTokensProviderDisposable = vscode . languages . registerDocumentSemanticTokensProvider ( util . documentSelector , this . semanticTokensProvider , semanticTokensLegend ) ;
1352
1365
}
1353
1366
@@ -1730,8 +1743,7 @@ export class DefaultClient implements Client {
1730
1743
const oldLoggingLevelLogged : boolean = this . loggingLevel > 1 ;
1731
1744
this . loggingLevel = util . getNumericLoggingLevel ( changedSettings . loggingLevel ) ;
1732
1745
if ( oldLoggingLevelLogged || this . loggingLevel > 1 ) {
1733
- const out : Logger = getOutputChannelLogger ( ) ;
1734
- out . appendLine ( localize ( { key : "loggingLevel.changed" , comment : [ "{0} is the setting name 'loggingLevel', {1} is a string value such as 'Debug'" ] } , "{0} has changed to: {1}" , "loggingLevel" , changedSettings . loggingLevel ) ) ;
1746
+ getOutputChannelLogger ( ) . appendLine ( localize ( { key : "loggingLevel.changed" , comment : [ "{0} is the setting name 'loggingLevel', {1} is a string value such as 'Debug'" ] } , "{0} has changed to: {1}" , "loggingLevel" , changedSettings . loggingLevel ) ) ;
1735
1747
}
1736
1748
}
1737
1749
const settings : CppSettings = new CppSettings ( ) ;
@@ -2746,12 +2758,7 @@ export class DefaultClient implements Client {
2746
2758
const status : IntelliSenseStatus = { status : Status . IntelliSenseCompiling } ;
2747
2759
testHook . updateStatus ( status ) ;
2748
2760
} else if ( message . endsWith ( "IntelliSense done" ) ) {
2749
- const settings : CppSettings = new CppSettings ( ) ;
2750
- if ( util . getNumericLoggingLevel ( settings . loggingLevel ) >= 6 ) {
2751
- const out : Logger = getOutputChannelLogger ( ) ;
2752
- const duration : number = Date . now ( ) - timeStamp ;
2753
- out . appendLine ( localize ( "update.intellisense.time" , "Update IntelliSense time (sec): {0}" , duration / 1000 ) ) ;
2754
- }
2761
+ getOutputChannelLogger ( ) . appendLineAtLevel ( 6 , localize ( "update.intellisense.time" , "Update IntelliSense time (sec): {0}" , ( Date . now ( ) - timeStamp ) / 1000 ) ) ;
2755
2762
this . model . isUpdatingIntelliSense . Value = false ;
2756
2763
const status : IntelliSenseStatus = { status : Status . IntelliSenseReady } ;
2757
2764
testHook . updateStatus ( status ) ;
@@ -3183,11 +3190,8 @@ export class DefaultClient implements Client {
3183
3190
return ;
3184
3191
}
3185
3192
3186
- const settings : CppSettings = new CppSettings ( ) ;
3187
3193
const out : Logger = getOutputChannelLogger ( ) ;
3188
- if ( util . getNumericLoggingLevel ( settings . loggingLevel ) >= 6 ) {
3189
- out . appendLine ( localize ( "configurations.received" , "Custom configurations received:" ) ) ;
3190
- }
3194
+ out . appendLineAtLevel ( 6 , localize ( "configurations.received" , "Custom configurations received:" ) ) ;
3191
3195
const sanitized : SourceFileConfigurationItemAdapter [ ] = [ ] ;
3192
3196
configs . forEach ( item => {
3193
3197
if ( this . isSourceFileConfigurationItem ( item , providerVersion ) ) {
@@ -3199,10 +3203,8 @@ export class DefaultClient implements Client {
3199
3203
uri = item . uri . toString ( ) ;
3200
3204
}
3201
3205
this . configurationLogging . set ( uri , JSON . stringify ( item . configuration , null , 4 ) ) ;
3202
- if ( util . getNumericLoggingLevel ( settings . loggingLevel ) >= 6 ) {
3203
- out . appendLine ( ` uri: ${ uri } ` ) ;
3204
- out . appendLine ( ` config: ${ JSON . stringify ( item . configuration , null , 2 ) } ` ) ;
3205
- }
3206
+ out . appendLineAtLevel ( 6 , ` uri: ${ uri } ` ) ;
3207
+ out . appendLineAtLevel ( 6 , ` config: ${ JSON . stringify ( item . configuration , null , 2 ) } ` ) ;
3206
3208
if ( item . configuration . includePath . some ( path => path . endsWith ( '**' ) ) ) {
3207
3209
console . warn ( "custom include paths should not use recursive includes ('**')" ) ;
3208
3210
}
@@ -3306,11 +3308,7 @@ export class DefaultClient implements Client {
3306
3308
return ;
3307
3309
}
3308
3310
3309
- const settings : CppSettings = new CppSettings ( ) ;
3310
- if ( util . getNumericLoggingLevel ( settings . loggingLevel ) >= 6 ) {
3311
- const out : Logger = getOutputChannelLogger ( ) ;
3312
- out . appendLine ( localize ( "browse.configuration.received" , "Custom browse configuration received: {0}" , JSON . stringify ( sanitized , null , 2 ) ) ) ;
3313
- }
3311
+ getOutputChannelLogger ( ) . appendLineAtLevel ( 6 , localize ( "browse.configuration.received" , "Custom browse configuration received: {0}" , JSON . stringify ( sanitized , null , 2 ) ) ) ;
3314
3312
3315
3313
// Separate compiler path and args before sending to language client
3316
3314
if ( util . isString ( sanitized . compilerPath ) ) {
0 commit comments