未验证 提交 79da721e 编写于 作者: T Tomas Grosup 提交者: GitHub

Adding parser support for N-d arrays up to rank 32 (#13991)

* Adding parser support for N-d arrays up to rank 32
上级 fcd06c7d
......@@ -5272,15 +5272,99 @@ arrayTypeSuffix:
| LBRACK RBRACK
{ 1 }
| LBRACK COMMA RBRACK
| LBRACK COMMA RBRACK
{ 2 }
| LBRACK COMMA COMMA RBRACK
| LBRACK COMMA COMMA RBRACK
{ 3 }
| LBRACK COMMA COMMA COMMA RBRACK
| LBRACK COMMA COMMA COMMA RBRACK
{ 4 }
| LBRACK COMMA COMMA COMMA COMMA RBRACK
{ 5 }
| LBRACK COMMA COMMA COMMA COMMA COMMA RBRACK
{ 6 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 7 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 8 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 9 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 10 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 11 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 12 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 13 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 14 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 15 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 16 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 17 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 18 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 19 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 20 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 21 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 22 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 23 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 24 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 25 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 26 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 27 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 28 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 29 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 30 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 31 }
| LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
{ 32 }
appTypePrefixArguments:
| typeArgActual COMMA typeArgActual typeArgListElements
{ let typeArgs, commas = $4 in $1 :: $3 :: List.rev typeArgs, (rhs parseState 2) :: (List.rev commas) }
......
......@@ -161,6 +161,7 @@
<Compile Include="ErrorMessages\WarnIfDiscardedInList.fs" />
<Compile Include="ErrorMessages\UnionCasePatternMatchingErrors.fs"/>
<Compile Include="Language\IndexerSetterParamArray.fs" />
<Compile Include="Language\MultiDimensionalArrayTests.fs" />
<Compile Include="Language\RegressionTests.fs" />
<Compile Include="Language\AttributeCheckingTests.fs" />
<Compile Include="Language\ObsoleteAttributeCheckingTests.fs" />
......
namespace FSharp.Compiler.ComponentTests.Language
open Xunit
open FSharp.Test.Compiler
module MultiDimensionalArrayTests =
[<Theory>]
[<InlineData(1, "array2d")>]
[<InlineData(5, "array6d")>]
[<InlineData(31, "array32d")>]
let ``MultiDimensional array type can be written with or without backticks`` (commas: int, shortcut: string) =
let commaString = System.String(',', commas)
FSharp
$"""
module MultiDimArrayTests
let backTickStyle : int ``[{commaString}]`` = Unchecked.defaultof<_>
let cleanStyle : int [{commaString}] = backTickStyle
let shortCutStyle : int {shortcut} = cleanStyle
"""
|> compile
|> shouldSucceed
[<Fact>]
let ``Multidimensional array - reports an error if types are not matching`` () =
let commaString = System.String(',', 30)
FSharp
$"""
module MultiDimArrayErrorTests
let cleanStyle : int [{commaString}] = Unchecked.defaultof<_>
let shortCutStyle : int array32d = cleanStyle
"""
|> compile
|> shouldFail
|> withSingleDiagnostic (Error 1, Line 4, Col 36, Line 4, Col 46, "This expression was expected to have type
'int array32d'
but here has type
'int array31d' ")
[<Fact>]
let ``Multidimensional with rank over 32 cannot be defined`` () =
let commaString = System.String(',', 42)
FSharp
$"""
module MultiDimArrayErrorTests
let cleanStyle : int [{commaString}] = Unchecked.defaultof<_>
"""
|> compile
|> shouldFail
......@@ -361,3 +361,15 @@ let tester2: int Group = []
|> should equal expectedTypeFormat
| _ -> Assert.Fail (sprintf "Couldn't get member: %s" entityName)
)
[<Test>]
let ``FsharpType.Format default to arrayNd shorthands for multidimensional arrays`` ([<Values(2,6,32)>]rank) =
let commas = System.String(',', rank - 1)
let _, checkResults = getParseAndCheckResults $""" let myArr : int[{commas}] = Unchecked.defaultOf<_>"""
let symbolUse = findSymbolUseByName "myArr" checkResults
match symbolUse.Symbol with
| :? FSharpMemberOrFunctionOrValue as v ->
v.FullType.Format symbolUse.DisplayContext
|> shouldEqual $"int array{rank}d"
| other -> Assert.Fail(sprintf "myArr was supposed to be a value, but is %A" other)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册