From 14065007701487bcb6e3055097e8b5748d88b2d5 Mon Sep 17 00:00:00 2001 From: MartinGC94 Date: Thu, 23 Feb 2023 22:31:12 +0100 Subject: [PATCH] Fix array type parsing in generic types --- .../engine/parser/Parser.cs | 10 ++++++---- test/powershell/Language/Parser/Parsing.Tests.ps1 | 8 ++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/System.Management.Automation/engine/parser/Parser.cs b/src/System.Management.Automation/engine/parser/Parser.cs index e1788d5996f..09023536241 100644 --- a/src/System.Management.Automation/engine/parser/Parser.cs +++ b/src/System.Management.Automation/engine/parser/Parser.cs @@ -1346,7 +1346,7 @@ private ITypeName FinishTypeNameRule(Token typeName, bool unBracketedGenericArg case TokenKind.RBracket: case TokenKind.Comma: var elementType = new TypeName(typeName.Extent, typeName.Text); - return CompleteArrayTypeName(elementType, elementType, token); + return CompleteArrayTypeName(elementType, elementType, token, unBracketedGenericArg); case TokenKind.LBracket: case TokenKind.Identifier: @@ -1496,7 +1496,7 @@ private ITypeName GenericTypeNameRule(Token genericTypeName, Token firstToken, b if (token.Kind == TokenKind.LBracket) { SkipToken(); - return CompleteArrayTypeName(result, openGenericType, NextToken()); + return CompleteArrayTypeName(result, openGenericType, NextToken(), unbracketedGenericArg); } if (token.Kind == TokenKind.Comma && !unbracketedGenericArg) @@ -1519,7 +1519,7 @@ private ITypeName GenericTypeNameRule(Token genericTypeName, Token firstToken, b return result; } - private ITypeName CompleteArrayTypeName(ITypeName elementType, TypeName typeForAssemblyQualification, Token firstTokenAfterLBracket) + private ITypeName CompleteArrayTypeName(ITypeName elementType, TypeName typeForAssemblyQualification, Token firstTokenAfterLBracket, bool unBracketedGenericArg) { while (true) { @@ -1592,7 +1592,9 @@ private ITypeName CompleteArrayTypeName(ITypeName elementType, TypeName typeForA } token = PeekToken(); - if (token.Kind == TokenKind.Comma) + + // An array declared inside an unbracketed generic type argument cannot be assembly qualified + if (!unBracketedGenericArg && token.Kind == TokenKind.Comma) { SkipToken(); var assemblyName = _tokenizer.GetAssemblyNameSpec(); diff --git a/test/powershell/Language/Parser/Parsing.Tests.ps1 b/test/powershell/Language/Parser/Parsing.Tests.ps1 index 7b6cf0b69f8..77477a7afbe 100644 --- a/test/powershell/Language/Parser/Parsing.Tests.ps1 +++ b/test/powershell/Language/Parser/Parsing.Tests.ps1 @@ -664,3 +664,11 @@ Describe "Parsing using statement with alias and linebreak and comma" -Tag CI { } } } + +It "Should correctly parse array types that are used as arguments without brackets in generic type" { + $tks = $null + $ers = $null + $Script = '[System.Tuple[System.String[],System.Int32[]]]' + $result = [System.Management.Automation.Language.Parser]::ParseInput($Script, [ref]$tks, [ref]$ers) + $result.EndBlock.Statements[0].PipelineElements[0].Expression.TypeName.FullName | Should -Be 'System.Tuple[System.String[],System.Int32[]]' +}