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: 13 additions & 7 deletions src/Compiler/Checking/CheckDeclarations.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2531,6 +2531,7 @@ let TcMutRecDefns_Phase2 (cenv: cenv) envInitial bindsm scopem mutRecNSInfo (env
| SynMemberDefn.LetBindings _
| SynMemberDefn.AutoProperty _
| SynMemberDefn.Member _
| SynMemberDefn.GetSetMember _
| SynMemberDefn.Open _
-> Some(TyconBindingDefn(containerInfo, newslotsOK, declKind, memb, memb.Range))

Expand All @@ -2554,7 +2555,8 @@ let TcMutRecDefns_Phase2 (cenv: cenv) envInitial bindsm scopem mutRecNSInfo (env
error(InternalError("Intrinsic augmentations of types are only permitted in the same file as the definition of the type", m))
members |> List.iter (fun mem ->
match mem with
| SynMemberDefn.Member _ -> ()
| SynMemberDefn.Member _
| SynMemberDefn.GetSetMember _
| SynMemberDefn.Interface _ -> ()
| SynMemberDefn.Open _
| SynMemberDefn.AutoProperty _
Expand Down Expand Up @@ -4813,10 +4815,12 @@ module TcDeclarations =
/// where simpleRepr can contain inherit type, declared fields and virtual slots.
/// 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 rec private SplitTyconDefn (SynTypeDefn(typeInfo=synTyconInfo;typeRepr=trepr; members=extraMembers)) =
let extraMembers = desugarGetSetMembers extraMembers
let implements1 = List.choose (function SynMemberDefn.Interface (interfaceType=ty) -> Some(ty, ty.Range) | _ -> None) extraMembers
match trepr with
| SynTypeDefnRepr.ObjectModel(kind, cspec, m) ->
let cspec = desugarGetSetMembers cspec
CheckMembersForm cspec
let fields = cspec |> List.choose (function SynMemberDefn.ValField (f, _) -> Some f | _ -> None)
let implements2 = cspec |> List.choose (function SynMemberDefn.Interface (interfaceType=ty) -> Some(ty, ty.Range) | _ -> None)
Expand All @@ -4833,7 +4837,8 @@ module TcDeclarations =
cspec |> List.filter (fun memb ->
match memb with
| SynMemberDefn.Interface _
| SynMemberDefn.Member _
| SynMemberDefn.Member _
| SynMemberDefn.GetSetMember _
| SynMemberDefn.LetBindings _
| SynMemberDefn.ImplicitCtor _
| SynMemberDefn.AutoProperty _
Expand All @@ -4853,7 +4858,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 (SynLongIdent([fldId], [], [None]), None, None, Some noInferredTypars, SynArgPats.Pats [], None, mLetPortion)
let headPat = SynPat.LongIdent (SynLongIdent([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 Down Expand Up @@ -4881,7 +4886,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 (SynLongIdent(headPatIds, [], List.replicate headPatIds.Length None), None, None, Some noInferredTypars, SynArgPats.Pats [], None, mMemberPortion)
let headPat = SynPat.LongIdent (SynLongIdent(headPatIds, [], List.replicate headPatIds.Length None), None, Some noInferredTypars, SynArgPats.Pats [], None, mMemberPortion)

match propKind, mGetSetOpt with
| SynMemberKind.PropertySet, Some m -> errorR(Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSetNotJustSet(), m))
Expand All @@ -4906,7 +4911,7 @@ module TcDeclarations =
| SynMemberKind.PropertyGetSet ->
let setter =
let vId = ident("v", mMemberPortion)
let headPat = SynPat.LongIdent (SynLongIdent(headPatIds, [], List.replicate headPatIds.Length None), None, None, Some noInferredTypars, SynArgPats.Pats [mkSynPatVar None vId], None, mMemberPortion)
let headPat = SynPat.LongIdent (SynLongIdent(headPatIds, [], List.replicate headPatIds.Length 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, rhsExpr, rhsExpr.Range, [], [], Some (memberFlags SynMemberKind.PropertySet), SynBindingTrivia.Zero)
Expand Down Expand Up @@ -5717,7 +5722,8 @@ and TcModuleOrNamespaceElementsMutRec (cenv: cenv) parent typeNames m envInitial
let decls = [ MutRecShape.Open (MutRecDataForOpen(target, m, moduleRange, ref [])) ]
decls, (openOk, moduleAbbrevOk, attrs)

| SynModuleDecl.Exception (SynExceptionDefn(repr, _, members, _), _m) ->
| SynModuleDecl.Exception (SynExceptionDefn(repr, _, members, _), _m) ->
let members = desugarGetSetMembers members
let (SynExceptionDefnRepr(synAttrs, SynUnionCase(ident=SynIdent(id,_)), _repr, xmlDoc, vis, m)) = repr
let compInfo = SynComponentInfo(synAttrs, None, [], [id], xmlDoc, false, vis, id.idRange)
let decls = [ MutRecShape.Tycon(SynTypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, None, m, SynTypeDefnTrivia.Zero)) ]
Expand Down
8 changes: 7 additions & 1 deletion src/Compiler/Checking/CheckExpressions.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2636,7 +2636,7 @@ module BindingNormalization =
| SynPat.FromParseError(innerPat, _) ->
normPattern innerPat

| SynPat.LongIdent (SynLongIdent(longId, _, _), _, toolId, tyargs, SynArgPats.Pats args, vis, m) ->
| SynPat.LongIdent (SynLongIdent(longId, _, _), toolId, tyargs, SynArgPats.Pats args, vis, m) ->
let typars = match tyargs with None -> inferredTyparDecls | Some typars -> typars
match memberFlagsOpt with
| None ->
Expand Down Expand Up @@ -5710,6 +5710,12 @@ and TcExprUndelayed cenv (overallTy: OverallTy) env tpenv (synExpr: SynExpr) =
)

| SynExpr.ObjExpr (synObjTy, argopt, _mWith, binds, members, extraImpls, mNewExpr, m) ->
let members = desugarGetSetMembers members
let extraImpls =
extraImpls
|> List.map (fun (SynInterfaceImpl(interfaceTy, withKeyword, bindings, members, m)) ->
SynInterfaceImpl(interfaceTy, withKeyword, bindings, desugarGetSetMembers members, m)
)
TcNonControlFlowExpr env <| fun env ->
let binds = unionBindingAndMembers binds members
TcExprObjectExpr cenv overallTy env tpenv (synObjTy, argopt, binds, extraImpls, mNewExpr, m)
Expand Down
8 changes: 8 additions & 0 deletions src/Compiler/Service/FSharpParseFileResults.fs
Original file line number Diff line number Diff line change
Expand Up @@ -885,6 +885,14 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
| SynMemberDefn.AutoProperty (synExpr = synExpr) -> yield! walkExpr true synExpr
| SynMemberDefn.ImplicitCtor (_, _, _, _, _, m) -> yield! checkRange m
| SynMemberDefn.Member (bind, _) -> yield! walkBind bind
| SynMemberDefn.GetSetMember (getBinding, setBinding, _, _) ->
match getBinding, setBinding with
| None, None -> ()
| None, Some binding
| Some binding, None -> yield! walkBind binding
| Some getBinding, Some setBinding ->
yield! walkBind getBinding
yield! walkBind setBinding
| SynMemberDefn.Interface(members = Some membs) ->
for m in membs do
yield! walkMember m
Expand Down
15 changes: 12 additions & 3 deletions src/Compiler/Service/ServiceInterfaceStubGenerator.fs
Original file line number Diff line number Diff line change
Expand Up @@ -592,9 +592,12 @@ module InterfaceStubGenerator =
| InterfaceData.Interface (_, None) -> []
| InterfaceData.Interface (_, Some memberDefns) ->
memberDefns
|> Seq.choose (function
| SynMemberDefn.Member (binding, _) -> Some binding
| _ -> None)
|> Seq.collect (function
| SynMemberDefn.Member (binding, _) -> [ binding ]
| SynMemberDefn.GetSetMember (Some getBinding, Some setBinding, _, _) -> [ getBinding; setBinding ]
| SynMemberDefn.GetSetMember (Some binding, None, _, _)
| SynMemberDefn.GetSetMember (None, Some binding, _, _) -> [ binding ]
| _ -> [])
|> Seq.choose (|MemberNameAndRange|_|)
|> Seq.toList
| InterfaceData.ObjExpr (_, bindings) -> List.choose (|MemberNameAndRange|_|) bindings
Expand Down Expand Up @@ -817,6 +820,12 @@ module InterfaceStubGenerator =
else
Option.bind (List.tryPick walkSynMemberDefn) members
| SynMemberDefn.Member (binding, _range) -> walkBinding binding
| SynMemberDefn.GetSetMember (getBinding, setBinding, _, _) ->
match getBinding, setBinding with
| None, None -> None
| Some binding, None
| None, Some binding -> walkBinding binding
| Some getBinding, Some setBinding -> walkBinding getBinding |> Option.orElseWith (fun () -> walkBinding setBinding)
| SynMemberDefn.NestedType (typeDef, _access, _range) -> walkSynTypeDefn typeDef
| SynMemberDefn.ValField (_field, _range) -> None
| SynMemberDefn.LetBindings (bindings, _isStatic, _isRec, _range) -> List.tryPick walkBinding bindings
Expand Down
67 changes: 29 additions & 38 deletions src/Compiler/Service/ServiceNavigation.fs
Original file line number Diff line number Diff line change
Expand Up @@ -321,44 +321,32 @@ module NavigationImpl =
and processMembers members enclosingEntityKind =
let members =
members
|> List.groupBy (fun x -> x.Range)
|> List.map (fun (range, members) ->
range,
(match members with
| [ memb ] ->
match memb with
| SynMemberDefn.LetBindings (binds, _, _, _) -> List.collect (processBinding false enclosingEntityKind false) binds
| SynMemberDefn.Member (bind, _) -> processBinding true enclosingEntityKind false bind
| SynMemberDefn.ValField (SynField (_, _, Some (rcid), _, _, _, access, range), _) ->
[
createMember (rcid, NavigationItemKind.Field, FSharpGlyph.Field, range, enclosingEntityKind, false, access)
]
| SynMemberDefn.AutoProperty (ident = id; accessibility = access) ->
[
createMember (id, NavigationItemKind.Field, FSharpGlyph.Field, id.idRange, enclosingEntityKind, false, access)
]
| SynMemberDefn.AbstractSlot (SynValSig (ident = SynIdent (id, _); synType = ty; accessibility = access), _, _) ->
[
createMember (id, NavigationItemKind.Method, FSharpGlyph.OverridenMethod, ty.Range, enclosingEntityKind, true, access)
]
| SynMemberDefn.NestedType _ -> failwith "tycon as member????" //processTycon tycon
| SynMemberDefn.Interface(members = Some (membs)) -> processMembers membs enclosingEntityKind |> snd
| _ -> []
// can happen if one is a getter and one is a setter
| [ SynMemberDefn.Member(memberDefn = SynBinding(headPat = SynPat.LongIdent (longDotId = lid1; extraId = Some (info1))) as binding1)
SynMemberDefn.Member(memberDefn = SynBinding(headPat = SynPat.LongIdent (longDotId = lid2; extraId = Some (info2))) as binding2) ] ->
// ensure same long id
assert
((lid1.LongIdent, lid2.LongIdent)
||> List.forall2 (fun x y -> x.idText = y.idText))
// ensure one is getter, other is setter
assert
((info1.idText = "set" && info2.idText = "get")
|| (info2.idText = "set" && info1.idText = "get"))
// both binding1 and binding2 have same range, so just try the first one, else try the second one
match processBinding true enclosingEntityKind false binding1 with
| [] -> processBinding true enclosingEntityKind false binding2
| x -> x
|> List.map (fun md ->
md.Range,
(match md with
| SynMemberDefn.LetBindings (binds, _, _, _) -> List.collect (processBinding false enclosingEntityKind false) binds
| SynMemberDefn.GetSetMember (Some bind, None, _, _)
| SynMemberDefn.GetSetMember (None, Some bind, _, _)
| SynMemberDefn.Member (bind, _) -> processBinding true enclosingEntityKind false bind
| SynMemberDefn.ValField (SynField (_, _, Some (rcid), _, _, _, access, range), _) ->
[
createMember (rcid, NavigationItemKind.Field, FSharpGlyph.Field, range, enclosingEntityKind, false, access)
]
| SynMemberDefn.AutoProperty (ident = id; accessibility = access) ->
[
createMember (id, NavigationItemKind.Field, FSharpGlyph.Field, id.idRange, enclosingEntityKind, false, access)
]
| SynMemberDefn.AbstractSlot (SynValSig (ident = SynIdent (id, _); synType = ty; accessibility = access), _, _) ->
[
createMember (id, NavigationItemKind.Method, FSharpGlyph.OverridenMethod, ty.Range, enclosingEntityKind, true, access)
]
| SynMemberDefn.NestedType _ -> failwith "tycon as member????" //processTycon tycon
| SynMemberDefn.Interface(members = Some (membs)) -> processMembers membs enclosingEntityKind |> snd
| SynMemberDefn.GetSetMember (Some getBinding, Some setBinding, _, _) ->
[
yield! processBinding true enclosingEntityKind false getBinding
yield! processBinding true enclosingEntityKind false setBinding
]
| _ -> []))

let m2 = members |> Seq.map fst |> Seq.fold unionRangesChecked range.Zero
Expand Down Expand Up @@ -997,6 +985,9 @@ module NavigateTo =
walkSynMemberDefn m container
| None -> ()
| SynMemberDefn.Member (binding, _) -> addBinding binding None container
| SynMemberDefn.GetSetMember (getBinding, setBinding, _, _) ->
Option.iter (fun b -> addBinding b None container) getBinding
Option.iter (fun b -> addBinding b None container) setBinding
| SynMemberDefn.NestedType (typeDef, _, _) -> walkSynTypeDefn typeDef container
| SynMemberDefn.ValField (field, _) -> addField field false container
| SynMemberDefn.LetBindings (bindings, _, _, _) ->
Expand Down
Loading