Skip to content

Distinguish script-defined functions from DSC resources - #2297

Draft
Christoph Bergmeister (bergmeister) with Copilot wants to merge 8 commits into
copilot/fix-auto-correct-aliasesfrom
fix/dsc-script-local-command
Draft

Christoph Bergmeister (bergmeister) with Copilot wants to merge 8 commits into
copilot/fix-auto-correct-aliasesfrom
fix/dsc-script-local-command

Conversation

Copilot AI commented Oct 29, 2026

Copy link
Copy Markdown
Contributor

PR Summary

Follow-up to #2270, targeting its branch rather than main.

The review finding is reproducible: a resource-shaped call to a script-defined function is treated as a DSC declaration because command discovery uses a separate runspace. Commands inside its script block arguments are then incorrectly suppressed. Both new regression cases returned zero diagnostics before the fix instead of the two expected diagnostics.

  • Recognize function declarations in enclosing script-block scopes, case-insensitively, without searching unrelated nested scopes.
  • Use that information consistently for resource declarations and their same-line/following-line bodies. Do not apply implicit Get- prefix corrections to script-defined function calls; preserve explicit alias handling.
  • Cover script-level and configuration-level functions, both brace layouts, unrelated scopes, and formatter behavior. Document the distinction.

Validation: .NET 8 and .NET Framework 4.6.2 builds succeeded. Alias tests: 23 passed, 2 Windows-only tests skipped on Linux. Formatter integration tests: 10 passed. Executed using PowerShell 7.4.13 and Pester 5.7.1; the configured Pester 6.0.1 package was unavailable from the accessible mirror.

PR Checklist

  • PR has a meaningful title
  • Summarized changes
  • Change is not breaking
  • All changed source files have the correct copyright header
  • Added regression tests and updated documentation
  • This PR is ready to merge and is not Work in Progress (opened as a draft)

Resolve visible function declarations from the AST when classifying DSC resource syntax and checking implicit Get-prefix aliases. Preserve analysis of executable function arguments for both brace layouts.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Scoped function declarations are mishandled, causing incorrect alias rewrites and suppressed diagnostics, while repeated scope scans introduce quadratic analysis overhead.

2 open issues
What changed in this PR

This follow-up to #2270 distinguishes script-defined function calls from DSC resource declarations so alias analysis preserves function names while checking commands in their script-block arguments.

Changes:

  • Adds case-insensitive function lookup in enclosing script-block scopes and reuses it in DSC classification.
  • Adds regression coverage for function scope, brace layouts, unrelated scopes, and formatter behavior.
  • Documents the distinction between functions, DSC resources, and implicit aliases.
File Description
Tests/​Rules/​AvoidUsingAlias.tests.ps1 Adds function-detection and formatter regression tests.
Rules/​AvoidAlias.cs Uses script-defined function detection in alias and DSC handling.
docs/​Rules/​AvoidUsingCmdletAliases.md Explains function and DSC resource exclusions from implicit alias correction.

Review effort: Balanced

Comment thread Rules/AvoidAlias.cs Outdated
Comment thread Rules/AvoidAlias.cs Outdated
Co-authored-by: bergmeister <9250262+bergmeister@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Scope handling still changes command resolution for dot-sourced private functions and incorrectly treats script/global declarations in unexecuted nested functions as visible, causing missed diagnostics and unsafe corrections.

2 open issues
2 resolved since last review

Review effort: Balanced

Comment thread Rules/AvoidAlias.cs
Comment thread Rules/AvoidAlias.cs Outdated
Co-authored-by: bergmeister <9250262+bergmeister@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Dot-sourced scope handling still misindexes declarations and incorrectly skips script-block argument scopes, causing both erroneous alias corrections and missed diagnostics.

2 open issues
2 resolved since last review

Review effort: Balanced

Comment thread Rules/AvoidAlias.cs Outdated
Comment thread Rules/AvoidAlias.cs Outdated
Co-authored-by: bergmeister <9250262+bergmeister@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The argument-count restriction incorrectly treats parameterized dot-sourced blocks as child scopes, causing erroneous alias formatting and missed declarations in the caller’s scope.

1 open issue
2 resolved since last review

Review effort: Balanced

Comment thread Rules/AvoidAlias.cs Outdated
Co-authored-by: bergmeister <9250262+bergmeister@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Human assessment is needed because subtle callback scope, runspace boundaries, and function redefinition interactions can change command resolution or suppress valid diagnostics.

No open issues 🎉

1 resolved since last review

Review effort: Balanced

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Callback scope misclassification and indexing of unreachable function declarations can change which command runs, suppress expected diagnostics, and incorrectly rewrite unreachable code.

2 open issues

Review effort: Balanced

Comment thread Rules/AvoidAlias.cs Outdated
Comment thread Rules/AvoidAlias.cs
Co-authored-by: bergmeister <9250262+bergmeister@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Callback-scope analysis mishandles module-qualified commands, parallel-runspace boundaries, and script blocks passed as data, causing incorrect rewrites and missed diagnostics.

3 open issues
2 resolved since last review

Review effort: Balanced

Comment thread Rules/AvoidAlias.cs
Comment thread Rules/AvoidAlias.cs Outdated
Comment thread Rules/AvoidAlias.cs Outdated
Co-authored-by: bergmeister <9250262+bergmeister@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Callback-scope detection mishandles parameter abbreviations, switch/positional binding, and colon-attached blocks, causing valid function calls to be rewritten and diagnostics to be suppressed across parallel-runspace boundaries.

3 open issues
3 resolved since last review

Review effort: Balanced

Comment thread Rules/AvoidAlias.cs Outdated
Comment thread Rules/AvoidAlias.cs Outdated
Comment thread Rules/AvoidAlias.cs Outdated
Co-authored-by: bergmeister <9250262+bergmeister@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Human assessment is needed because callback-scope and command-shadowing edge cases can cause incorrect alias replacements and missed diagnostics.

No open issues 🎉

3 resolved since last review

Review effort: Balanced

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Unresolved command-shadowing and callback-scope errors can cause incorrect alias replacements and suppress expected diagnostics.

4 open issues

Review effort: Balanced

Comment thread Rules/AvoidAlias.cs
Comment on lines +344 to +346
if (IsParallelRunspaceScriptBlock(scope))
{
break;
Comment thread Rules/AvoidAlias.cs
Comment on lines +464 to +468
return commandAst != null
&& IsForEachObjectCommand(GetCallbackCommandName(commandAst))
&& IsParameter(
GetScriptBlockParameterName(commandAst, scriptBlock),
"Parallel");
Comment thread Rules/AvoidAlias.cs
Comment on lines +478 to +481
return scriptBlock.Parent is CommandParameterAst parameter
&& parameter.Argument == scriptBlock
? parameter.Parent as CommandAst
: null;
Comment thread Rules/AvoidAlias.cs
Comment on lines +624 to +625
if (!typeof(ScriptBlock).IsAssignableFrom(parameterType)
|| !parameter.Attributes.OfType<ParameterAttribute>().Any(attribute => attribute.Position == position))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants