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
2 changes: 2 additions & 0 deletions src/Compiler/FSComp.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1653,3 +1653,5 @@ reprStateMachineInvalidForm,"The state machine has an unexpected form"
3536,tcUsingInterfaceWithStaticAbstractMethodAsType,"'%s' is normally used as a type constraint in generic code, e.g. \"'T when ISomeInterface<'T>\" or \"let f (x: #ISomeInterface<_>)\". See https://aka.ms/fsharp-iwsams for guidance. You can disable this warning by using '#nowarn \"3536\"' or '--nowarn:3536'."
3537,tcTraitHasMultipleSupportTypes,"The trait '%s' invoked by this call has multiple support types. This invocation syntax is not permitted for such traits. See https://aka.ms/fsharp-srtp for guidance."
3545,tcMissingRequiredMembers,"The following required properties have to be initalized:%s"
3546,parsExpectingPatternInTuple,"Expecting pattern"
3547,parsExpectedPatternAfterToken,"Expected a pattern after this point"
7 changes: 7 additions & 0 deletions src/Compiler/SyntaxTree/SyntaxTreeOps.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1031,6 +1031,13 @@ let rec normalizeTupleExpr exprs commas : SynExpr list * range list =
innerExprs @ rest, innerCommas @ commas
| _ -> exprs, commas

let rec normalizeTuplePat pats : SynPat list =
match pats with
| SynPat.Tuple (false, innerPats, _) :: rest ->
let innerExprs = normalizeTuplePat (List.rev innerPats)
innerExprs @ rest
| _ -> pats

/// Remove all members that were captures as SynMemberDefn.GetSetMember
let rec desugarGetSetMembers (memberDefns: SynMemberDefns) =
memberDefns
Expand Down
2 changes: 2 additions & 0 deletions src/Compiler/SyntaxTree/SyntaxTreeOps.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,8 @@ val mkDynamicArgExpr: expr: SynExpr -> SynExpr

val normalizeTupleExpr: exprs: SynExpr list -> commas: range list -> SynExpr list * range List

val normalizeTuplePat: pats: SynPat list -> SynPat list

val desugarGetSetMembers: memberDefns: SynMemberDefns -> SynMemberDefns

val getTypeFromTuplePath: path: SynTupleTypeSegment list -> SynType list
Expand Down
76 changes: 65 additions & 11 deletions src/Compiler/pars.fsy
Original file line number Diff line number Diff line change
Expand Up @@ -3126,21 +3126,48 @@ headBindingPattern:
| headBindingPattern COLON_COLON headBindingPattern
{ SynPat.LongIdent (SynLongIdent(mkSynCaseName (rhs parseState 2) opNameCons, [], [ Some (IdentTrivia.OriginalNotation "::") ]), None, None, SynArgPats.Pats [SynPat.Tuple (false, [$1;$3], rhs2 parseState 1 3)], None, lhs parseState) }

| tuplePatternElements %prec pat_tuple
{ SynPat.Tuple(false, List.rev $1, lhs parseState) }
| tuplePatternElements %prec pat_tuple
{ let pats = normalizeTuplePat $1
let m = (rhs parseState 1, pats) ||> unionRangeWithListBy (fun p -> p.Range)
SynPat.Tuple(false, List.rev pats, m) }

| conjPatternElements %prec pat_conj
{ SynPat.Ands(List.rev $1, lhs parseState) }

| constrPattern
{ $1 }

tuplePatternElements:
| tuplePatternElements COMMA headBindingPattern
tuplePatternElements:
| tuplePatternElements COMMA headBindingPattern
{ $3 :: $1 }

| headBindingPattern COMMA headBindingPattern
{ $3 :: $1 :: [] }
| headBindingPattern COMMA headBindingPattern
{ [$3; $1] }

| tuplePatternElements COMMA ends_coming_soon_or_recover
{ let commaRange = rhs parseState 2
reportParseErrorAt commaRange (FSComp.SR.parsExpectingPatternInTuple ())
let pat2 = SynPat.Wild(commaRange.EndRange)
pat2 :: $1 }

| headBindingPattern COMMA ends_coming_soon_or_recover
{ let commaRange = rhs parseState 2
reportParseErrorAt commaRange (FSComp.SR.parsExpectingPatternInTuple ())
let pat2 = SynPat.Wild(commaRange.EndRange)
[pat2; $1] }

| COMMA headBindingPattern
{ let commaRange = rhs parseState 1
reportParseErrorAt commaRange (FSComp.SR.parsExpectingPatternInTuple ())
let pat1 = SynPat.Wild(commaRange.StartRange)
[$2; pat1] }

| COMMA ends_coming_soon_or_recover
{ let commaRange = rhs parseState 1
if not $2 then reportParseErrorAt commaRange (FSComp.SR.parsExpectedPatternAfterToken ())
let pat1 = SynPat.Wild(commaRange.StartRange)
let pat2 = SynPat.Wild(commaRange.EndRange)
[pat2; pat1] }

conjPatternElements:
| conjPatternElements AMP headBindingPattern
Expand Down Expand Up @@ -3351,8 +3378,10 @@ parenPattern:
{ let mBar = rhs parseState 2
SynPat.Or($1, $3, rhs2 parseState 1 3, { BarRange = mBar }) }

| tupleParenPatternElements
{ SynPat.Tuple(false, List.rev $1, lhs parseState) }
| tupleParenPatternElements
{ let pats = normalizeTuplePat $1
let m = (rhs parseState 1, pats) ||> unionRangeWithListBy (fun p -> p.Range)
SynPat.Tuple(false, List.rev pats, m) }

| conjParenPatternElements
{ SynPat.Ands(List.rev $1, rhs2 parseState 1 3) }
Expand All @@ -3371,11 +3400,36 @@ parenPattern:
| constrPattern { $1 }

tupleParenPatternElements:
| tupleParenPatternElements COMMA parenPattern
| tupleParenPatternElements COMMA parenPattern
{ $3 :: $1 }

| parenPattern COMMA parenPattern
{ $3 :: $1 :: [] }
| parenPattern COMMA parenPattern
{ [$3; $1] }

| tupleParenPatternElements COMMA ends_coming_soon_or_recover
{ let commaRange = rhs parseState 2
reportParseErrorAt commaRange (FSComp.SR.parsExpectingPatternInTuple())
let pat2 = SynPat.Wild(commaRange.EndRange)
pat2 :: $1 }

| parenPattern COMMA ends_coming_soon_or_recover
{ let commaRange = rhs parseState 2
reportParseErrorAt commaRange (FSComp.SR.parsExpectingPatternInTuple())
let pat2 = SynPat.Wild(commaRange.EndRange)
[pat2; $1] }

| COMMA parenPattern
{ let commaRange = rhs parseState 1
reportParseErrorAt commaRange (FSComp.SR.parsExpectingPatternInTuple())
let pat1 = SynPat.Wild(commaRange.StartRange)
[$2; pat1] }

| COMMA ends_coming_soon_or_recover
{ let commaRange = rhs parseState 1
if not $2 then reportParseErrorAt commaRange (FSComp.SR.parsExpectedPatternAfterToken ())
let pat1 = SynPat.Wild(commaRange.StartRange)
let pat2 = SynPat.Wild(commaRange.EndRange)
[pat2; pat1] }

conjParenPatternElements:
| conjParenPatternElements AMP parenPattern
Expand Down
10 changes: 10 additions & 0 deletions src/Compiler/xlf/FSComp.txt.cs.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@
<target state="translated">Neočekávaný token v definici typu. Za typem {0} se očekává =.</target>
<note />
</trans-unit>
<trans-unit id="parsExpectedPatternAfterToken">
<source>Expected a pattern after this point</source>
<target state="new">Expected a pattern after this point</target>
<note />
</trans-unit>
<trans-unit id="parsExpectingPatternInTuple">
<source>Expecting pattern</source>
<target state="new">Expecting pattern</target>
<note />
</trans-unit>
<trans-unit id="parsIncompleteTyparExpr1">
<source>Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</source>
<target state="new">Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</target>
Expand Down
10 changes: 10 additions & 0 deletions src/Compiler/xlf/FSComp.txt.de.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@
<target state="translated">Unerwartetes Token in Typdefinition. Nach Typ "{0}" wurde "=" erwartet.</target>
<note />
</trans-unit>
<trans-unit id="parsExpectedPatternAfterToken">
<source>Expected a pattern after this point</source>
<target state="new">Expected a pattern after this point</target>
<note />
</trans-unit>
<trans-unit id="parsExpectingPatternInTuple">
<source>Expecting pattern</source>
<target state="new">Expecting pattern</target>
<note />
</trans-unit>
<trans-unit id="parsIncompleteTyparExpr1">
<source>Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</source>
<target state="new">Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</target>
Expand Down
10 changes: 10 additions & 0 deletions src/Compiler/xlf/FSComp.txt.es.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@
<target state="translated">Token inesperado en la definición de tipo. Se esperaba "=" después del tipo "{0}".</target>
<note />
</trans-unit>
<trans-unit id="parsExpectedPatternAfterToken">
<source>Expected a pattern after this point</source>
<target state="new">Expected a pattern after this point</target>
<note />
</trans-unit>
<trans-unit id="parsExpectingPatternInTuple">
<source>Expecting pattern</source>
<target state="new">Expecting pattern</target>
<note />
</trans-unit>
<trans-unit id="parsIncompleteTyparExpr1">
<source>Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</source>
<target state="new">Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</target>
Expand Down
10 changes: 10 additions & 0 deletions src/Compiler/xlf/FSComp.txt.fr.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@
<target state="translated">Jeton inattendu dans la définition de type. Signe '=' attendu après le type '{0}'.</target>
<note />
</trans-unit>
<trans-unit id="parsExpectedPatternAfterToken">
<source>Expected a pattern after this point</source>
<target state="new">Expected a pattern after this point</target>
<note />
</trans-unit>
<trans-unit id="parsExpectingPatternInTuple">
<source>Expecting pattern</source>
<target state="new">Expecting pattern</target>
<note />
</trans-unit>
<trans-unit id="parsIncompleteTyparExpr1">
<source>Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</source>
<target state="new">Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</target>
Expand Down
10 changes: 10 additions & 0 deletions src/Compiler/xlf/FSComp.txt.it.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@
<target state="translated">Token imprevisto nella definizione del tipo. Dopo il tipo '{0}' è previsto '='.</target>
<note />
</trans-unit>
<trans-unit id="parsExpectedPatternAfterToken">
<source>Expected a pattern after this point</source>
<target state="new">Expected a pattern after this point</target>
<note />
</trans-unit>
<trans-unit id="parsExpectingPatternInTuple">
<source>Expecting pattern</source>
<target state="new">Expecting pattern</target>
<note />
</trans-unit>
<trans-unit id="parsIncompleteTyparExpr1">
<source>Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</source>
<target state="new">Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</target>
Expand Down
10 changes: 10 additions & 0 deletions src/Compiler/xlf/FSComp.txt.ja.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@
<target state="translated">型定義に予期しないトークンがあります。型 '{0}' の後には '=' が必要です。</target>
<note />
</trans-unit>
<trans-unit id="parsExpectedPatternAfterToken">
<source>Expected a pattern after this point</source>
<target state="new">Expected a pattern after this point</target>
<note />
</trans-unit>
<trans-unit id="parsExpectingPatternInTuple">
<source>Expecting pattern</source>
<target state="new">Expecting pattern</target>
<note />
</trans-unit>
<trans-unit id="parsIncompleteTyparExpr1">
<source>Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</source>
<target state="new">Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</target>
Expand Down
10 changes: 10 additions & 0 deletions src/Compiler/xlf/FSComp.txt.ko.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@
<target state="translated">형식 정의에 예기치 않은 토큰이 있습니다. '{0}' 형식 뒤에 '='가 필요합니다.</target>
<note />
</trans-unit>
<trans-unit id="parsExpectedPatternAfterToken">
<source>Expected a pattern after this point</source>
<target state="new">Expected a pattern after this point</target>
<note />
</trans-unit>
<trans-unit id="parsExpectingPatternInTuple">
<source>Expecting pattern</source>
<target state="new">Expecting pattern</target>
<note />
</trans-unit>
<trans-unit id="parsIncompleteTyparExpr1">
<source>Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</source>
<target state="new">Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</target>
Expand Down
10 changes: 10 additions & 0 deletions src/Compiler/xlf/FSComp.txt.pl.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@
<target state="translated">Nieoczekiwany token w definicji typu. Oczekiwano znaku „=” po typie „{0}”.</target>
<note />
</trans-unit>
<trans-unit id="parsExpectedPatternAfterToken">
<source>Expected a pattern after this point</source>
<target state="new">Expected a pattern after this point</target>
<note />
</trans-unit>
<trans-unit id="parsExpectingPatternInTuple">
<source>Expecting pattern</source>
<target state="new">Expecting pattern</target>
<note />
</trans-unit>
<trans-unit id="parsIncompleteTyparExpr1">
<source>Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</source>
<target state="new">Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</target>
Expand Down
10 changes: 10 additions & 0 deletions src/Compiler/xlf/FSComp.txt.pt-BR.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@
<target state="translated">Token inesperado na definição de tipo. Esperava-se '=' após o tipo '{0}'.</target>
<note />
</trans-unit>
<trans-unit id="parsExpectedPatternAfterToken">
<source>Expected a pattern after this point</source>
<target state="new">Expected a pattern after this point</target>
<note />
</trans-unit>
<trans-unit id="parsExpectingPatternInTuple">
<source>Expecting pattern</source>
<target state="new">Expecting pattern</target>
<note />
</trans-unit>
<trans-unit id="parsIncompleteTyparExpr1">
<source>Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</source>
<target state="new">Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</target>
Expand Down
10 changes: 10 additions & 0 deletions src/Compiler/xlf/FSComp.txt.ru.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@
<target state="translated">Неожиданный токен в определении типа. После типа "{0}" ожидается "=".</target>
<note />
</trans-unit>
<trans-unit id="parsExpectedPatternAfterToken">
<source>Expected a pattern after this point</source>
<target state="new">Expected a pattern after this point</target>
<note />
</trans-unit>
<trans-unit id="parsExpectingPatternInTuple">
<source>Expecting pattern</source>
<target state="new">Expecting pattern</target>
<note />
</trans-unit>
<trans-unit id="parsIncompleteTyparExpr1">
<source>Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</source>
<target state="new">Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</target>
Expand Down
10 changes: 10 additions & 0 deletions src/Compiler/xlf/FSComp.txt.tr.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@
<target state="translated">Tür tanımında beklenmeyen belirteç var. '{0}' türünden sonra '=' bekleniyordu.</target>
<note />
</trans-unit>
<trans-unit id="parsExpectedPatternAfterToken">
<source>Expected a pattern after this point</source>
<target state="new">Expected a pattern after this point</target>
<note />
</trans-unit>
<trans-unit id="parsExpectingPatternInTuple">
<source>Expecting pattern</source>
<target state="new">Expecting pattern</target>
<note />
</trans-unit>
<trans-unit id="parsIncompleteTyparExpr1">
<source>Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</source>
<target state="new">Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</target>
Expand Down
10 changes: 10 additions & 0 deletions src/Compiler/xlf/FSComp.txt.zh-Hans.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@
<target state="translated">类型定义中出现意外标记。类型“{0}”后应为 "="。</target>
<note />
</trans-unit>
<trans-unit id="parsExpectedPatternAfterToken">
<source>Expected a pattern after this point</source>
<target state="new">Expected a pattern after this point</target>
<note />
</trans-unit>
<trans-unit id="parsExpectingPatternInTuple">
<source>Expecting pattern</source>
<target state="new">Expecting pattern</target>
<note />
</trans-unit>
<trans-unit id="parsIncompleteTyparExpr1">
<source>Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</source>
<target state="new">Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</target>
Expand Down
10 changes: 10 additions & 0 deletions src/Compiler/xlf/FSComp.txt.zh-Hant.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@
<target state="translated">型別定義中出現非預期的權杖。類型 '{0}' 之後應該要有 '='。</target>
<note />
</trans-unit>
<trans-unit id="parsExpectedPatternAfterToken">
<source>Expected a pattern after this point</source>
<target state="new">Expected a pattern after this point</target>
<note />
</trans-unit>
<trans-unit id="parsExpectingPatternInTuple">
<source>Expecting pattern</source>
<target state="new">Expecting pattern</target>
<note />
</trans-unit>
<trans-unit id="parsIncompleteTyparExpr1">
<source>Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</source>
<target state="new">Incomplete character literal (example: 'Q') or qualified type invocation (example: 'T.Name)</target>
Expand Down
7 changes: 6 additions & 1 deletion tests/service/Common.fs
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,11 @@ let getSingleParenInnerExpr expr =
| SynModuleDecl.Expr(SynExpr.Paren(expr, _, _, _), _) -> expr
| _ -> failwith "Unexpected tree"

let getLetDeclHeadPattern (moduleDecl: SynModuleDecl) =
match moduleDecl with
| SynModuleDecl.Let(_, [SynBinding(headPat = pat)], _) -> pat
| _ -> failwith "Unexpected tree"

let parseSourceCodeAndGetModule (source: string) =
parseSourceCode ("test.fsx", source) |> getSingleModuleLikeDecl

Expand Down Expand Up @@ -458,7 +463,7 @@ let coreLibAssemblyName =
"mscorlib"
#endif

let getRange (e: SynExpr) = e.Range
let inline getRange (node: ^T) = (^T: (member Range: range) node)

let assertRange
(expectedStartLine: int, expectedStartColumn: int)
Expand Down
Loading