3
3
4
4
using System ;
5
5
using System . Collections . Generic ;
6
- using System . Diagnostics ;
7
6
using System . Linq ;
8
7
using System . Threading ;
9
8
using System . Threading . Tasks ;
10
9
using Microsoft . Extensions . Logging ;
11
10
using Microsoft . PowerShell . EditorServices . CodeLenses ;
12
- using Microsoft . PowerShell . EditorServices . Logging ;
13
11
using Microsoft . PowerShell . EditorServices . Services ;
14
12
using Microsoft . PowerShell . EditorServices . Services . TextDocument ;
15
13
using Microsoft . PowerShell . EditorServices . Utility ;
@@ -21,6 +19,7 @@ namespace Microsoft.PowerShell.EditorServices.Handlers
21
19
{
22
20
internal class PsesCodeLensHandlers : CodeLensHandlerBase
23
21
{
22
+ private static readonly CodeLensContainer s_emptyCodeLensContainer = new ( ) ;
24
23
private readonly ILogger _logger ;
25
24
private readonly SymbolsService _symbolsService ;
26
25
private readonly WorkspaceService _workspaceService ;
@@ -40,12 +39,17 @@ public PsesCodeLensHandlers(ILoggerFactory factory, SymbolsService symbolsServic
40
39
41
40
public override Task < CodeLensContainer > Handle ( CodeLensParams request , CancellationToken cancellationToken )
42
41
{
42
+ _logger . LogDebug ( $ "Handling code lens request for { request . TextDocument . Uri } ") ;
43
+
43
44
ScriptFile scriptFile = _workspaceService . GetFile ( request . TextDocument . Uri ) ;
44
- CodeLens [ ] codeLensResults = ProvideCodeLenses ( scriptFile , cancellationToken ) ;
45
- return Task . FromResult ( new CodeLensContainer ( codeLensResults ) ) ;
45
+ IEnumerable < CodeLens > codeLensResults = ProvideCodeLenses ( scriptFile , cancellationToken ) ;
46
+
47
+ return ! codeLensResults . Any ( )
48
+ ? Task . FromResult ( s_emptyCodeLensContainer )
49
+ : Task . FromResult ( new CodeLensContainer ( codeLensResults ) ) ;
46
50
}
47
51
48
- public override async Task < CodeLens > Handle ( CodeLens request , CancellationToken cancellationToken )
52
+ public override Task < CodeLens > Handle ( CodeLens request , CancellationToken cancellationToken )
49
53
{
50
54
// TODO: Catch deserialization exception on bad object
51
55
CodeLensData codeLensData = request . Data . ToObject < CodeLensData > ( ) ;
@@ -55,8 +59,7 @@ public override async Task<CodeLens> Handle(CodeLens request, CancellationToken
55
59
. FirstOrDefault ( provider => provider . ProviderId . Equals ( codeLensData . ProviderId , StringComparison . Ordinal ) ) ;
56
60
57
61
ScriptFile scriptFile = _workspaceService . GetFile ( codeLensData . Uri ) ;
58
- return await originalProvider . ResolveCodeLens ( request , scriptFile , cancellationToken )
59
- . ConfigureAwait ( false ) ;
62
+ return originalProvider . ResolveCodeLens ( request , scriptFile , cancellationToken ) ;
60
63
}
61
64
62
65
/// <summary>
@@ -65,43 +68,20 @@ public override async Task<CodeLens> Handle(CodeLens request, CancellationToken
65
68
/// <param name="scriptFile">The PowerShell script file to get CodeLenses for.</param>
66
69
/// <param name="cancellationToken"></param>
67
70
/// <returns>All generated CodeLenses for the given script file.</returns>
68
- private CodeLens [ ] ProvideCodeLenses ( ScriptFile scriptFile , CancellationToken cancellationToken )
69
- {
70
- return InvokeProviders ( provider => provider . ProvideCodeLenses ( scriptFile , cancellationToken ) )
71
- . SelectMany ( codeLens => codeLens )
72
- . ToArray ( ) ;
73
- }
74
-
75
- /// <summary>
76
- /// Invokes the given function synchronously against all
77
- /// registered providers.
78
- /// </summary>
79
- /// <param name="invokeFunc">The function to be invoked.</param>
80
- /// <returns>
81
- /// An IEnumerable containing the results of all providers
82
- /// that were invoked successfully.
83
- /// </returns>
84
- private IEnumerable < TResult > InvokeProviders < TResult > ( Func < ICodeLensProvider , TResult > invokeFunc )
71
+ private IEnumerable < CodeLens > ProvideCodeLenses ( ScriptFile scriptFile , CancellationToken cancellationToken )
85
72
{
86
- Stopwatch invokeTimer = new ( ) ;
87
- List < TResult > providerResults = new ( ) ;
88
-
89
73
foreach ( ICodeLensProvider provider in _symbolsService . GetCodeLensProviders ( ) )
90
74
{
91
- try
92
- {
93
- invokeTimer . Restart ( ) ;
94
- providerResults . Add ( invokeFunc ( provider ) ) ;
95
- invokeTimer . Stop ( ) ;
96
- _logger . LogTrace ( $ "Invocation of provider '{ provider . GetType ( ) . Name } ' completed in { invokeTimer . ElapsedMilliseconds } ms.") ;
97
- }
98
- catch ( Exception e )
75
+ foreach ( CodeLens codeLens in provider . ProvideCodeLenses ( scriptFile , cancellationToken ) )
99
76
{
100
- _logger . LogException ( $ "Exception caught while invoking provider { provider . GetType ( ) . Name } :", e ) ;
77
+ if ( cancellationToken . IsCancellationRequested )
78
+ {
79
+ yield break ;
80
+ }
81
+
82
+ yield return codeLens ;
101
83
}
102
84
}
103
-
104
- return providerResults ;
105
85
}
106
86
}
107
87
}
0 commit comments