Push locals of automatic variables to 'DottedScopes' when dotting script cmdlets #4709
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fix #4688
When dotting a script cmdlet, the locals of automatic variables from the
PSScriptCmdlet
is not set up in the current scope before parameter binding. The fix is to push the locals inCommandProcessor.OnSetCurrentScope
and pop them inCommandProcessor.OnRestorePreviousScope
, which will be called fromSetCurrentScopeToExecutionScope
andRestorePreviousScope
respectively.Summary of changes:
When a new local scope is used, currently we set the locals for
CommandProcessor
right before parameter binding (inBindCommandLineParametersNoValidation
); we set the locals forScriptCommandProcessor
inPrepare
. I moved both to the constructor, right after the new scope is created so that the code is more consistent.In
CmdletParameterBinderController.cs
, we set up thePSBoundParameters
andMyInvocation
variables inHandleCommandLineDynamicParameters
again, which I think is unnecessary because this method is only called fromBindCommandLineParametersNoValidation
, where the setup is done for the first time.Currently, the locals will be set for dotted script cmdlet in
EnterScope()
andExitScope()
. Now, that logic is moved toOnSetCurrentScope
andOnRestorePreviousScope
ofCommandProcessor
. This not only makes sure that locals are set before parameter binding, but also is consistent with theScriptCommandProcessor
.