Skip to content

Commit 302bea2

Browse files
auduchinokbaronfel
authored andcommitted
Replace SynSimplePat list with SynSimplePats in ImplicitCtor (#6845)
* Replace SynSimplePat list with SynSimplePats in ImplicitCtor * Use SynSimplePats in SynTypeDefnSimpleRepr.General during type check
1 parent 7b13b78 commit 302bea2

File tree

6 files changed

+53
-38
lines changed

6 files changed

+53
-38
lines changed

src/fsharp/TypeChecker.fs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13556,7 +13556,7 @@ module MutRecBindingChecking =
1355613556
error(Error(FSComp.SR.tcEnumerationsMayNotHaveMembers(), (trimRangeToLine m)))
1355713557

1355813558
match classMemberDef, containerInfo with
13559-
| SynMemberDefn.ImplicitCtor (vis, Attributes attrs, spats, thisIdOpt, m), ContainerInfo(_, Some(MemberOrValContainerInfo(tcref, _, baseValOpt, safeInitInfo, _))) ->
13559+
| SynMemberDefn.ImplicitCtor (vis, Attributes attrs, SynSimplePats.SimplePats(spats, _), thisIdOpt, m), ContainerInfo(_, Some(MemberOrValContainerInfo(tcref, _, baseValOpt, safeInitInfo, _))) ->
1356013560
if tcref.TypeOrMeasureKind = TyparKind.Measure then
1356113561
error(Error(FSComp.SR.tcMeasureDeclarationsRequireStaticMembers(), m))
1356213562

@@ -15016,7 +15016,7 @@ module EstablishTypeDefinitionCores =
1501615016
match implicitCtorSynPats with
1501715017
| None -> ()
1501815018
| Some spats ->
15019-
let ctorArgNames, (_, names, _) = TcSimplePatsOfUnknownType cenv true NoCheckCxs env tpenv (SynSimplePats.SimplePats (spats, m))
15019+
let ctorArgNames, (_, names, _) = TcSimplePatsOfUnknownType cenv true NoCheckCxs env tpenv spats
1502015020
for arg in ctorArgNames do
1502115021
let ty = names.[arg].Type
1502215022
let m = names.[arg].Ident.idRange
@@ -15816,7 +15816,7 @@ module EstablishTypeDefinitionCores =
1581615816
()
1581715817
| Some spats ->
1581815818
if tycon.IsFSharpStructOrEnumTycon then
15819-
let ctorArgNames, (_, names, _) = TcSimplePatsOfUnknownType cenv true CheckCxs envinner tpenv (SynSimplePats.SimplePats (spats, m))
15819+
let ctorArgNames, (_, names, _) = TcSimplePatsOfUnknownType cenv true CheckCxs envinner tpenv spats
1582015820
for arg in ctorArgNames do
1582115821
let ty = names.[arg].Type
1582215822
let id = names.[arg].Ident
@@ -16621,7 +16621,7 @@ module TcDeclarations =
1662116621

1662216622
let implicitCtorSynPats =
1662316623
members |> List.tryPick (function
16624-
| SynMemberDefn.ImplicitCtor (_, _, spats, _, _) -> Some spats
16624+
| SynMemberDefn.ImplicitCtor (_, _, (SynSimplePats.SimplePats _ as spats), _, _) -> Some spats
1662516625
| _ -> None)
1662616626

1662716627
// An ugly bit of code to pre-determine if a type has a nullary constructor, prior to establishing the
@@ -16630,7 +16630,7 @@ module TcDeclarations =
1663016630
members |> List.exists (function
1663116631
| SynMemberDefn.Member(Binding(_, _, _, _, _, _, SynValData(Some memberFlags, _, _), SynPatForConstructorDecl SynPatForNullaryArgs, _, _, _, _), _) ->
1663216632
memberFlags.MemberKind=MemberKind.Constructor
16633-
| SynMemberDefn.ImplicitCtor (_, _, spats, _, _) -> isNil spats
16633+
| SynMemberDefn.ImplicitCtor (_, _, SynSimplePats.SimplePats(spats, _), _, _) -> isNil spats
1663416634
| _ -> false)
1663516635
let repr = SynTypeDefnSimpleRepr.General(kind, inherits, slotsigs, fields, isConcrete, isIncrClass, implicitCtorSynPats, m)
1663616636
let isAtOriginalTyconDefn = not (isAugmentationTyconDefnRepr repr)

src/fsharp/ast.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,7 +1310,7 @@ and
13101310

13111311
/// An object oriented type definition. This is not a parse-tree form, but represents the core
13121312
/// type representation which the type checker splits out from the "ObjectModel" cases of type definitions.
1313-
| General of SynTypeDefnKind * (SynType * range * Ident option) list * (SynValSig * MemberFlags) list * SynField list * bool * bool * SynSimplePat list option * range: range
1313+
| General of SynTypeDefnKind * (SynType * range * Ident option) list * (SynValSig * MemberFlags) list * SynField list * bool * bool * SynSimplePats option * range: range
13141314

13151315
/// A type defined by using an IL assembly representation. Only used in FSharp.Core.
13161316
///
@@ -1525,7 +1525,7 @@ and
15251525
| Member of memberDefn: SynBinding * range: range
15261526

15271527
/// implicit ctor args as a defn line, 'as' specification
1528-
| ImplicitCtor of accessiblity: SynAccess option * attributes: SynAttributes * ctorArgs: SynSimplePat list * selfIdentifier: Ident option * range: range
1528+
| ImplicitCtor of accessiblity: SynAccess option * attributes: SynAttributes * ctorArgs: SynSimplePats * selfIdentifier: Ident option * range: range
15291529

15301530
/// inherit <typ>(args...) as base
15311531
| ImplicitInherit of inheritType: SynType * inheritArgs: SynExpr * inheritAlias: Ident option * range: range

src/fsharp/pars.fsy

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2735,38 +2735,51 @@ bindingPattern:
27352735
{ let xmlDoc = grabXmlDoc(parseState,1)
27362736
mkSynBinding (xmlDoc,$1), rhs parseState 1 }
27372737

2738-
/* sp = v | sp:typ | attrs sp */
2738+
// Subset of patterns allowed to be used in implicit ctors.
2739+
// For a better error recovery we could replace these rules with the actual SynPat parsing
2740+
// and use allowed patterns only at a later analysis stage reporting errors along the way.
27392741
simplePattern:
2740-
| ident
2741-
{ SynSimplePat.Id ($1,None,false,false,false,rhs parseState 1) }
2742-
| QMARK ident
2743-
{ SynSimplePat.Id ($2,None,false,false,true,rhs parseState 2) }
2742+
| ident
2743+
{ let m = rhs parseState 1
2744+
SynPat.Named(SynPat.Wild m, $1, false, None, m) }
2745+
| QMARK ident
2746+
{ SynPat.OptionalVal($2, rhs parseState 2) }
27442747
| simplePattern COLON typeWithTypeConstraints
2745-
{ let lhsm = lhs parseState
2746-
SynSimplePat.Typed($1,$3,lhsm) }
2748+
{ SynPat.Typed($1, $3, lhs parseState) }
27472749
| attributes simplePattern %prec paren_pat_attribs
2748-
{ let lhsm = lhs parseState
2749-
SynSimplePat.Attrib($2,$1,lhsm) }
2750+
{ SynPat.Attrib($2, $1, lhs parseState) }
27502751

27512752
simplePatternCommaList:
2752-
| simplePattern
2753-
{ [$1] }
2754-
| simplePattern COMMA simplePatternCommaList
2755-
{ $1 :: $3 }
2753+
| simplePattern
2754+
{ $1 }
2755+
| simplePattern COMMA simplePatternCommaList
2756+
{ match $3 with
2757+
| SynPat.Tuple(_, pats, _) -> SynPat.Tuple(false, $1 :: pats, rhs2 parseState 1 3)
2758+
| _ -> SynPat.Tuple(false, [$1; $3], rhs2 parseState 1 3) }
27562759

27572760
simplePatterns:
2758-
| LPAREN simplePatternCommaList rparen
2759-
{ $2 }
2760-
| LPAREN rparen
2761-
{ [] }
2762-
| LPAREN simplePatternCommaList recover
2763-
{ reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen())
2764-
[] }
2765-
| LPAREN error rparen
2766-
{ (* silent recovery *) [] }
2767-
| LPAREN recover
2768-
{ reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen())
2769-
[] }
2761+
| LPAREN simplePatternCommaList rparen
2762+
{ let parenPat = SynPat.Paren($2, rhs2 parseState 1 3)
2763+
let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator parenPat
2764+
simplePats }
2765+
| LPAREN rparen
2766+
{ let pat = SynPat.Const(SynConst.Unit, rhs2 parseState 1 2)
2767+
let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator pat
2768+
simplePats }
2769+
| LPAREN simplePatternCommaList recover
2770+
{ reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen())
2771+
let parenPat = SynPat.Paren(SynPat.Tuple(false, [], rhs2 parseState 1 2), rhs2 parseState 1 2) // todo: report parsed pats anyway?
2772+
let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator parenPat
2773+
simplePats }
2774+
| LPAREN error rparen
2775+
{ let parenPat = SynPat.Paren(SynPat.Wild(rhs parseState 2), rhs2 parseState 1 3) // silent recovery
2776+
let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator parenPat
2777+
simplePats }
2778+
| LPAREN recover
2779+
{ reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen())
2780+
let pat = SynPat.Wild(lhs parseState)
2781+
let simplePats, _ = SimplePatsOfPat parseState.SynArgNameGenerator pat
2782+
simplePats }
27702783

27712784

27722785
headBindingPattern:

src/fsharp/service/ServiceAssemblyContent.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -765,9 +765,9 @@ module ParsedInput =
765765
and walkMember = function
766766
| SynMemberDefn.AbstractSlot (valSig, _, _) -> walkValSig valSig
767767
| SynMemberDefn.Member (binding, _) -> walkBinding binding
768-
| SynMemberDefn.ImplicitCtor (_, Attributes attrs, pats, _, _) ->
768+
| SynMemberDefn.ImplicitCtor (_, Attributes attrs, SynSimplePats.SimplePats(simplePats, _), _, _) ->
769769
List.iter walkAttribute attrs
770-
List.iter walkSimplePat pats
770+
List.iter walkSimplePat simplePats
771771
| SynMemberDefn.ImplicitInherit (t, e, _, _) -> walkType t; walkExpr e
772772
| SynMemberDefn.LetBindings (bindings, _, _, _) -> List.iter walkBinding bindings
773773
| SynMemberDefn.Interface (t, members, _) ->

src/fsharp/service/ServiceParseTreeWalk.fs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -606,8 +606,10 @@ module public AstTraversal =
606606
match m with
607607
| SynMemberDefn.Open(_longIdent, _range) -> None
608608
| SynMemberDefn.Member(synBinding, _range) -> traverseSynBinding path synBinding
609-
| SynMemberDefn.ImplicitCtor(_synAccessOption, _synAttributes, synSimplePatList, _identOption, _range) ->
610-
visitor.VisitSimplePats(synSimplePatList)
609+
| SynMemberDefn.ImplicitCtor(_synAccessOption, _synAttributes, simplePats, _identOption, _range) ->
610+
match simplePats with
611+
| SynSimplePats.SimplePats(simplePats, _) -> visitor.VisitSimplePats(simplePats)
612+
| _ -> None
611613
| SynMemberDefn.ImplicitInherit(synType, synExpr, _identOption, range) ->
612614
[
613615
dive () synType.Range (fun () ->

src/fsharp/service/ServiceUntypedParse.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -916,8 +916,8 @@ module UntypedParseImpl =
916916
and walkMember = function
917917
| SynMemberDefn.AbstractSlot (valSig, _, _) -> walkValSig valSig
918918
| SynMemberDefn.Member(binding, _) -> walkBinding binding
919-
| SynMemberDefn.ImplicitCtor(_, Attributes attrs, pats, _, _) ->
920-
List.tryPick walkAttribute attrs |> Option.orElse (List.tryPick walkSimplePat pats)
919+
| SynMemberDefn.ImplicitCtor(_, Attributes attrs, SynSimplePats.SimplePats(simplePats, _), _, _) ->
920+
List.tryPick walkAttribute attrs |> Option.orElse (List.tryPick walkSimplePat simplePats)
921921
| SynMemberDefn.ImplicitInherit(t, e, _, _) -> walkType t |> Option.orElse (walkExpr e)
922922
| SynMemberDefn.LetBindings(bindings, _, _, _) -> List.tryPick walkBinding bindings
923923
| SynMemberDefn.Interface(t, members, _) ->

0 commit comments

Comments
 (0)