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
20 changes: 9 additions & 11 deletions src/fsharp/CheckComputationExpressions.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1283,16 +1283,14 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter
// Build the 'Bind' call
Some (transBind q varSpace bindRange "Bind" [mergedSources] consumePat letSpBind innerComp translatedCtxt)

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

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

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

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

if isQuery then error(Error(FSComp.SR.tcTryWithMayNotBeUsedInQueries(), mTry))
Expand Down Expand Up @@ -1536,15 +1534,15 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter
and convertSimpleReturnToExpr varSpace innerComp =
match innerComp with
| SynExpr.YieldOrReturn ((false, _), returnExpr, _) -> Some (returnExpr, None)
| SynExpr.Match (spMatch, expr, clauses, m) ->
| SynExpr.Match (mMatch, spMatch, mWith, expr, clauses, m) ->
let clauses =
clauses |> List.map (fun (SynMatchClause(pat, cond, arrow, innerComp2, patm, sp)) ->
match convertSimpleReturnToExpr varSpace innerComp2 with
| None -> None // failure
| Some (_, Some _) -> None // custom op on branch = failure
| Some (innerExpr2, None) -> Some (SynMatchClause(pat, cond, arrow, innerExpr2, patm, sp)))
if clauses |> List.forall Option.isSome then
Some (SynExpr.Match (spMatch, expr, (clauses |> List.map Option.get), m), None)
Some (SynExpr.Match (mMatch, spMatch, mWith, expr, (clauses |> List.map Option.get), m), None)
else
None

Expand Down Expand Up @@ -1608,10 +1606,10 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter
isSimpleExpr thenComp && (match elseCompOpt with None -> true | Some c -> isSimpleExpr c)
| SynExpr.LetOrUse (_, _, _, innerComp, _) -> isSimpleExpr innerComp
| SynExpr.LetOrUseBang _ -> false
| SynExpr.Match (_, _, clauses, _) ->
| SynExpr.Match (clauses=clauses) ->
clauses |> List.forall (fun (SynMatchClause(resultExpr = innerComp)) -> isSimpleExpr innerComp)
| SynExpr.MatchBang _ -> false
| SynExpr.TryWith (innerComp, _, clauses, _, _, _, _) ->
| SynExpr.TryWith (tryExpr=innerComp; withCases=clauses) ->
isSimpleExpr innerComp &&
clauses |> List.forall (fun (SynMatchClause(resultExpr = clauseComp)) -> isSimpleExpr clauseComp)
| SynExpr.YieldOrReturnFrom _ -> false
Expand Down Expand Up @@ -1870,7 +1868,7 @@ let TcSequenceExpression (cenv: cenv) env tpenv comp (overallTy: OverallTy) m =
| SynExpr.LetOrUseBang (range=m) ->
error(Error(FSComp.SR.tcUseForInSequenceExpression(), m))

| SynExpr.Match (spMatch, expr, clauses, _) ->
| SynExpr.Match (_mMatch, spMatch, expr, _mWith, clauses, _m) ->
let inputExpr, matchty, tpenv = TcExprOfUnknownType cenv env tpenv expr
let tclauses, tpenv =
(tpenv, clauses) ||> List.mapFold (fun tpenv (SynMatchClause(pat, cond, _, innerComp, _, sp)) ->
Expand Down
34 changes: 17 additions & 17 deletions src/fsharp/CheckDeclarations.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2383,7 +2383,7 @@ let TcMutRecDefns_Phase2 (cenv: cenv) envInitial bindsm scopem mutRecNSInfo (env
let (MutRecDefnsPhase2DataForTycon(_, _, declKind, tcref, _, _, declaredTyconTypars, members, _, _, _)) = tyconMembersData
let overridesOK = DeclKind.CanOverrideOrImplement declKind
members |> List.collect (function
| SynMemberDefn.Interface(ity, defnOpt, _) ->
| SynMemberDefn.Interface(interfaceType=ity; members=defnOpt) ->
let _, ty = if tcref.Deref.IsExceptionDecl then [], g.exn_ty else generalizeTyconRef tcref
let m = ity.Range
if tcref.IsTypeAbbrev then error(Error(FSComp.SR.tcTypeAbbreviationsCannotHaveInterfaceDeclaration(), m))
Expand Down Expand Up @@ -3013,7 +3013,7 @@ module TcExceptionDeclarations =
let binds3 = AddAugmentationDeclarations.AddGenericEqualityBindings cenv envFinal exnc
binds1 @ binds2flat @ binds3, exnc, envFinal

let TcExnSignature cenv envInitial parent tpenv (SynExceptionSig(core, aug, _), scopem) =
let TcExnSignature cenv envInitial parent tpenv (SynExceptionSig(exnRepr=core; members=aug), scopem) =
let binds, exnc = TcExnDefnCore cenv envInitial parent core
let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) exnc
let ecref = mkLocalEntityRef exnc
Expand Down Expand Up @@ -3191,7 +3191,7 @@ module EstablishTypeDefinitionCores =
for SynTypeDefn(typeInfo=SynComponentInfo(typeParams=TyparDecls typars; longId=ids); typeRepr=trepr) in typeSpecs do
if isNil typars then
match trepr with
| SynTypeDefnRepr.ObjectModel(SynTypeDefnKind.Augmentation, _, _) -> ()
| SynTypeDefnRepr.ObjectModel(kind=SynTypeDefnKind.Augmentation _) -> ()
| _ -> yield (List.last ids).idText
| _ -> () ]
|> set
Expand All @@ -3201,7 +3201,7 @@ module EstablishTypeDefinitionCores =
[ for def in defs do
match def with
| SynModuleSigDecl.Types (typeSpecs, _) ->
for SynTypeDefnSig(SynComponentInfo(typeParams=TyparDecls typars; longId=ids), _, trepr, extraMembers, _) in typeSpecs do
for SynTypeDefnSig(typeInfo=SynComponentInfo(typeParams=TyparDecls typars; longId=ids); typeRepr=trepr; members=extraMembers) in typeSpecs do
if isNil typars then
match trepr with
| SynTypeDefnSigRepr.Simple(SynTypeDefnSimpleRepr.None _, _) when not (isNil extraMembers) -> ()
Expand Down Expand Up @@ -4081,7 +4081,7 @@ module EstablishTypeDefinitionCores =
let abstractSlots =
[ for valSpfn, memberFlags in slotsigs do

let (SynValSig(_, _, _, _, _valSynData, _, _, _, _, _, m)) = valSpfn
let (SynValSig(range=m)) = valSpfn

CheckMemberFlags None NewSlotsOK OverridesOK memberFlags m

Expand Down Expand Up @@ -4593,7 +4593,7 @@ module TcDeclarations =
declKind, tcref, typars


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

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

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

match propKind, mGetSetOpt with
| SynMemberKind.PropertySet, Some m -> errorR(Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSetNotJustSet(), m))
Expand All @@ -4761,16 +4761,16 @@ module TcDeclarations =
| SynMemberKind.PropertyGetSet ->
let setter =
let vId = ident("v", mMemberPortion)
let headPat = SynPat.LongIdent (LongIdentWithDots(headPatIds, []), None, Some noInferredTypars, SynArgPats.Pats [mkSynPatVar None vId], None, mMemberPortion)
let headPat = SynPat.LongIdent (LongIdentWithDots(headPatIds, []), None, None, Some noInferredTypars, SynArgPats.Pats [mkSynPatVar None vId], None, mMemberPortion)
let rhsExpr = mkSynAssign (SynExpr.Ident fldId) (SynExpr.Ident vId)
//let retInfo = match tyOpt with None -> None | Some ty -> Some (SynReturnInfo((ty, SynInfo.unnamedRetVal), ty.Range))
let binding = mkSynBinding (xmlDoc, headPat) (access, false, false, mMemberPortion, DebugPointAtBinding.NoneAtInvisible, None, None, rhsExpr, rhsExpr.Range, [], [], Some (memberFlags SynMemberKind.PropertySet))
SynMemberDefn.Member (binding, mMemberPortion)
yield setter
| _ -> ()]
| SynMemberDefn.Interface (ty, Some membs, m) ->
| SynMemberDefn.Interface (ty, mWith, Some membs, m) ->
let membs' = membs |> List.collect postAutoProps
[SynMemberDefn.Interface (ty, Some membs', m)]
[SynMemberDefn.Interface (ty, mWith, Some membs', m)]
| SynMemberDefn.LetBindings _
| SynMemberDefn.ImplicitCtor _
| SynMemberDefn.Open _
Expand All @@ -4785,7 +4785,7 @@ module TcDeclarations =
let isConcrete =
members |> List.exists (function
| SynMemberDefn.Member(SynBinding(valData = SynValData(Some memberFlags, _, _)), _) -> not memberFlags.IsDispatchSlot
| SynMemberDefn.Interface (_, defOpt, _) -> Option.isSome defOpt
| SynMemberDefn.Interface (members=defOpt) -> Option.isSome defOpt
| SynMemberDefn.LetBindings _ -> true
| SynMemberDefn.ImplicitCtor _ -> true
| SynMemberDefn.ImplicitInherit _ -> true
Expand Down Expand Up @@ -5222,10 +5222,10 @@ and TcSignatureElementsMutRec cenv parent typeNames m mutRecNSInfo envInitial (d
let decls = [ MutRecShape.Open (MutRecDataForOpen(target, m, moduleRange, ref [])) ]
decls, (openOk, moduleAbbrevOk)

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

| SynModuleSigDecl.Val (vspec, _) ->
Expand Down
Loading