Fix parser exception in using statements with empty aliases (#16745)

This commit is contained in:
MartinGC94
2022-07-19 10:42:31 -07:00
committed by GitHub
parent b130db38dd
commit 84241c3c59
2 changed files with 41 additions and 3 deletions
@@ -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]
}
}
}