mirror of
https://github.com/PowerShell/PowerShell
synced 2026-06-08 12:12:50 +00:00
Fix parser exception in using statements with empty aliases (#16745)
This commit is contained in:
@@ -2932,7 +2932,7 @@ namespace System.Management.Automation.Language
|
||||
return null;
|
||||
}
|
||||
|
||||
if (configurationNameToken.Kind == TokenKind.EndOfInput)
|
||||
if (configurationNameToken.Kind is TokenKind.EndOfInput or TokenKind.Comma)
|
||||
{
|
||||
UngetToken(configurationNameToken);
|
||||
|
||||
@@ -5017,7 +5017,7 @@ namespace System.Management.Automation.Language
|
||||
SkipToken();
|
||||
|
||||
var aliasToken = NextToken();
|
||||
if (aliasToken.Kind == TokenKind.EndOfInput)
|
||||
if (aliasToken.Kind is TokenKind.EndOfInput or TokenKind.NewLine or TokenKind.Semi)
|
||||
{
|
||||
UngetToken(aliasToken);
|
||||
ReportIncompleteInput(After(equalsToken),
|
||||
@@ -5026,6 +5026,12 @@ namespace System.Management.Automation.Language
|
||||
return new ErrorStatementAst(ExtentOf(usingToken, equalsToken));
|
||||
}
|
||||
|
||||
if (aliasToken.Kind == TokenKind.Comma)
|
||||
{
|
||||
ReportError(aliasToken.Extent, nameof(ParserStrings.UnexpectedUnaryOperator), ParserStrings.UnexpectedUnaryOperator, aliasToken.Text);
|
||||
return new ErrorStatementAst(ExtentOf(usingToken, aliasToken));
|
||||
}
|
||||
|
||||
var aliasAst = GetCommandArgument(CommandArgumentContext.CommandArgument, aliasToken);
|
||||
if (kind == UsingStatementKind.Module && aliasAst is HashtableAst)
|
||||
{
|
||||
@@ -5033,7 +5039,19 @@ namespace System.Management.Automation.Language
|
||||
}
|
||||
else if (aliasAst is not StringConstantExpressionAst)
|
||||
{
|
||||
return new ErrorStatementAst(ExtentOf(usingToken, aliasAst), new Ast[] { itemAst, aliasAst });
|
||||
var errorExtent = ExtentFromFirstOf(aliasAst, aliasToken);
|
||||
Ast[] nestedAsts;
|
||||
if (aliasAst is null)
|
||||
{
|
||||
nestedAsts = new Ast[] { itemAst };
|
||||
}
|
||||
else
|
||||
{
|
||||
nestedAsts = new Ast[] { itemAst, aliasAst };
|
||||
}
|
||||
|
||||
ReportError(errorExtent, nameof(ParserStrings.InvalidValueForUsingItemName), ParserStrings.InvalidValueForUsingItemName, errorExtent.Text);
|
||||
return new ErrorStatementAst(ExtentOf(usingToken, errorExtent), nestedAsts);
|
||||
}
|
||||
|
||||
RequireStatementTerminator();
|
||||
|
||||
@@ -644,3 +644,23 @@ Describe "Parsing array that has too many dimensions" -Tag CI {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Describe "Parsing using statement with alias and linebreak and comma" -Tag CI {
|
||||
It "ParseError for '<Script>'" -TestCases @(
|
||||
@{ Script = "using namespace x =`n"; ErrorId = @('MissingNamespaceAlias'); StartOffset = @(19); EndOffset = @(19) }
|
||||
@{ Script = "using namespace x = `n"; ErrorId = @('MissingNamespaceAlias'); StartOffset = @(19); EndOffset = @(19) }
|
||||
@{ Script = "using namespace x = ;"; ErrorId = @('MissingNamespaceAlias'); StartOffset = @(19); EndOffset = @(19) }
|
||||
@{ Script = "using namespace x = ,"; ErrorId = @('UnexpectedUnaryOperator'); StartOffset = @(20); EndOffset = @(21) }
|
||||
@{ Script = "using namespace x = &"; ErrorId = @('InvalidValueForUsingItemName','MissingExpression'); StartOffset = @(20, 20); EndOffset = @(21, 21) }
|
||||
) {
|
||||
param($Script, $ErrorId, $StartOffset, $EndOffset)
|
||||
|
||||
$errs = Get-ParseResults -src $Script
|
||||
$errs.Count | Should -Be $ErrorId.Count
|
||||
for ($i = 0; $i -lt $errs.Count; $i++) {
|
||||
$errs[$i].ErrorId | Should -BeExactly $ErrorId[$i]
|
||||
$errs[$i].Extent.StartScriptPosition.Offset | Should -Be $StartOffset[$i]
|
||||
$errs[$i].Extent.EndScriptPosition.Offset | Should -Be $EndOffset[$i]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user