11// Copyright (c) Microsoft Corporation.
22// Licensed under the MIT License.
33
4+ using System . Threading ;
5+ using System . Threading . Tasks ;
46using Microsoft . Extensions . Logging ;
57using Microsoft . PowerShell . EditorServices . Services ;
6- using Microsoft . PowerShell . EditorServices . Services . DebugAdapter ;
78using Microsoft . PowerShell . EditorServices . Services . PowerShell ;
89using Microsoft . PowerShell . EditorServices . Services . PowerShell . Debugging ;
910using Microsoft . PowerShell . EditorServices . Services . PowerShell . Execution ;
10- using Microsoft . PowerShell . EditorServices . Services . PowerShell . Runspace ;
1111using Microsoft . PowerShell . EditorServices . Services . TextDocument ;
1212using Microsoft . PowerShell . EditorServices . Utility ;
1313using OmniSharp . Extensions . DebugAdapter . Protocol . Events ;
1414using OmniSharp . Extensions . DebugAdapter . Protocol . Requests ;
1515using OmniSharp . Extensions . DebugAdapter . Protocol . Server ;
16- using System . Management . Automation ;
17- using System . Management . Automation . Language ;
18- using System . Threading ;
19- using System . Threading . Tasks ;
2016
2117namespace Microsoft . PowerShell . EditorServices . Handlers
2218{
@@ -38,9 +34,7 @@ internal class ConfigurationDoneHandler : IConfigurationDoneHandler
3834 private readonly DebugEventHandlerService _debugEventHandlerService ;
3935 private readonly IInternalPowerShellExecutionService _executionService ;
4036 private readonly WorkspaceService _workspaceService ;
41-
4237 private readonly IPowerShellDebugContext _debugContext ;
43- private readonly IRunspaceContext _runspaceContext ;
4438
4539 public ConfigurationDoneHandler (
4640 ILoggerFactory loggerFactory ,
@@ -50,8 +44,7 @@ public ConfigurationDoneHandler(
5044 DebugEventHandlerService debugEventHandlerService ,
5145 IInternalPowerShellExecutionService executionService ,
5246 WorkspaceService workspaceService ,
53- IPowerShellDebugContext debugContext ,
54- IRunspaceContext runspaceContext )
47+ IPowerShellDebugContext debugContext )
5548 {
5649 _logger = loggerFactory . CreateLogger < ConfigurationDoneHandler > ( ) ;
5750 _debugAdapterServer = debugAdapterServer ;
@@ -61,23 +54,18 @@ public ConfigurationDoneHandler(
6154 _executionService = executionService ;
6255 _workspaceService = workspaceService ;
6356 _debugContext = debugContext ;
64- _runspaceContext = runspaceContext ;
6557 }
6658
6759 public Task < ConfigurationDoneResponse > Handle ( ConfigurationDoneArguments request , CancellationToken cancellationToken )
6860 {
6961 _debugService . IsClientAttached = true ;
7062
71- if ( _debugStateService . OwnsEditorSession )
72- {
73- // TODO: If this is a debug-only session, we need to start the command loop manually
74- //
75- //_powerShellContextService.ConsoleReader.StartCommandLoop();
76- }
77-
7863 if ( ! string . IsNullOrEmpty ( _debugStateService . ScriptToLaunch ) )
7964 {
80- LaunchScriptAsync ( _debugStateService . ScriptToLaunch ) . HandleErrorsAsync ( _logger ) ;
65+ // NOTE: This is an unawaited task because responding to "configuration done" means
66+ // setting up the debugger, and in our case that means starting the script but not
67+ // waiting for it to finish.
68+ Task _ = LaunchScriptAsync ( _debugStateService . ScriptToLaunch ) . HandleErrorsAsync ( _logger ) ;
8169 }
8270
8371 if ( _debugStateService . IsInteractiveDebugSession && _debugService . IsDebuggerStopped )
@@ -102,48 +90,18 @@ public Task<ConfigurationDoneResponse> Handle(ConfigurationDoneArguments request
10290
10391 private async Task LaunchScriptAsync ( string scriptToLaunch )
10492 {
105- // Is this an untitled script?
106- if ( ScriptFile . IsUntitledPath ( scriptToLaunch ) )
107- {
108- ScriptFile untitledScript = _workspaceService . GetFile ( scriptToLaunch ) ;
109-
110- if ( BreakpointApiUtils . SupportsBreakpointApis ( _runspaceContext . CurrentRunspace ) )
111- {
112- // Parse untitled files with their `Untitled:` URI as the file name which will cache the URI & contents within the PowerShell parser.
113- // By doing this, we light up the ability to debug Untitled files with breakpoints.
114- // This is only possible via the direct usage of the breakpoint APIs in PowerShell because
115- // Set-PSBreakpoint validates that paths are actually on the filesystem.
116- ScriptBlockAst ast = Parser . ParseInput ( untitledScript . Contents , untitledScript . DocumentUri . ToString ( ) , out Token [ ] tokens , out ParseError [ ] errors ) ;
117-
118- // This seems to be the simplest way to invoke a script block (which contains breakpoint information) via the PowerShell API.
119- //
120- // TODO: Fix this so the added script doesn't show up.
121- var cmd = new PSCommand ( ) . AddScript ( ". $args[0]" ) . AddArgument ( ast . GetScriptBlock ( ) ) ;
122- await _executionService
123- . ExecutePSCommandAsync < object > ( cmd , CancellationToken . None , s_debuggerExecutionOptions )
124- . ConfigureAwait ( false ) ;
125- }
126- else
127- {
128- await _executionService
129- . ExecutePSCommandAsync (
130- new PSCommand ( ) . AddScript ( untitledScript . Contents ) ,
131- CancellationToken . None ,
132- s_debuggerExecutionOptions )
133- . ConfigureAwait ( false ) ;
134- }
135- }
136- else
137- {
138- // TODO: Fix this so the added script doesn't show up.
139- await _executionService
140- . ExecutePSCommandAsync (
141- PSCommandHelpers . BuildCommandFromArguments ( scriptToLaunch , _debugStateService . Arguments ) ,
142- CancellationToken . None ,
143- s_debuggerExecutionOptions )
144- . ConfigureAwait ( false ) ;
145- }
93+ // TODO: Theoretically we can make PowerShell respect line breakpoints in untitled
94+ // files, but the previous method was a hack that conflicted with correct passing of
95+ // arguments to the debugged script. We are prioritizing the latter over the former, as
96+ // command breakpoints and `Wait-Debugger` work fine.
97+ string command = ScriptFile . IsUntitledPath ( scriptToLaunch )
98+ ? string . Concat ( "{ " , _workspaceService . GetFile ( scriptToLaunch ) . Contents , " }" )
99+ : string . Concat ( '"' , scriptToLaunch , '"' ) ;
146100
101+ await _executionService . ExecutePSCommandAsync (
102+ PSCommandHelpers . BuildCommandFromArguments ( command , _debugStateService . Arguments ) ,
103+ CancellationToken . None ,
104+ s_debuggerExecutionOptions ) . ConfigureAwait ( false ) ;
147105 _debugAdapterServer . SendNotification ( EventNames . Terminated ) ;
148106 }
149107 }
0 commit comments