11import * as vscode from 'vscode' ;
22import { ErrorsViewTab } from '../views/codeAnalytics/errorsViewTab' ;
3- import { DocumentInfoProvider , MethodInfo } from './documentInfoProvider' ;
3+ import { DocumentInfo , DocumentInfoProvider , MethodInfo } from './documentInfoProvider' ;
44import { TokenType } from './languages/tokens' ;
55import { CodeInspector } from './codeInspector' ;
6+ import { WorkspaceState } from '../state' ;
7+ import { SpanDurationsInsight } from '../views/codeAnalytics/InsightListView/SpanInsight' ;
68
79export class MethodCallErrorTooltip implements vscode . Disposable
810{
@@ -14,10 +16,11 @@ export class MethodCallErrorTooltip implements vscode.Disposable
1416 constructor (
1517 documentInfoProvider : DocumentInfoProvider ,
1618 codeInspector : CodeInspector ,
19+ workspaceState : WorkspaceState
1720 ) {
1821 this . _disposables . push ( vscode . languages . registerHoverProvider (
1922 documentInfoProvider . symbolProvider . languageExtractors . map ( x => x . documentFilter ) ,
20- new MethodCallErrorHoverProvider ( documentInfoProvider , codeInspector ) )
23+ new MethodCallErrorHoverProvider ( documentInfoProvider , codeInspector , workspaceState ) )
2124 ) ;
2225 this . _disposables . push ( vscode . commands . registerCommand ( MethodCallErrorTooltip . Commands . ShowErrorView , async ( args ) => {
2326 await vscode . commands . executeCommand ( ErrorsViewTab . Commands . ShowErrorView , args . codeObjectId , args . codeObjectDisplayName , args . errorFlowId ) ;
@@ -36,6 +39,7 @@ class MethodCallErrorHoverProvider implements vscode.HoverProvider
3639 constructor (
3740 private _documentInfoProvider : DocumentInfoProvider ,
3841 private _codeInspector : CodeInspector ,
42+ private _workspaceState : WorkspaceState
3943 ) {
4044 }
4145
@@ -46,15 +50,24 @@ class MethodCallErrorHoverProvider implements vscode.HoverProvider
4650 return ;
4751
4852 let methodInfo : MethodInfo | undefined = sourceDocInfo ?. methods . firstOrDefault ( ( m ) => m . nameRange ?. contains ( position ) ?? false ) ;
53+ let remoteDoc : DocumentInfo | undefined = undefined ;
4954 if ( ! methodInfo ) {
5055 if ( ! sourceDocInfo . tokens . any ( t => ( t . type == TokenType . function || t . type == TokenType . method ) && t . range . contains ( position ) ) )
5156 return ;
5257 methodInfo = await this . _codeInspector . getExecuteDefinitionMethodInfo ( document , position , this . _documentInfoProvider ) ;
5358 if ( ! methodInfo ) {
5459 return ;
5560 }
61+ remoteDoc = await this . _codeInspector . getDocumentInfo ( document , position , this . _documentInfoProvider ) ;
62+ if ( ! methodInfo ) {
63+ return ;
64+ }
65+
66+ }
67+ if ( ! remoteDoc ) {
68+ return ;
5669 }
57- const markdown = await this . getMethodMarkdown ( methodInfo ) ;
70+ const markdown = await this . getMethodMarkdown ( methodInfo , remoteDoc ) ;
5871 if ( markdown )
5972 {
6073 return new vscode . Hover ( markdown ) ;
@@ -79,13 +92,48 @@ class MethodCallErrorHoverProvider implements vscode.HoverProvider
7992 //return new vscode.Hover(markdown);
8093 }
8194
82- private async getMethodMarkdown ( methodInfo : MethodInfo ) : Promise < vscode . MarkdownString | undefined >
95+ private async getMethodMarkdown ( methodInfo : MethodInfo , remoteDoc : DocumentInfo ) : Promise < vscode . MarkdownString | undefined >
8396 {
97+ let markdown = new vscode . MarkdownString ( '' , true ) ;
98+
99+
100+ const insights = remoteDoc . insights . forMethod ( methodInfo , this . _workspaceState . environment ) ;
101+ const importantInsights = insights . filter ( x => x . importance < 4 ) ;
102+ if ( importantInsights . length > 0 ) {
103+ markdown . appendMarkdown ( ` <span style="color:#FF0000;"><i>${ importantInsights . map ( x => x . name ) . join ( ' ' ) } </i></span>` ) ;
104+ markdown . appendText ( '\n' ) ;
105+
106+ }
107+
108+ const perfStats = insights . filter ( x => x . name == "Performance Stats" ) ;
109+ for ( var stat of perfStats ) {
110+
111+ const durationInsight : SpanDurationsInsight = stat as SpanDurationsInsight ;
112+
113+ const p50 = durationInsight . percentiles . filter ( x => x . percentile == 0.5 )
114+ . firstOrDefault ( ) ;
115+ const p95 = durationInsight . percentiles . filter ( x => x . percentile == 0.95 ) . firstOrDefault ( ) ;
116+ const spanName = durationInsight . span . displayName ;
117+
118+ if ( p50 || p95 ) {
119+ markdown . appendText ( `${ spanName } Duration: ` )
120+ if ( p50 != null ) {
121+ markdown . appendText ( `${ p50 . currentDuration . value } ${ p50 . currentDuration . unit } (Median) ` ) ;
122+ }
123+
124+ if ( p95 != null ) {
125+ markdown . appendText ( `${ p95 . currentDuration . value } ${ p95 . currentDuration . unit } (P95) ` ) ;
126+ }
127+ markdown . appendText ( '\n' ) ;
128+ }
129+
130+
131+
132+ }
84133 const errors = await this . _documentInfoProvider . analyticsProvider . getCodeObjectsErrors ( methodInfo . idsWithType ) ;
85134 if ( ! errors ?. length )
86135 return ;
87136
88- let markdown = new vscode . MarkdownString ( '' , true ) ;
89137 markdown . appendText ( 'Throws:\n' ) ;
90138 for ( let error of errors )
91139 {
@@ -96,6 +144,8 @@ class MethodCallErrorHoverProvider implements vscode.HoverProvider
96144 markdown . appendMarkdown ( ` \u00B7 [$(link-external)](command:${ command } ?${ args } "Show in side panel") ` ) ;
97145 markdown . appendText ( '\n' ) ;
98146 }
147+
148+
99149 markdown . supportHtml = true ;
100150 markdown . isTrusted = true ;
101151 return markdown ;
0 commit comments