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
PSScriptCmdletis not set up in the current scope before parameter binding. The fix is to push the locals inCommandProcessor.OnSetCurrentScopeand pop them inCommandProcessor.OnRestorePreviousScope, which will be called fromSetCurrentScopeToExecutionScopeandRestorePreviousScoperespectively.Summary of changes:
When a new local scope is used, currently we set the locals for
CommandProcessorright before parameter binding (inBindCommandLineParametersNoValidation); we set the locals forScriptCommandProcessorinPrepare. 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 thePSBoundParametersandMyInvocationvariables inHandleCommandLineDynamicParametersagain, 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 toOnSetCurrentScopeandOnRestorePreviousScopeofCommandProcessor. This not only makes sure that locals are set before parameter binding, but also is consistent with theScriptCommandProcessor.