@@ -35,7 +35,7 @@ internal class DebugService
35
35
private readonly ILogger _logger ;
36
36
private readonly IInternalPowerShellExecutionService _executionService ;
37
37
private readonly BreakpointService _breakpointService ;
38
- private readonly RemoteFileManagerService remoteFileManager ;
38
+ private readonly RemoteFileManagerService _remoteFileManager ;
39
39
40
40
private readonly PsesInternalHost _psesHost ;
41
41
@@ -82,26 +82,6 @@ internal class DebugService
82
82
/// Initializes a new instance of the DebugService class and uses
83
83
/// the given PowerShellContext for all future operations.
84
84
/// </summary>
85
- /// <param name="powerShellContext">
86
- /// The PowerShellContext to use for all debugging operations.
87
- /// </param>
88
- /// <param name="logger">An ILogger implementation used for writing log messages.</param>
89
- //public DebugService(PowerShellContextService powerShellContext, ILogger logger)
90
- // : this(powerShellContext, null, logger)
91
- //{
92
- //}
93
-
94
- /// <summary>
95
- /// Initializes a new instance of the DebugService class and uses
96
- /// the given PowerShellContext for all future operations.
97
- /// </summary>
98
- /// <param name="powerShellContext">
99
- /// The PowerShellContext to use for all debugging operations.
100
- /// </param>
101
- //// <param name = "remoteFileManager" >
102
- //// A RemoteFileManagerService instance to use for accessing files in remote sessions.
103
- //// </param>
104
- /// <param name="logger">An ILogger implementation used for writing log messages.</param>
105
85
public DebugService (
106
86
IInternalPowerShellExecutionService executionService ,
107
87
IPowerShellDebugContext debugContext ,
@@ -120,8 +100,7 @@ public DebugService(
120
100
_debugContext . DebuggerStopped += OnDebuggerStopAsync ;
121
101
_debugContext . DebuggerResuming += OnDebuggerResuming ;
122
102
_debugContext . BreakpointUpdated += OnBreakpointUpdated ;
123
-
124
- this . remoteFileManager = remoteFileManager ;
103
+ _remoteFileManager = remoteFileManager ;
125
104
126
105
invocationTypeScriptPositionProperty =
127
106
typeof ( InvocationInfo )
@@ -150,32 +129,27 @@ public async Task<BreakpointDetails[]> SetLineBreakpointsAsync(
150
129
151
130
string scriptPath = scriptFile . FilePath ;
152
131
// Make sure we're using the remote script path
153
- if ( _psesHost . CurrentRunspace . IsOnRemoteMachine && remoteFileManager is not null )
132
+ if ( _psesHost . CurrentRunspace . IsOnRemoteMachine && _remoteFileManager is not null )
154
133
{
155
- if ( ! remoteFileManager . IsUnderRemoteTempPath ( scriptPath ) )
134
+ if ( ! _remoteFileManager . IsUnderRemoteTempPath ( scriptPath ) )
156
135
{
157
136
_logger . LogTrace ( $ "Could not set breakpoints for local path '{ scriptPath } ' in a remote session.") ;
158
-
159
137
return Array . Empty < BreakpointDetails > ( ) ;
160
138
}
161
139
162
- string mappedPath = remoteFileManager . GetMappedPath ( scriptPath , _psesHost . CurrentRunspace ) ;
163
-
164
- scriptPath = mappedPath ;
140
+ scriptPath = _remoteFileManager . GetMappedPath ( scriptPath , _psesHost . CurrentRunspace ) ;
165
141
}
166
- else if ( temporaryScriptListingPath is not null
167
- && temporaryScriptListingPath . Equals ( scriptPath , StringComparison . CurrentCultureIgnoreCase ) )
142
+ else if ( temporaryScriptListingPath ? . Equals ( scriptPath , StringComparison . CurrentCultureIgnoreCase ) == true )
168
143
{
169
144
_logger . LogTrace ( $ "Could not set breakpoint on temporary script listing path '{ scriptPath } '.") ;
170
-
171
145
return Array . Empty < BreakpointDetails > ( ) ;
172
146
}
173
147
174
148
// Fix for issue #123 - file paths that contain wildcard chars [ and ] need to
175
149
// quoted and have those wildcard chars escaped.
176
150
string escapedScriptPath = PathUtils . WildcardEscapePath ( scriptPath ) ;
177
151
178
- if ( dscBreakpoints is null || ! dscBreakpoints . IsDscResourcePath ( escapedScriptPath ) )
152
+ if ( dscBreakpoints ? . IsDscResourcePath ( escapedScriptPath ) != true )
179
153
{
180
154
if ( clearExisting )
181
155
{
@@ -185,11 +159,7 @@ public async Task<BreakpointDetails[]> SetLineBreakpointsAsync(
185
159
return ( await _breakpointService . SetBreakpointsAsync ( escapedScriptPath , breakpoints ) . ConfigureAwait ( false ) ) . ToArray ( ) ;
186
160
}
187
161
188
- return await dscBreakpoints . SetLineBreakpointsAsync (
189
- _executionService ,
190
- escapedScriptPath ,
191
- breakpoints )
192
- . ConfigureAwait ( false ) ;
162
+ return await dscBreakpoints . SetLineBreakpointsAsync ( _executionService , escapedScriptPath , breakpoints ) . ConfigureAwait ( false ) ;
193
163
}
194
164
195
165
/// <summary>
@@ -362,7 +332,7 @@ public VariableDetailsBase GetVariableFromExpression(string variableExpression)
362
332
variableName ,
363
333
StringComparison . CurrentCultureIgnoreCase ) ) ;
364
334
365
- if ( resolvedVariable is not null && resolvedVariable . IsExpandable )
335
+ if ( resolvedVariable ? . IsExpandable == true )
366
336
{
367
337
// Continue by searching in this variable's children.
368
338
variableList = GetVariables ( resolvedVariable . Id ) ;
@@ -476,10 +446,10 @@ public async Task<string> SetVariableAsync(int variableContainerReferenceId, str
476
446
{
477
447
_logger . LogTrace ( $ "Setting variable '{ name } ' using conversion to value: { expressionResult ?? "<null>" } ") ;
478
448
479
- psVariable . Value = await _executionService . ExecuteDelegateAsync < object > (
449
+ psVariable . Value = await _executionService . ExecuteDelegateAsync (
480
450
"PS debugger argument converter" ,
481
451
ExecutionOptions . Default ,
482
- ( pwsh , cancellationToken ) =>
452
+ ( pwsh , _ ) =>
483
453
{
484
454
var engineIntrinsics = ( EngineIntrinsics ) pwsh . Runspace . SessionStateProxy . GetVariable ( "ExecutionContext" ) ;
485
455
@@ -634,17 +604,14 @@ private async Task FetchStackFramesAndVariablesAsync(string scriptNameOverride)
634
604
nextVariableId = VariableDetailsBase . FirstVariableId ;
635
605
variables = new List < VariableDetailsBase >
636
606
{
637
-
638
607
// Create a dummy variable for index 0, should never see this.
639
608
new VariableDetails ( "Dummy" , null )
640
609
} ;
641
610
642
611
// Must retrieve in order of broadest to narrowest scope for efficient
643
612
// deduplication: global, script, local.
644
613
globalScopeVariables = await FetchVariableContainerAsync ( VariableContainerDetails . GlobalScopeName ) . ConfigureAwait ( false ) ;
645
-
646
614
scriptScopeVariables = await FetchVariableContainerAsync ( VariableContainerDetails . ScriptScopeName ) . ConfigureAwait ( false ) ;
647
-
648
615
localScopeVariables = await FetchVariableContainerAsync ( VariableContainerDetails . LocalScopeName ) . ConfigureAwait ( false ) ;
649
616
650
617
await FetchStackFramesAsync ( scriptNameOverride ) . ConfigureAwait ( false ) ;
@@ -662,9 +629,7 @@ private Task<VariableContainerDetails> FetchVariableContainerAsync(string scope)
662
629
663
630
private async Task < VariableContainerDetails > FetchVariableContainerAsync ( string scope , bool autoVarsOnly )
664
631
{
665
- PSCommand psCommand = new PSCommand ( )
666
- . AddCommand ( "Get-Variable" )
667
- . AddParameter ( "Scope" , scope ) ;
632
+ PSCommand psCommand = new PSCommand ( ) . AddCommand ( "Get-Variable" ) . AddParameter ( "Scope" , scope ) ;
668
633
669
634
var scopeVariableContainer = new VariableContainerDetails ( nextVariableId ++ , "Scope: " + scope ) ;
670
635
variables . Add ( scopeVariableContainer ) ;
@@ -674,17 +639,13 @@ private async Task<VariableContainerDetails> FetchVariableContainerAsync(string
674
639
{
675
640
results = await _executionService . ExecutePSCommandAsync < PSObject > ( psCommand , CancellationToken . None ) . ConfigureAwait ( false ) ;
676
641
}
677
- catch ( CmdletInvocationException ex )
642
+ // It's possible to be asked to run `Get-Variable -Scope N` where N is a number that
643
+ // exceeds the available scopes. In this case, the command throws this exception, but
644
+ // there's nothing we can do about it, nor can we know the number of scopes that exist,
645
+ // and we shouldn't crash the debugger, so we just return no results instead. All other
646
+ // exceptions should be thrown again.
647
+ catch ( CmdletInvocationException ex ) when ( ex . ErrorRecord . CategoryInfo . Reason . Equals ( "PSArgumentOutOfRangeException" ) )
678
648
{
679
- // It's possible to be asked to run `Get-Variable -Scope N` where N is a number that
680
- // exceeds the available scopes. In this case, the command throws this exception,
681
- // but there's nothing we can do about it, nor can we know the number of scopes that
682
- // exist, and we shouldn't crash the debugger, so we just return no results instead.
683
- // All other exceptions should be thrown again.
684
- if ( ! ex . ErrorRecord . CategoryInfo . Reason . Equals ( "PSArgumentOutOfRangeException" ) )
685
- {
686
- throw ;
687
- }
688
649
results = null ;
689
650
}
690
651
@@ -749,8 +710,8 @@ private static bool ShouldAddAsVariable(VariableInfo variableInfo)
749
710
{
750
711
// Filter built-in constant or readonly variables like $true, $false, $null, etc.
751
712
ScopedItemOptions variableScope = variableInfo . Variable . Options ;
752
- var constantAllScope = ScopedItemOptions . AllScope | ScopedItemOptions . Constant ;
753
- var readonlyAllScope = ScopedItemOptions . AllScope | ScopedItemOptions . ReadOnly ;
713
+ const ScopedItemOptions constantAllScope = ScopedItemOptions . AllScope | ScopedItemOptions . Constant ;
714
+ const ScopedItemOptions readonlyAllScope = ScopedItemOptions . AllScope | ScopedItemOptions . ReadOnly ;
754
715
if ( ( ( variableScope & constantAllScope ) == constantAllScope )
755
716
|| ( ( variableScope & readonlyAllScope ) == readonlyAllScope ) )
756
717
{
@@ -909,11 +870,11 @@ private async Task FetchStackFramesAsync(string scriptNameOverride)
909
870
stackFrameDetailsEntry . ScriptPath = scriptNameOverride ;
910
871
}
911
872
else if ( isOnRemoteMachine
912
- && remoteFileManager is not null
873
+ && _remoteFileManager is not null
913
874
&& ! string . Equals ( stackFrameScriptPath , StackFrameDetails . NoFileScriptPath ) )
914
875
{
915
876
stackFrameDetailsEntry . ScriptPath =
916
- remoteFileManager . GetMappedPath ( stackFrameScriptPath , _psesHost . CurrentRunspace ) ;
877
+ _remoteFileManager . GetMappedPath ( stackFrameScriptPath , _psesHost . CurrentRunspace ) ;
917
878
}
918
879
919
880
stackFrameDetailList . Add ( stackFrameDetailsEntry ) ;
@@ -957,7 +918,7 @@ internal async void OnDebuggerStopAsync(object sender, DebuggerStopEventArgs e)
957
918
string localScriptPath = e . InvocationInfo ? . ScriptName ;
958
919
959
920
// If there's no ScriptName, get the "list" of the current source
960
- if ( remoteFileManager is not null && string . IsNullOrEmpty ( localScriptPath ) )
921
+ if ( _remoteFileManager is not null && string . IsNullOrEmpty ( localScriptPath ) )
961
922
{
962
923
// Get the current script listing and create the buffer
963
924
PSCommand command = new PSCommand ( ) . AddScript ( $ "list 1 { int . MaxValue } ") ;
@@ -978,7 +939,7 @@ await _executionService.ExecutePSCommandAsync<PSObject>(
978
939
. Where ( s => s is not null ) ) ;
979
940
980
941
temporaryScriptListingPath =
981
- remoteFileManager . CreateTemporaryFile (
942
+ _remoteFileManager . CreateTemporaryFile (
982
943
$ "[{ _psesHost . CurrentRunspace . SessionDetails . ComputerName } ] { TemporaryScriptFileName } ",
983
944
scriptListing ,
984
945
_psesHost . CurrentRunspace ) ;
@@ -1001,19 +962,18 @@ await _executionService.ExecutePSCommandAsync<PSObject>(
1001
962
// If this is a remote connection and the debugger stopped at a line
1002
963
// in a script file, get the file contents
1003
964
if ( _psesHost . CurrentRunspace . IsOnRemoteMachine
1004
- && remoteFileManager is not null
965
+ && _remoteFileManager is not null
1005
966
&& ! noScriptName )
1006
967
{
1007
968
localScriptPath =
1008
- await remoteFileManager . FetchRemoteFileAsync (
969
+ await _remoteFileManager . FetchRemoteFileAsync (
1009
970
e . InvocationInfo . ScriptName ,
1010
971
_psesHost . CurrentRunspace ) . ConfigureAwait ( false ) ;
1011
972
}
1012
973
1013
974
if ( stackFrameDetails . Length > 0 )
1014
975
{
1015
976
// Augment the top stack frame with details from the stop event
1016
-
1017
977
if ( e . InvocationInfo is not null
1018
978
&& invocationTypeScriptPositionProperty . GetValue ( e . InvocationInfo ) is IScriptExtent scriptExtent )
1019
979
{
@@ -1056,9 +1016,9 @@ private void OnBreakpointUpdated(object sender, BreakpointUpdatedEventArgs e)
1056
1016
// TODO: This could be either a path or a script block!
1057
1017
string scriptPath = lineBreakpoint . Script ;
1058
1018
if ( _psesHost . CurrentRunspace . IsOnRemoteMachine
1059
- && remoteFileManager is not null )
1019
+ && _remoteFileManager is not null )
1060
1020
{
1061
- string mappedPath = remoteFileManager . GetMappedPath ( scriptPath , _psesHost . CurrentRunspace ) ;
1021
+ string mappedPath = _remoteFileManager . GetMappedPath ( scriptPath , _psesHost . CurrentRunspace ) ;
1062
1022
1063
1023
if ( mappedPath is null )
1064
1024
{
0 commit comments