Skip to content

Member is not included in range of TypeDefnSig #11432

@nojaf

Description

@nojaf

Hello,

I found another minor discrepancy between implementation files and signature files.

Repro steps

Consider the following code:

Signature

namespace X
type MyRecord =
    { Level: int }
    member Score : unit -> int

AST:

TypeDefnSig
                 (ComponentInfo
                    ([], [], [], [MyRecord],
                     PreXmlDoc ((2,13), FSharp.Compiler.XmlDoc+XmlDocCollector),
                     false, None, tmp.fsi (2,5--2,13) IsSynthetic=false),
                  Simple
                    (Record
                       (None,
                        [Field
                           ([], false, Some Level,
                            LongIdent (LongIdentWithDots ([int], [])), false,
                            PreXmlDoc ((3,11), FSharp.Compiler.XmlDoc+XmlDocCollector),
                            None, tmp.fsi (3,6--3,16) IsSynthetic=false)],
                        tmp.fsi (3,4--3,18) IsSynthetic=false),
                     tmp.fsi (3,4--3,18) IsSynthetic=false),
                  [Member
                     (ValSpfn
                        ([], Score, SynValTyparDecls ([], true, []),
                         Fun
                           (LongIdent (LongIdentWithDots ([unit], [])),
                            LongIdent (LongIdentWithDots ([int], [])),
                            tmp.fsi (4,19--4,30) IsSynthetic=false),
                         SynValInfo
                           ([[SynArgInfo ([], false, None)]],
                            SynArgInfo ([], false, None)), false, false,
                         PreXmlDoc ((4,10), FSharp.Compiler.XmlDoc+XmlDocCollector),
                         None, None, tmp.fsi (4,4--4,30) IsSynthetic=false),
                      { IsInstance = true
                        IsDispatchSlot = false
                        IsOverrideOrExplicitImpl = false
                        IsFinal = false
                        MemberKind = Member },
                      tmp.fsi (4,4--4,30) IsSynthetic=false)],
                  tmp.fsi (3,4--3,18) IsSynthetic=false)

Notice how TypeDefnSig ends on position 3.18.

Implementation

namespace X
type MyRecord =
    { Level: int }
    member Score () = 7

AST

TypeDefn
                 (ComponentInfo
                    ([], [], [], [MyRecord],
                     PreXmlDoc ((2,13), FSharp.Compiler.XmlDoc+XmlDocCollector),
                     false, None, tmp.fsx (2,5--2,13) IsSynthetic=false),
                  Simple
                    (Record
                       (None,
                        [Field
                           ([], false, Some Level,
                            LongIdent (LongIdentWithDots ([int], [])), false,
                            PreXmlDoc ((3,11), FSharp.Compiler.XmlDoc+XmlDocCollector),
                            None, tmp.fsx (3,6--3,16) IsSynthetic=false)],
                        tmp.fsx (3,4--3,18) IsSynthetic=false),
                     tmp.fsx (3,4--3,18) IsSynthetic=false),
                  [Member
                     (Binding
                        (None, NormalBinding, false, false, [],
                         PreXmlDoc ((4,11), FSharp.Compiler.XmlDoc+XmlDocCollector),
                         SynValData
                           (Some { IsInstance = true
                                   IsDispatchSlot = false
                                   IsOverrideOrExplicitImpl = false
                                   IsFinal = false
                                   MemberKind = Member },
                            SynValInfo
                              ([[SynArgInfo ([], false, None)]; []],
                               SynArgInfo ([], false, None)), None),
                         LongIdent
                           (LongIdentWithDots ([Score], []), None, None,
                            Pats
                              [Paren
                                 (Const
                                    (Unit,
                                     tmp.fsx (4,17--4,19) IsSynthetic=false),
                                  tmp.fsx (4,17--4,19) IsSynthetic=false)], None,
                            tmp.fsx (4,11--4,19) IsSynthetic=false), None,
                         Const (Int32 7, tmp.fsx (4,22--4,23) IsSynthetic=false),
                         tmp.fsx (4,11--4,19) IsSynthetic=false,
                         NoDebugPointAtInvisibleBinding),
                      tmp.fsx (4,4--4,23) IsSynthetic=false)],
                  tmp.fsx (2,5--4,23) IsSynthetic=false)

TypeDefn ends on position 4,23, including the member.

Expected behavior

The range of both TypeDefnSig and TypeDefn include the members.

Actual behavior

Only TypeDefn contains the member.

Known workarounds

Construct a new range for TypeDefnSig that uses the end position of the last member.

Related information

Provide any related information (optional):

  • FCS 39

I'm interested in submitting a PR, please confirm my assumption that members should be included in the range.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions