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: 10 additions & 10 deletions src/Compiler/Checking/CheckDeclarations.fs
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ let private CheckDuplicatesAbstractMethodParmsSig (typeSpecs: SynTypeDefnSig li
| SynTypeDefnSigRepr.ObjectModel(_, synMemberSigs, _) ->
for sms in synMemberSigs do
match sms with
| SynMemberSig.Member(synValSig, _, m) ->
| SynMemberSig.Member(memberSig = synValSig; range = m) ->
CheckDuplicatesArgNames synValSig m
| _ -> ()
| _ -> ()
Expand Down Expand Up @@ -601,7 +601,7 @@ let TcAndPublishMemberSpec cenv env containerInfo declKind tpenv memb =
| SynMemberSig.ValField(_, m) -> error(Error(FSComp.SR.tcFieldValIllegalHere(), m))
| SynMemberSig.Inherit(_, m) -> error(Error(FSComp.SR.tcInheritIllegalHere(), m))
| SynMemberSig.NestedType(_, m) -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), m))
| SynMemberSig.Member(synValSig, memberFlags, _) ->
| SynMemberSig.Member(memberSig = synValSig; flags = memberFlags) ->
TcAndPublishValSpec (cenv, env, containerInfo, declKind, Some memberFlags, tpenv, synValSig)
| SynMemberSig.Interface _ ->
// These are done in TcMutRecDefns_Phase1
Expand Down Expand Up @@ -3989,7 +3989,7 @@ module TcDeclarations =
for slot in ds do
if isAbstractSlot slot then
match slot with
| SynMemberDefn.AbstractSlot (synVal, _, m) ->
| SynMemberDefn.AbstractSlot (slotSig = synVal; range = m) ->
CheckDuplicatesArgNames synVal m
| _ -> ()

Expand Down Expand Up @@ -4030,7 +4030,7 @@ module TcDeclarations =
| SynMemberDefn.ImplicitInherit (ty, _, idOpt, m) -> Some(ty, m, idOpt)
| _ -> None)
//let nestedTycons = cspec |> List.choose (function SynMemberDefn.NestedType (x, _, _) -> Some x | _ -> None)
let slotsigs = cspec |> List.choose (function SynMemberDefn.AbstractSlot (x, y, _) -> Some(x, y) | _ -> None)
let slotsigs = cspec |> List.choose (function SynMemberDefn.AbstractSlot (slotSig = x; flags = y) -> Some(x, y) | _ -> None)

let members =
let membersIncludingAutoProps =
Expand Down Expand Up @@ -4080,7 +4080,7 @@ module TcDeclarations =
// Convert auto properties to member bindings in the post-list
let rec postAutoProps memb =
match memb with
| SynMemberDefn.AutoProperty(attributes=Attributes attribs; isStatic=isStatic; ident=id; typeOpt=tyOpt; propKind=propKind; memberFlags=memberFlags; memberFlagsForSet=memberFlagsForSet; xmlDoc=xmlDoc; accessibility=access; trivia = { GetSetKeyword = mGetSetOpt }) ->
| SynMemberDefn.AutoProperty(attributes=Attributes attribs; isStatic=isStatic; ident=id; typeOpt=tyOpt; propKind=propKind; memberFlags=memberFlags; memberFlagsForSet=memberFlagsForSet; xmlDoc=xmlDoc; accessibility=access; trivia = { GetSetKeywords = mGetSetOpt }) ->
let mMemberPortion = id.idRange
// Only the keep the non-field-targeted attributes
let attribs = attribs |> List.filter (fun a -> match a.Target with Some t when t.idText = "field" -> false | _ -> true)
Expand All @@ -4091,7 +4091,7 @@ module TcDeclarations =
let memberFlagsForSet = { memberFlagsForSet with GetterOrSetterIsCompilerGenerated = true }

match propKind, mGetSetOpt with
| SynMemberKind.PropertySet, Some m -> errorR(Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSetNotJustSet(), m))
| SynMemberKind.PropertySet, Some gs -> errorR(Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSetNotJustSet(), gs.Range))
| _ -> ()

[
Expand Down Expand Up @@ -4322,22 +4322,22 @@ module TcDeclarations =
let implements2 = cspec |> List.choose (function SynMemberSig.Interface (ty, m) -> Some(ty, m) | _ -> None)
let inherits = cspec |> List.choose (function SynMemberSig.Inherit (ty, _) -> Some(ty, m, None) | _ -> None)
//let nestedTycons = cspec |> List.choose (function SynMemberSig.NestedType (x, _) -> Some x | _ -> None)
let slotsigs = cspec |> List.choose (function SynMemberSig.Member (v, fl, _) when fl.IsDispatchSlot -> Some(v, fl) | _ -> None)
let slotsigs = cspec |> List.choose (function SynMemberSig.Member (memberSig = v; flags = fl) when fl.IsDispatchSlot -> Some(v, fl) | _ -> None)
let members = cspec |> List.filter (function
| SynMemberSig.Interface _ -> true
| SynMemberSig.Member (_, memberFlags, _) when not memberFlags.IsDispatchSlot -> true
| SynMemberSig.Member (flags = memberFlags) when not memberFlags.IsDispatchSlot -> true
| SynMemberSig.NestedType (_, m) -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), m)); false
| _ -> false)
let isConcrete =
members |> List.exists (function
| SynMemberSig.Member (_, memberFlags, _) -> memberFlags.MemberKind=SynMemberKind.Constructor
| SynMemberSig.Member (flags = memberFlags) -> memberFlags.MemberKind=SynMemberKind.Constructor
| _ -> false)

// An ugly bit of code to pre-determine if a type has a nullary constructor, prior to establishing the
// members of the type
let preEstablishedHasDefaultCtor =
members |> List.exists (function
| SynMemberSig.Member (synValSig, memberFlags, _) ->
| SynMemberSig.Member (memberSig = synValSig; flags = memberFlags) ->
memberFlags.MemberKind=SynMemberKind.Constructor &&
// REVIEW: This is a syntactic approximation
(match synValSig.SynType, synValSig.SynInfo.CurriedArgInfos with
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Checking/CheckExpressions.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4030,7 +4030,7 @@ and TcPseudoMemberSpec cenv newOk env synTypes tpenv synMemberSig m =
let tys, tpenv = List.mapFold (TcTypeAndRecover cenv newOk CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env) tpenv synTypes

match synMemberSig with
| SynMemberSig.Member (synValSig, memberFlags, m) ->
| SynMemberSig.Member (synValSig, memberFlags, m, _) ->
// REVIEW: Test pseudo constraints cannot refer to polymorphic methods.
// REVIEW: Test pseudo constraints cannot be curried.
let members, tpenv = TcValSpec cenv env ModuleOrMemberBinding newOk ExprContainerInfo (Some memberFlags) (Some (List.head tys)) tpenv synValSig []
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Service/ServiceInterfaceStubGenerator.fs
Original file line number Diff line number Diff line change
Expand Up @@ -825,7 +825,7 @@ module InterfaceStubGenerator =
None
else
match memberDefn with
| SynMemberDefn.AbstractSlot (_synValSig, _memberFlags, _range) -> None
| SynMemberDefn.AbstractSlot _ -> None
| SynMemberDefn.AutoProperty (synExpr = expr) -> walkExpr expr
| SynMemberDefn.Interface (interfaceType = interfaceType; members = members) ->
if rangeContainsPos interfaceType.Range pos then
Expand Down
8 changes: 4 additions & 4 deletions src/Compiler/Service/ServiceNavigation.fs
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ module NavigationImpl =
[
createMember (id, NavigationItemKind.Field, FSharpGlyph.Field, id.idRange, enclosingEntityKind, false, access)
]
| SynMemberDefn.AbstractSlot (SynValSig (ident = SynIdent (id, _); synType = ty; accessibility = access), _, _) ->
| SynMemberDefn.AbstractSlot(slotSig = SynValSig (ident = SynIdent (id, _); synType = ty; accessibility = access)) ->
[
createMember (id, NavigationItemKind.Method, FSharpGlyph.OverridenMethod, ty.Range, enclosingEntityKind, true, access)
]
Expand Down Expand Up @@ -557,7 +557,7 @@ module NavigationImpl =
[
for memb in members do
match memb with
| SynMemberSig.Member (SynValSig.SynValSig (ident = SynIdent (id, _); accessibility = access; range = m), _, _) ->
| SynMemberSig.Member(memberSig = SynValSig.SynValSig (ident = SynIdent (id, _); accessibility = access; range = m)) ->
createMember (id, NavigationItemKind.Method, FSharpGlyph.Method, m, NavigationEntityKind.Class, false, access)
| SynMemberSig.ValField (SynField (idOpt = Some rcid; fieldType = ty; accessibility = access), _) ->
createMember (rcid, NavigationItemKind.Field, FSharpGlyph.Field, ty.Range, NavigationEntityKind.Class, false, access)
Expand Down Expand Up @@ -882,7 +882,7 @@ module NavigateTo =

and walkSynMemberSig (synMemberSig: SynMemberSig) container =
match synMemberSig with
| SynMemberSig.Member (valSig, memberFlags, _) -> addMember valSig memberFlags true container
| SynMemberSig.Member (memberSig = valSig; flags = memberFlags) -> addMember valSig memberFlags true container
| SynMemberSig.ValField (synField, _) -> addField synField true container
| SynMemberSig.NestedType (synTypeDef, _) -> walkSynTypeDefnSig synTypeDef container
| SynMemberSig.Inherit _
Expand Down Expand Up @@ -980,7 +980,7 @@ module NavigateTo =

and walkSynMemberDefn (memberDefn: SynMemberDefn) container =
match memberDefn with
| SynMemberDefn.AbstractSlot (synValSig, memberFlags, _) -> addMember synValSig memberFlags false container
| SynMemberDefn.AbstractSlot (slotSig = synValSig; flags = memberFlags) -> addMember synValSig memberFlags false container
| SynMemberDefn.AutoProperty (ident = id) -> addIdent NavigableItemKind.Property id false container
| SynMemberDefn.Interface (members = members) ->
match members with
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Service/ServiceParseTreeWalk.fs
Original file line number Diff line number Diff line change
Expand Up @@ -924,7 +924,7 @@ module SyntaxTraversal =
|> List.map (fun x -> dive x x.RangeOfBindingWithRhs (traverseSynBinding path))
|> pick m
| x -> x
| SynMemberDefn.AbstractSlot (SynValSig (synType = synType), _memberFlags, _range) -> traverseSynType path synType
| SynMemberDefn.AbstractSlot(slotSig = SynValSig (synType = synType)) -> traverseSynType path synType
| SynMemberDefn.Interface (interfaceType = synType; members = synMemberDefnsOption) ->
match visitor.VisitInterfaceSynMemberDefnType(path, synType) with
| None ->
Expand Down
8 changes: 4 additions & 4 deletions src/Compiler/Service/ServiceParsedInputOps.fs
Original file line number Diff line number Diff line change
Expand Up @@ -867,7 +867,7 @@ module ParsedInput =
match membSig with
| SynMemberSig.Inherit (t, _) -> walkType t

| SynMemberSig.Member (vs, _, _) -> walkValSig vs
| SynMemberSig.Member (memberSig = vs) -> walkValSig vs

| SynMemberSig.Interface (t, _) -> walkType t

Expand All @@ -880,7 +880,7 @@ module ParsedInput =

and walkMember memb =
match memb with
| SynMemberDefn.AbstractSlot (valSig, _, _) -> walkValSig valSig
| SynMemberDefn.AbstractSlot (slotSig = valSig) -> walkValSig valSig

| SynMemberDefn.Member (binding, _) -> walkBinding binding

Expand Down Expand Up @@ -1869,7 +1869,7 @@ module ParsedInput =
match membSig with
| SynMemberSig.Inherit (t, _)
| SynMemberSig.Interface (t, _) -> walkType t
| SynMemberSig.Member (vs, _, _) -> walkValSig vs
| SynMemberSig.Member (memberSig = vs) -> walkValSig vs
| SynMemberSig.ValField (f, _) -> walkField f
| SynMemberSig.NestedType (nestedType = typeDefn) ->
let (SynTypeDefnSig (typeInfo = info; typeRepr = repr; members = memberSigs)) =
Expand All @@ -1888,7 +1888,7 @@ module ParsedInput =

and walkMember memb =
match memb with
| SynMemberDefn.AbstractSlot (valSig, _, _) -> walkValSig valSig
| SynMemberDefn.AbstractSlot (slotSig = valSig) -> walkValSig valSig
| SynMemberDefn.Member (binding, _) -> walkBinding binding
| SynMemberDefn.GetSetMember (getBinding, setBinding, _, _) ->
Option.iter walkBinding getBinding
Expand Down
4 changes: 2 additions & 2 deletions src/Compiler/Service/ServiceStructure.fs
Original file line number Diff line number Diff line change
Expand Up @@ -611,7 +611,7 @@ module Structure =

| SynMemberDefn.NestedType (td, _, _) -> parseTypeDefn td

| SynMemberDefn.AbstractSlot (SynValSig (synType = synt), _, r) ->
| SynMemberDefn.AbstractSlot (slotSig = SynValSig (synType = synt); range = r) ->
rcheck Scope.Member Collapse.Below d.Range (Range.startToEnd synt.Range r)

| SynMemberDefn.AutoProperty (synExpr = e; range = r) ->
Expand Down Expand Up @@ -890,7 +890,7 @@ module Structure =

let rec parseSynMemberDefnSig inp =
match inp with
| SynMemberSig.Member (valSigs, _, r) ->
| SynMemberSig.Member (memberSig = valSigs; range = r) ->
let collapse = Range.endToEnd valSigs.RangeOfId r
rcheck Scope.Member Collapse.Below r collapse
| SynMemberSig.ValField (SynField (attributes = attrs; range = fr), mFull) ->
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Service/ServiceXmlDocParser.fs
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ module XmlDocParsing =
|> Option.toList
|> List.collect getXmlDocablesSynMemberDefn

| SynMemberDefn.AbstractSlot (valSig, _, range) ->
| SynMemberDefn.AbstractSlot (slotSig = valSig; range = range) ->
let (SynValSig (attributes = synAttributes; arity = synValInfo; xmlDoc = preXmlDoc)) =
valSig

Expand Down
4 changes: 2 additions & 2 deletions src/Compiler/SyntaxTree/SyntaxTree.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1119,7 +1119,7 @@ type SynMemberKind =
[<NoEquality; NoComparison; RequireQualifiedAccess>]
type SynMemberSig =

| Member of memberSig: SynValSig * flags: SynMemberFlags * range: range
| Member of memberSig: SynValSig * flags: SynMemberFlags * range: range * trivia: SynMemberSigMemberTrivia

| Interface of interfaceType: SynType * range: range

Expand Down Expand Up @@ -1417,7 +1417,7 @@ type SynMemberDefn =

| LetBindings of bindings: SynBinding list * isStatic: bool * isRecursive: bool * range: range

| AbstractSlot of slotSig: SynValSig * flags: SynMemberFlags * range: range
| AbstractSlot of slotSig: SynValSig * flags: SynMemberFlags * range: range * trivia: SynMemberDefnAbstractSlotTrivia

| Interface of interfaceType: SynType * withKeyword: range option * members: SynMemberDefns option * range: range

Expand Down
8 changes: 6 additions & 2 deletions src/Compiler/SyntaxTree/SyntaxTree.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -1265,7 +1265,7 @@ type SynMemberKind =
type SynMemberSig =

/// A member definition in a type in a signature file
| Member of memberSig: SynValSig * flags: SynMemberFlags * range: range
| Member of memberSig: SynValSig * flags: SynMemberFlags * range: range * trivia: SynMemberSigMemberTrivia

/// An interface definition in a type in a signature file
| Interface of interfaceType: SynType * range: range
Expand Down Expand Up @@ -1598,7 +1598,11 @@ type SynMemberDefn =
| LetBindings of bindings: SynBinding list * isStatic: bool * isRecursive: bool * range: range

/// An abstract slot definition within a class or interface
| AbstractSlot of slotSig: SynValSig * flags: SynMemberFlags * range: range
| AbstractSlot of
slotSig: SynValSig *
flags: SynMemberFlags *
range: range *
trivia: SynMemberDefnAbstractSlotTrivia

/// An interface implementation definition within a class
| Interface of interfaceType: SynType * withKeyword: range option * members: SynMemberDefns option * range: range
Expand Down
34 changes: 33 additions & 1 deletion src/Compiler/SyntaxTree/SyntaxTrivia.fs
Original file line number Diff line number Diff line change
Expand Up @@ -314,15 +314,39 @@ type SynMemberGetSetTrivia =
[<NoEquality; NoComparison>]
type SynArgPatsNamePatPairsTrivia = { ParenRange: range }

[<NoEquality; NoComparison>]
type GetSetKeywords =
| Get of range
| Set of range
| GetSet of get: range * set: range

member x.Range =
match x with
| Get m
| Set m -> m
| GetSet (mG, mS) ->
if Range.rangeBeforePos mG mS.Start then
Range.unionRanges mG mS
else
Range.unionRanges mS mG

[<NoEquality; NoComparison>]
type SynMemberDefnAutoPropertyTrivia =
{
LeadingKeyword: SynLeadingKeyword
WithKeyword: range option
EqualsRange: range option
GetSetKeyword: range option
GetSetKeywords: GetSetKeywords option
}

[<NoEquality; NoComparison>]
type SynMemberDefnAbstractSlotTrivia =
{
GetSetKeywords: GetSetKeywords option
}

static member Zero = { GetSetKeywords = None }

[<NoEquality; NoComparison>]
type SynFieldTrivia =
{
Expand All @@ -336,3 +360,11 @@ type SynTypeOrTrivia = { OrKeyword: range }

[<NoEquality; NoComparison>]
type SynBindingReturnInfoTrivia = { ColonRange: range option }

[<NoEquality; NoComparison>]
type SynMemberSigMemberTrivia =
{
GetSetKeywords: GetSetKeywords option
}

static member Zero: SynMemberSigMemberTrivia = { GetSetKeywords = None }
31 changes: 30 additions & 1 deletion src/Compiler/SyntaxTree/SyntaxTrivia.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,15 @@ type SynArgPatsNamePatPairsTrivia =
ParenRange: range
}

/// Represents additional information for `get, set` syntax
[<NoEquality; NoComparison; RequireQualifiedAccess>]
type GetSetKeywords =
| Get of range
| Set of range
| GetSet of get: range * set: range

member Range: range

/// Represents additional information for SynMemberDefn.AutoProperty
[<NoEquality; NoComparison>]
type SynMemberDefnAutoPropertyTrivia =
Expand All @@ -418,9 +427,19 @@ type SynMemberDefnAutoPropertyTrivia =
EqualsRange: range option

/// The syntax range of 'get, set'
GetSetKeyword: range option
GetSetKeywords: GetSetKeywords option
}

/// Represents additional information for SynMemberDefn.AbstractSlot
[<NoEquality; NoComparison>]
type SynMemberDefnAbstractSlotTrivia =
{
/// The syntax range of 'get, set'
GetSetKeywords: GetSetKeywords option
}

static member Zero: SynMemberDefnAbstractSlotTrivia

/// Represents additional information for SynField
[<NoEquality; NoComparison>]
type SynFieldTrivia =
Expand All @@ -446,3 +465,13 @@ type SynBindingReturnInfoTrivia =
/// The syntax range of the `:` token
ColonRange: range option
}

/// Represents additional information for SynMemberSig.Member
[<NoEquality; NoComparison>]
type SynMemberSigMemberTrivia =
{
/// The syntax range of 'get, set'
GetSetKeywords: GetSetKeywords option
}

static member Zero: SynMemberSigMemberTrivia
Loading