From 497e502cbc50b50d0376c901460a9632897f5066 Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Tue, 27 Sep 2022 13:08:24 +0200 Subject: [PATCH 1/2] Adding parser support for N-d arrays up to rank 32 --- src/Compiler/pars.fsy | 90 ++++++++++++++++++- .../FSharp.Compiler.ComponentTests.fsproj | 1 + .../Language/MultiDimensionalArrayTests.fs | 45 ++++++++++ tests/service/Symbols.fs | 12 +++ 4 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 tests/FSharp.Compiler.ComponentTests/Language/MultiDimensionalArrayTests.fs diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index d7bbdaaf68e..8357661ae8f 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -5207,15 +5207,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) } diff --git a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj index 4acda7d0cd7..410013951bf 100644 --- a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj +++ b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj @@ -159,6 +159,7 @@ + diff --git a/tests/FSharp.Compiler.ComponentTests/Language/MultiDimensionalArrayTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/MultiDimensionalArrayTests.fs new file mode 100644 index 00000000000..9a61ee44622 --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Language/MultiDimensionalArrayTests.fs @@ -0,0 +1,45 @@ +namespace FSharp.Compiler.ComponentTests.Language + +open Xunit +open FSharp.Test.Compiler + +module MultiDimensionalArrayTests = + + [] + [] + [] + [] + 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 + + [] + 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 + |> withDiagnosticMessageMatches """This expression was expected to have type.*""" + + [] + 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 + + diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs index d9cb28398b9..c5d8c5f53ba 100644 --- a/tests/service/Symbols.fs +++ b/tests/service/Symbols.fs @@ -361,3 +361,15 @@ let tester2: int Group = [] |> should equal expectedTypeFormat | _ -> Assert.Fail (sprintf "Couldn't get member: %s" entityName) ) + + [] + let ``FsharpType.Format default to arrayNd shorthands for multidimensional arrays`` ([]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) From 99066f88b6fc1d4deca3df1b2e65c3093460def6 Mon Sep 17 00:00:00 2001 From: Tomas Grosup Date: Tue, 27 Sep 2022 15:10:44 +0200 Subject: [PATCH 2/2] Formatting tests with Fantomas --- .../Language/MultiDimensionalArrayTests.fs | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/tests/FSharp.Compiler.ComponentTests/Language/MultiDimensionalArrayTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/MultiDimensionalArrayTests.fs index 9a61ee44622..7a107e1e910 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/MultiDimensionalArrayTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/MultiDimensionalArrayTests.fs @@ -6,12 +6,14 @@ open FSharp.Test.Compiler module MultiDimensionalArrayTests = [] - [] - [] - [] - let ``MultiDimensional array type can be written with or without backticks``(commas:int,shortcut:string) = - let commaString = System.String(',',commas) - FSharp $""" + [] + [] + [] + 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 @@ -20,26 +22,31 @@ let shortCutStyle : int {shortcut} = cleanStyle |> compile |> shouldSucceed - [] - let ``Multidimensional array - reports an error if types are not matching`` () = - let commaString = System.String(',',30) - FSharp $""" + [] + 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 - |> withDiagnosticMessageMatches """This expression was expected to have type.*""" + |> 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' ") + + [] + let ``Multidimensional with rank over 32 cannot be defined`` () = + let commaString = System.String(',', 42) - [] - let ``Multidimensional with rank over 32 cannot be defined`` () = - let commaString = System.String(',',42) - FSharp $""" + FSharp + $""" module MultiDimArrayErrorTests let cleanStyle : int [{commaString}] = Unchecked.defaultof<_> """ |> compile |> shouldFail - -