Skip to content

Commit 76e65ac

Browse files
authored
Add with keyword to Syntax tree (#12400)
* Add try and with keywords to SynExpr.TryWith. * Add match and with keywords to SynExpr.Match. * Add match and with keywords to SynExpr.MatchBang. * Add with keyword to SynExpr.ObjExpr and SynInterfaceImpl. * Add with keyword to SynTypeDefnKind.Augmentation. * Add with keyword to SynMemberDefn.Interface. * Add with keyword to SynTypeDefnSig and SynExceptionSig. * Add with keyword to SynMemberDefn.AutoProperty. * Add with keyword to SynValSig. * Add with keyword to SynPat.LongId for SynMemberDefn.Member. * Corrected FSharpCodeAnalysisExtensions.fs * Fix failing unit tests. * Revert some named pattern matches. Renamed Range to range. Add comment above PropertyKeyword. * Correct failing type check tests. * Renamed unused values in pattern match.
1 parent 57ef580 commit 76e65ac

24 files changed

+847
-443
lines changed

src/fsharp/CheckComputationExpressions.fs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,16 +1283,14 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter
12831283
// Build the 'Bind' call
12841284
Some (transBind q varSpace bindRange "Bind" [mergedSources] consumePat letSpBind innerComp translatedCtxt)
12851285

1286-
| SynExpr.Match (spMatch, expr, clauses, m) ->
1287-
let mMatch = match spMatch with DebugPointAtBinding.Yes mMatch -> mMatch | _ -> m
1286+
| SynExpr.Match (mMatch, spMatch, expr, mWith, clauses, m) ->
12881287
if isQuery then error(Error(FSComp.SR.tcMatchMayNotBeUsedWithQuery(), mMatch))
12891288
let clauses = clauses |> List.map (fun (SynMatchClause(pat, cond, arrow, innerComp, patm, sp)) -> SynMatchClause(pat, cond, arrow, transNoQueryOps innerComp, patm, sp))
1290-
Some(translatedCtxt (SynExpr.Match (spMatch, expr, clauses, m)))
1289+
Some(translatedCtxt (SynExpr.Match (mMatch, spMatch, expr, mWith, clauses, m)))
12911290

12921291
// 'match! expr with pats ...' --> build.Bind(e1, (function pats ...))
1293-
| SynExpr.MatchBang (spMatch, expr, clauses, m) ->
1292+
| SynExpr.MatchBang (mMatch, spMatch, expr, _mWith, clauses, _m) ->
12941293
let matchExpr = mkSourceExpr expr
1295-
let mMatch = match spMatch with DebugPointAtBinding.Yes mMatch -> mMatch | _ -> m
12961294
if isQuery then error(Error(FSComp.SR.tcMatchMayNotBeUsedWithQuery(), mMatch))
12971295

12981296
if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mMatch ad "Bind" builderTy) then
@@ -1304,7 +1302,7 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter
13041302
// TODO: consider allowing translation to BindReturn
13051303
Some(translatedCtxt (mkSynCall "Bind" mMatch [matchExpr; consumeExpr]))
13061304

1307-
| SynExpr.TryWith (innerComp, _mTryToWith, clauses, _mWithToLast, mTryToLast, spTry, _spWith) ->
1305+
| SynExpr.TryWith (_mTry, innerComp, _mTryToWith, _mWith, clauses, _mWithToLast, mTryToLast, spTry, _spWith) ->
13081306
let mTry = match spTry with DebugPointAtTry.Yes m -> m.NoteDebugPoint(RangeDebugPointKind.Try) | _ -> mTryToLast
13091307

13101308
if isQuery then error(Error(FSComp.SR.tcTryWithMayNotBeUsedInQueries(), mTry))
@@ -1536,15 +1534,15 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter
15361534
and convertSimpleReturnToExpr varSpace innerComp =
15371535
match innerComp with
15381536
| SynExpr.YieldOrReturn ((false, _), returnExpr, _) -> Some (returnExpr, None)
1539-
| SynExpr.Match (spMatch, expr, clauses, m) ->
1537+
| SynExpr.Match (mMatch, spMatch, mWith, expr, clauses, m) ->
15401538
let clauses =
15411539
clauses |> List.map (fun (SynMatchClause(pat, cond, arrow, innerComp2, patm, sp)) ->
15421540
match convertSimpleReturnToExpr varSpace innerComp2 with
15431541
| None -> None // failure
15441542
| Some (_, Some _) -> None // custom op on branch = failure
15451543
| Some (innerExpr2, None) -> Some (SynMatchClause(pat, cond, arrow, innerExpr2, patm, sp)))
15461544
if clauses |> List.forall Option.isSome then
1547-
Some (SynExpr.Match (spMatch, expr, (clauses |> List.map Option.get), m), None)
1545+
Some (SynExpr.Match (mMatch, spMatch, mWith, expr, (clauses |> List.map Option.get), m), None)
15481546
else
15491547
None
15501548

@@ -1608,10 +1606,10 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter
16081606
isSimpleExpr thenComp && (match elseCompOpt with None -> true | Some c -> isSimpleExpr c)
16091607
| SynExpr.LetOrUse (_, _, _, innerComp, _) -> isSimpleExpr innerComp
16101608
| SynExpr.LetOrUseBang _ -> false
1611-
| SynExpr.Match (_, _, clauses, _) ->
1609+
| SynExpr.Match (clauses=clauses) ->
16121610
clauses |> List.forall (fun (SynMatchClause(resultExpr = innerComp)) -> isSimpleExpr innerComp)
16131611
| SynExpr.MatchBang _ -> false
1614-
| SynExpr.TryWith (innerComp, _, clauses, _, _, _, _) ->
1612+
| SynExpr.TryWith (tryExpr=innerComp; withCases=clauses) ->
16151613
isSimpleExpr innerComp &&
16161614
clauses |> List.forall (fun (SynMatchClause(resultExpr = clauseComp)) -> isSimpleExpr clauseComp)
16171615
| SynExpr.YieldOrReturnFrom _ -> false
@@ -1870,7 +1868,7 @@ let TcSequenceExpression (cenv: cenv) env tpenv comp (overallTy: OverallTy) m =
18701868
| SynExpr.LetOrUseBang (range=m) ->
18711869
error(Error(FSComp.SR.tcUseForInSequenceExpression(), m))
18721870

1873-
| SynExpr.Match (spMatch, expr, clauses, _) ->
1871+
| SynExpr.Match (_mMatch, spMatch, expr, _mWith, clauses, _m) ->
18741872
let inputExpr, matchty, tpenv = TcExprOfUnknownType cenv env tpenv expr
18751873
let tclauses, tpenv =
18761874
(tpenv, clauses) ||> List.mapFold (fun tpenv (SynMatchClause(pat, cond, _, innerComp, _, sp)) ->

src/fsharp/CheckDeclarations.fs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2383,7 +2383,7 @@ let TcMutRecDefns_Phase2 (cenv: cenv) envInitial bindsm scopem mutRecNSInfo (env
23832383
let (MutRecDefnsPhase2DataForTycon(_, _, declKind, tcref, _, _, declaredTyconTypars, members, _, _, _)) = tyconMembersData
23842384
let overridesOK = DeclKind.CanOverrideOrImplement declKind
23852385
members |> List.collect (function
2386-
| SynMemberDefn.Interface(ity, defnOpt, _) ->
2386+
| SynMemberDefn.Interface(interfaceType=ity; members=defnOpt) ->
23872387
let _, ty = if tcref.Deref.IsExceptionDecl then [], g.exn_ty else generalizeTyconRef tcref
23882388
let m = ity.Range
23892389
if tcref.IsTypeAbbrev then error(Error(FSComp.SR.tcTypeAbbreviationsCannotHaveInterfaceDeclaration(), m))
@@ -3013,7 +3013,7 @@ module TcExceptionDeclarations =
30133013
let binds3 = AddAugmentationDeclarations.AddGenericEqualityBindings cenv envFinal exnc
30143014
binds1 @ binds2flat @ binds3, exnc, envFinal
30153015

3016-
let TcExnSignature cenv envInitial parent tpenv (SynExceptionSig(core, aug, _), scopem) =
3016+
let TcExnSignature cenv envInitial parent tpenv (SynExceptionSig(exnRepr=core; members=aug), scopem) =
30173017
let binds, exnc = TcExnDefnCore cenv envInitial parent core
30183018
let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) exnc
30193019
let ecref = mkLocalEntityRef exnc
@@ -3191,7 +3191,7 @@ module EstablishTypeDefinitionCores =
31913191
for SynTypeDefn(typeInfo=SynComponentInfo(typeParams=TyparDecls typars; longId=ids); typeRepr=trepr) in typeSpecs do
31923192
if isNil typars then
31933193
match trepr with
3194-
| SynTypeDefnRepr.ObjectModel(SynTypeDefnKind.Augmentation, _, _) -> ()
3194+
| SynTypeDefnRepr.ObjectModel(kind=SynTypeDefnKind.Augmentation _) -> ()
31953195
| _ -> yield (List.last ids).idText
31963196
| _ -> () ]
31973197
|> set
@@ -3201,7 +3201,7 @@ module EstablishTypeDefinitionCores =
32013201
[ for def in defs do
32023202
match def with
32033203
| SynModuleSigDecl.Types (typeSpecs, _) ->
3204-
for SynTypeDefnSig(SynComponentInfo(typeParams=TyparDecls typars; longId=ids), _, trepr, extraMembers, _) in typeSpecs do
3204+
for SynTypeDefnSig(typeInfo=SynComponentInfo(typeParams=TyparDecls typars; longId=ids); typeRepr=trepr; members=extraMembers) in typeSpecs do
32053205
if isNil typars then
32063206
match trepr with
32073207
| SynTypeDefnSigRepr.Simple(SynTypeDefnSimpleRepr.None _, _) when not (isNil extraMembers) -> ()
@@ -4081,7 +4081,7 @@ module EstablishTypeDefinitionCores =
40814081
let abstractSlots =
40824082
[ for valSpfn, memberFlags in slotsigs do
40834083

4084-
let (SynValSig(_, _, _, _, _valSynData, _, _, _, _, _, m)) = valSpfn
4084+
let (SynValSig(range=m)) = valSpfn
40854085

40864086
CheckMemberFlags None NewSlotsOK OverridesOK memberFlags m
40874087

@@ -4593,7 +4593,7 @@ module TcDeclarations =
45934593
declKind, tcref, typars
45944594

45954595

4596-
let private isAugmentationTyconDefnRepr = function SynTypeDefnSimpleRepr.General(SynTypeDefnKind.Augmentation, _, _, _, _, _, _, _) -> true | _ -> false
4596+
let private isAugmentationTyconDefnRepr = function SynTypeDefnSimpleRepr.General(kind=SynTypeDefnKind.Augmentation _) -> true | _ -> false
45974597
let private isAutoProperty = function SynMemberDefn.AutoProperty _ -> true | _ -> false
45984598
let private isMember = function SynMemberDefn.Member _ -> true | _ -> false
45994599
let private isImplicitCtor = function SynMemberDefn.ImplicitCtor _ -> true | _ -> false
@@ -4669,12 +4669,12 @@ module TcDeclarations =
46694669
/// body = members
46704670
/// where members contain methods/overrides, also implicit ctor, inheritCall and local definitions.
46714671
let rec private SplitTyconDefn (SynTypeDefn(typeInfo=synTyconInfo;typeRepr=trepr; members=extraMembers)) =
4672-
let implements1 = List.choose (function SynMemberDefn.Interface (ty, _, _) -> Some(ty, ty.Range) | _ -> None) extraMembers
4672+
let implements1 = List.choose (function SynMemberDefn.Interface (interfaceType=ty) -> Some(ty, ty.Range) | _ -> None) extraMembers
46734673
match trepr with
46744674
| SynTypeDefnRepr.ObjectModel(kind, cspec, m) ->
46754675
CheckMembersForm cspec
46764676
let fields = cspec |> List.choose (function SynMemberDefn.ValField (f, _) -> Some f | _ -> None)
4677-
let implements2 = cspec |> List.choose (function SynMemberDefn.Interface (ty, _, _) -> Some(ty, ty.Range) | _ -> None)
4677+
let implements2 = cspec |> List.choose (function SynMemberDefn.Interface (interfaceType=ty) -> Some(ty, ty.Range) | _ -> None)
46784678
let inherits =
46794679
cspec |> List.choose (function
46804680
| SynMemberDefn.Inherit (ty, idOpt, m) -> Some(ty, m, idOpt)
@@ -4708,7 +4708,7 @@ module TcDeclarations =
47084708
let attribs = attribs |> List.filter (fun a -> match a.Target with Some t when t.idText = "field" -> true | _ -> false)
47094709
let mLetPortion = synExpr.Range
47104710
let fldId = ident (CompilerGeneratedName id.idText, mLetPortion)
4711-
let headPat = SynPat.LongIdent (LongIdentWithDots([fldId], []), None, Some noInferredTypars, SynArgPats.Pats [], None, mLetPortion)
4711+
let headPat = SynPat.LongIdent (LongIdentWithDots([fldId], []), None, None, Some noInferredTypars, SynArgPats.Pats [], None, mLetPortion)
47124712
let retInfo = match tyOpt with None -> None | Some ty -> Some (SynReturnInfo((ty, SynInfo.unnamedRetVal), ty.Range))
47134713
let isMutable =
47144714
match propKind with
@@ -4720,7 +4720,7 @@ module TcDeclarations =
47204720

47214721
[(SynMemberDefn.LetBindings ([binding], isStatic, false, mWholeAutoProp))]
47224722

4723-
| SynMemberDefn.Interface (_, Some membs, _) -> membs |> List.collect preAutoProps
4723+
| SynMemberDefn.Interface (members=Some membs) -> membs |> List.collect preAutoProps
47244724
| SynMemberDefn.LetBindings _
47254725
| SynMemberDefn.ImplicitCtor _
47264726
| SynMemberDefn.Open _
@@ -4736,7 +4736,7 @@ module TcDeclarations =
47364736
let attribs = attribs |> List.filter (fun a -> match a.Target with Some t when t.idText = "field" -> false | _ -> true)
47374737
let fldId = ident (CompilerGeneratedName id.idText, mMemberPortion)
47384738
let headPatIds = if isStatic then [id] else [ident ("__", mMemberPortion);id]
4739-
let headPat = SynPat.LongIdent (LongIdentWithDots(headPatIds, []), None, Some noInferredTypars, SynArgPats.Pats [], None, mMemberPortion)
4739+
let headPat = SynPat.LongIdent (LongIdentWithDots(headPatIds, []), None, None, Some noInferredTypars, SynArgPats.Pats [], None, mMemberPortion)
47404740

47414741
match propKind, mGetSetOpt with
47424742
| SynMemberKind.PropertySet, Some m -> errorR(Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSetNotJustSet(), m))
@@ -4761,16 +4761,16 @@ module TcDeclarations =
47614761
| SynMemberKind.PropertyGetSet ->
47624762
let setter =
47634763
let vId = ident("v", mMemberPortion)
4764-
let headPat = SynPat.LongIdent (LongIdentWithDots(headPatIds, []), None, Some noInferredTypars, SynArgPats.Pats [mkSynPatVar None vId], None, mMemberPortion)
4764+
let headPat = SynPat.LongIdent (LongIdentWithDots(headPatIds, []), None, None, Some noInferredTypars, SynArgPats.Pats [mkSynPatVar None vId], None, mMemberPortion)
47654765
let rhsExpr = mkSynAssign (SynExpr.Ident fldId) (SynExpr.Ident vId)
47664766
//let retInfo = match tyOpt with None -> None | Some ty -> Some (SynReturnInfo((ty, SynInfo.unnamedRetVal), ty.Range))
47674767
let binding = mkSynBinding (xmlDoc, headPat) (access, false, false, mMemberPortion, DebugPointAtBinding.NoneAtInvisible, None, None, rhsExpr, rhsExpr.Range, [], [], Some (memberFlags SynMemberKind.PropertySet))
47684768
SynMemberDefn.Member (binding, mMemberPortion)
47694769
yield setter
47704770
| _ -> ()]
4771-
| SynMemberDefn.Interface (ty, Some membs, m) ->
4771+
| SynMemberDefn.Interface (ty, mWith, Some membs, m) ->
47724772
let membs' = membs |> List.collect postAutoProps
4773-
[SynMemberDefn.Interface (ty, Some membs', m)]
4773+
[SynMemberDefn.Interface (ty, mWith, Some membs', m)]
47744774
| SynMemberDefn.LetBindings _
47754775
| SynMemberDefn.ImplicitCtor _
47764776
| SynMemberDefn.Open _
@@ -4785,7 +4785,7 @@ module TcDeclarations =
47854785
let isConcrete =
47864786
members |> List.exists (function
47874787
| SynMemberDefn.Member(SynBinding(valData = SynValData(Some memberFlags, _, _)), _) -> not memberFlags.IsDispatchSlot
4788-
| SynMemberDefn.Interface (_, defOpt, _) -> Option.isSome defOpt
4788+
| SynMemberDefn.Interface (members=defOpt) -> Option.isSome defOpt
47894789
| SynMemberDefn.LetBindings _ -> true
47904790
| SynMemberDefn.ImplicitCtor _ -> true
47914791
| SynMemberDefn.ImplicitInherit _ -> true
@@ -5222,10 +5222,10 @@ and TcSignatureElementsMutRec cenv parent typeNames m mutRecNSInfo envInitial (d
52225222
let decls = [ MutRecShape.Open (MutRecDataForOpen(target, m, moduleRange, ref [])) ]
52235223
decls, (openOk, moduleAbbrevOk)
52245224

5225-
| SynModuleSigDecl.Exception (SynExceptionSig(exnRepr, members, _), _) ->
5225+
| SynModuleSigDecl.Exception (exnSig=SynExceptionSig(exnRepr=exnRepr; withKeyword=withKeyword; members=members)) ->
52265226
let ( SynExceptionDefnRepr(synAttrs, SynUnionCase(_, id, _args, _, _, _), _, doc, vis, m)) = exnRepr
52275227
let compInfo = SynComponentInfo(synAttrs, None, [], [id], doc, false, vis, id.idRange)
5228-
let decls = [ MutRecShape.Tycon(SynTypeDefnSig.SynTypeDefnSig(compInfo, None, SynTypeDefnSigRepr.Exception exnRepr, members, m)) ]
5228+
let decls = [ MutRecShape.Tycon(SynTypeDefnSig.SynTypeDefnSig(compInfo, None, SynTypeDefnSigRepr.Exception exnRepr, withKeyword, members, m)) ]
52295229
decls, (false, false)
52305230

52315231
| SynModuleSigDecl.Val (vspec, _) ->

0 commit comments

Comments
 (0)