@@ -38,6 +38,7 @@ import { logAndReturn } from '../Utility/Async/returns';
3838import { is } from '../Utility/System/guards' ;
3939import * as util from '../common' ;
4040import { isWindows } from '../constants' ;
41+ import { instrument , isInstrumentationEnabled } from '../instrumentation' ;
4142import { DebugProtocolParams , Logger , ShowWarningParams , getDiagnosticsChannel , getOutputChannelLogger , logDebugProtocol , logLocalized , showWarning } from '../logger' ;
4243import { localizedStringCount , lookupString } from '../nativeStrings' ;
4344import { SessionState } from '../sessionState' ;
@@ -840,6 +841,16 @@ export interface Client {
840841}
841842
842843export 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+ }
843854 return new DefaultClient ( workspaceFolder ) ;
844855}
845856
@@ -1323,31 +1334,33 @@ export class DefaultClient implements Client {
13231334 this . currentCopilotHoverEnabled = new PersistentWorkspaceState < string > ( "cpp.copilotHover" , settings . copilotHover ) ;
13241335 if ( settings . copilotHover !== "disabled" ) {
13251336 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 ) ) ) ;
13271338 }
1339+
13281340 if ( settings . copilotHover !== this . currentCopilotHoverEnabled . Value ) {
13291341 this . currentCopilotHoverEnabled . Value = settings . copilotHover ;
13301342 }
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+
13391352 // Because formatting and codeFolding can vary per folder, we need to register these providers once
13401353 // and leave them registered. The decision of whether to provide results needs to be made on a per folder basis,
13411354 // 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" ) ;
13451358
13461359 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 ) ) ;
13481361
13491362 if ( settings . isEnhancedColorizationEnabled && semanticTokensLegend ) {
1350- this . semanticTokensProvider = new SemanticTokensProvider ( ) ;
1363+ this . semanticTokensProvider = instrument ( new SemanticTokensProvider ( ) ) ;
13511364 this . semanticTokensProviderDisposable = vscode . languages . registerDocumentSemanticTokensProvider ( util . documentSelector , this . semanticTokensProvider , semanticTokensLegend ) ;
13521365 }
13531366
@@ -1730,8 +1743,7 @@ export class DefaultClient implements Client {
17301743 const oldLoggingLevelLogged : boolean = this . loggingLevel > 1 ;
17311744 this . loggingLevel = util . getNumericLoggingLevel ( changedSettings . loggingLevel ) ;
17321745 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 ) ) ;
17351747 }
17361748 }
17371749 const settings : CppSettings = new CppSettings ( ) ;
@@ -2746,12 +2758,7 @@ export class DefaultClient implements Client {
27462758 const status : IntelliSenseStatus = { status : Status . IntelliSenseCompiling } ;
27472759 testHook . updateStatus ( status ) ;
27482760 } 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 ) ) ;
27552762 this . model . isUpdatingIntelliSense . Value = false ;
27562763 const status : IntelliSenseStatus = { status : Status . IntelliSenseReady } ;
27572764 testHook . updateStatus ( status ) ;
@@ -3183,11 +3190,8 @@ export class DefaultClient implements Client {
31833190 return ;
31843191 }
31853192
3186- const settings : CppSettings = new CppSettings ( ) ;
31873193 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:" ) ) ;
31913195 const sanitized : SourceFileConfigurationItemAdapter [ ] = [ ] ;
31923196 configs . forEach ( item => {
31933197 if ( this . isSourceFileConfigurationItem ( item , providerVersion ) ) {
@@ -3199,10 +3203,8 @@ export class DefaultClient implements Client {
31993203 uri = item . uri . toString ( ) ;
32003204 }
32013205 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 ) } ` ) ;
32063208 if ( item . configuration . includePath . some ( path => path . endsWith ( '**' ) ) ) {
32073209 console . warn ( "custom include paths should not use recursive includes ('**')" ) ;
32083210 }
@@ -3306,11 +3308,7 @@ export class DefaultClient implements Client {
33063308 return ;
33073309 }
33083310
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 ) ) ) ;
33143312
33153313 // Separate compiler path and args before sending to language client
33163314 if ( util . isString ( sanitized . compilerPath ) ) {
0 commit comments