33
44using System ;
55using System . Collections . Generic ;
6- using System . Diagnostics ;
76using System . Linq ;
87using System . Threading ;
98using System . Threading . Tasks ;
109using Microsoft . Extensions . Logging ;
1110using Microsoft . PowerShell . EditorServices . CodeLenses ;
12- using Microsoft . PowerShell . EditorServices . Logging ;
1311using Microsoft . PowerShell . EditorServices . Services ;
1412using Microsoft . PowerShell . EditorServices . Services . TextDocument ;
1513using Microsoft . PowerShell . EditorServices . Utility ;
@@ -21,6 +19,7 @@ namespace Microsoft.PowerShell.EditorServices.Handlers
2119{
2220 internal class PsesCodeLensHandlers : CodeLensHandlerBase
2321 {
22+ private static readonly CodeLensContainer s_emptyCodeLensContainer = new ( ) ;
2423 private readonly ILogger _logger ;
2524 private readonly SymbolsService _symbolsService ;
2625 private readonly WorkspaceService _workspaceService ;
@@ -40,12 +39,17 @@ public PsesCodeLensHandlers(ILoggerFactory factory, SymbolsService symbolsServic
4039
4140 public override Task < CodeLensContainer > Handle ( CodeLensParams request , CancellationToken cancellationToken )
4241 {
42+ _logger . LogDebug ( $ "Handling code lens request for { request . TextDocument . Uri } ") ;
43+
4344 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 ) ) ;
4650 }
4751
48- public override async Task < CodeLens > Handle ( CodeLens request , CancellationToken cancellationToken )
52+ public override Task < CodeLens > Handle ( CodeLens request , CancellationToken cancellationToken )
4953 {
5054 // TODO: Catch deserialization exception on bad object
5155 CodeLensData codeLensData = request . Data . ToObject < CodeLensData > ( ) ;
@@ -55,8 +59,7 @@ public override async Task<CodeLens> Handle(CodeLens request, CancellationToken
5559 . FirstOrDefault ( provider => provider . ProviderId . Equals ( codeLensData . ProviderId , StringComparison . Ordinal ) ) ;
5660
5761 ScriptFile scriptFile = _workspaceService . GetFile ( codeLensData . Uri ) ;
58- return await originalProvider . ResolveCodeLens ( request , scriptFile , cancellationToken )
59- . ConfigureAwait ( false ) ;
62+ return originalProvider . ResolveCodeLens ( request , scriptFile , cancellationToken ) ;
6063 }
6164
6265 /// <summary>
@@ -65,43 +68,20 @@ public override async Task<CodeLens> Handle(CodeLens request, CancellationToken
6568 /// <param name="scriptFile">The PowerShell script file to get CodeLenses for.</param>
6669 /// <param name="cancellationToken"></param>
6770 /// <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 )
8572 {
86- Stopwatch invokeTimer = new ( ) ;
87- List < TResult > providerResults = new ( ) ;
88-
8973 foreach ( ICodeLensProvider provider in _symbolsService . GetCodeLensProviders ( ) )
9074 {
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 ) )
9976 {
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 ;
10183 }
10284 }
103-
104- return providerResults ;
10585 }
10686 }
10787}
0 commit comments