Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 87 additions & 3 deletions src/Compiler/pars.fsy
Original file line number Diff line number Diff line change
Expand Up @@ -5266,15 +5266,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) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
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
12 changes: 12 additions & 0 deletions tests/service/Symbols.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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)