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
8 changes: 5 additions & 3 deletions src/Compiler/Checking/CheckDeclarations.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2556,8 +2556,9 @@ module EstablishTypeDefinitionCores =
| SynModuleDecl.Types (typeSpecs, _) ->
for SynTypeDefn(typeInfo=SynComponentInfo(typeParams=synTypars; longId=ids); typeRepr=trepr) in typeSpecs do
if TyparsAllHaveMeasureDeclEarlyCheck cenv env synTypars then
match trepr with
| SynTypeDefnRepr.ObjectModel(kind=SynTypeDefnKind.Augmentation _) -> ()
match trepr, ids with
| SynTypeDefnRepr.ObjectModel(kind=SynTypeDefnKind.Augmentation _), _ -> ()
| _, [] -> ()
| _ -> yield (List.last ids).idText
| _ -> () ]
|> set
Expand Down Expand Up @@ -4831,7 +4832,8 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem
let defn = TMDefRec(true, [], [decl], binds |> List.map ModuleOrNamespaceBinding.Binding, m)
return ([defn], [], []), env, env

| SynModuleDecl.Types (typeDefs, m) ->
| SynModuleDecl.Types (typeDefs, m) ->
let typeDefs = typeDefs |> List.filter (function (SynTypeDefn(typeInfo = SynComponentInfo(longId = []))) -> false | _ -> true)
let scopem = unionRanges m scopem
let mutRecDefns = typeDefs |> List.map MutRecShape.Tycon
let mutRecDefnsChecked, envAfter = TcDeclarations.TcMutRecDefinitions cenv env parent typeNames tpenv m scopem None mutRecDefns false
Expand Down
5 changes: 4 additions & 1 deletion src/Compiler/SyntaxTree/LexFilter.fs
Original file line number Diff line number Diff line change
Expand Up @@ -751,6 +751,9 @@ type LexFilterImpl (
| CtxtSeqBlock(FirstInSeqBlock, _, _), (CtxtDo _ as limitCtxt) :: CtxtSeqBlock _ :: (CtxtTypeDefns _ | CtxtModuleBody _) :: _ ->
PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol + 1)

| CtxtSeqBlock(FirstInSeqBlock, _, _), CtxtWithAsAugment _ :: (CtxtTypeDefns _ as limitCtxt) :: _ ->
PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol + 1)

| _, CtxtSeqBlock _ :: rest when not strict -> undentationLimit strict rest
| _, CtxtParen _ :: rest when not strict -> undentationLimit strict rest

Expand Down Expand Up @@ -2308,7 +2311,7 @@ type LexFilterImpl (
if debug then dprintf "WITH\n"
if debug then dprintf "WITH --> NO MATCH, pushing CtxtWithAsAugment (type augmentation), stack = %A" stack
pushCtxt tokenTup (CtxtWithAsAugment tokenStartPos)
pushCtxtSeqBlock tokenTup AddBlockEnd
tryPushCtxtSeqBlock tokenTup AddBlockEnd
returnToken tokenLexbufState token

| FUNCTION, _ ->
Expand Down
7 changes: 7 additions & 0 deletions src/Compiler/SyntaxTree/SyntaxTrivia.fs
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,13 @@ type SynTypeDefnLeadingKeyword =
| StaticType of staticRange: range * typeRange: range
| Synthetic

member this.Range =
match this with
| SynTypeDefnLeadingKeyword.Type range
| SynTypeDefnLeadingKeyword.And range -> range
| SynTypeDefnLeadingKeyword.StaticType (staticRange, typeRange) -> Range.unionRanges staticRange typeRange
| SynTypeDefnLeadingKeyword.Synthetic -> failwith "Getting range from synthetic keyword"

[<NoEquality; NoComparison>]
type SynTypeDefnTrivia =
{
Expand Down
8 changes: 7 additions & 1 deletion src/Compiler/SyntaxTree/SyntaxTrivia.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -219,11 +219,17 @@ type SynPatListConsTrivia =
[<NoEquality; NoComparison; RequireQualifiedAccess>]
type SynTypeDefnLeadingKeyword =
| Type of range

| And of range
// Can happen in SynMemberDefn.NestedType or SynMemberSig.NestedType

/// Can happen in SynMemberDefn.NestedType or SynMemberSig.NestedType
| StaticType of staticRange: range * typeRange: range

/// Produced during type checking, should not be used in actual parsed trees.
| Synthetic

member Range: range

/// Represents additional information for SynTypeDefn
[<NoEquality; NoComparison>]
type SynTypeDefnTrivia =
Expand Down
9 changes: 7 additions & 2 deletions src/Compiler/pars.fsy
Original file line number Diff line number Diff line change
Expand Up @@ -1540,7 +1540,8 @@ typeNameInfo:
| opt_attributes tyconNameAndTyparDecls opt_typeConstraints
{ let typars, lid, fixity, vis = $2
let xmlDoc = grabXmlDoc(parseState, $1, 1)
SynComponentInfo ($1, typars, $3, lid, xmlDoc, fixity, vis, rangeOfLid lid) }
let m = match lid with [] -> rhs parseState 2 | _ -> rangeOfLid lid
SynComponentInfo ($1, typars, $3, lid, xmlDoc, fixity, vis, m) }

/* Part of a set of type definitions */
tyconDefnList:
Expand Down Expand Up @@ -1604,7 +1605,8 @@ tyconDefn:
let mEquals = rhs parseState 7
// Gets the XML doc comments prior to the implicit constructor
let xmlDoc = grabXmlDoc(parseState, $2, 2)
let memberCtorPattern = SynMemberDefn.ImplicitCtor(vis, $2, spats, Option.map snd az, xmlDoc, rangeOfLid lid, { AsKeyword = Option.map fst az })
let m = match lid with [] -> rhs parseState 1 | _ -> rangeOfLid lid
let memberCtorPattern = SynMemberDefn.ImplicitCtor(vis, $2, spats, Option.map snd az, xmlDoc, m, { AsKeyword = Option.map fst az })
let tcDefRepr =
match tcDefRepr with
| SynTypeDefnRepr.ObjectModel (k, cspec, m) -> SynTypeDefnRepr.ObjectModel(k, memberCtorPattern :: cspec, m)
Expand Down Expand Up @@ -2317,6 +2319,9 @@ tyconNameAndTyparDecls:
| opt_access path postfixTyparDecls
{ Some $3, $2.LongIdent, true, $1 }

| opt_access recover
{ None, [], false, $1 }

prefixTyparDecls:
| typar
{ SynTyparDecls.SinglePrefix(SynTyparDecl([], $1), rhs parseState 1) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -202,5 +202,6 @@ Parameter name: codepage")
|> shouldFail
|> withDiagnostics [
(Error 10, Line 7, Col 10, Line 7, Col 11, "Unexpected character '�' in type name")
(Error 10, Line 9, Col 14, Line 9, Col 17, "Unexpected keyword 'end' in implementation file")
(Error 552, Line 7, Col 10, Line 8, Col 33, "Only class types may take value arguments")
(Error 10, Line 9, Col 14, Line 9, Col 17, "Unexpected keyword 'end' in implementation file. Expected incomplete structured construct at or before this point or other token.")
]
Original file line number Diff line number Diff line change
Expand Up @@ -3568,7 +3568,7 @@ and ^a
> () =
member inline __.X = ()
with
static member inline Y = ()
static member inline Y = ()

type TypeWithALongName< ^a
when ^a:(static member(+):'a * 'a -> 'a )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9814,6 +9814,8 @@ FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTr
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+StaticType
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+Tags
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+Type
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.Text.Range Range
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.Text.Range get_Range()
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: Int32 Tag
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: Int32 get_Tag()
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: System.String ToString()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9814,6 +9814,8 @@ FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTr
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+StaticType
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+Tags
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+Type
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.Text.Range Range
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.Text.Range get_Range()
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: Int32 Tag
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: Int32 get_Tag()
FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: System.String ToString()
Expand Down
4 changes: 2 additions & 2 deletions tests/fsharp/Compiler/Language/OpenTypeDeclarationTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -978,7 +978,7 @@ module Test =
| UCase1
| UCase2 with

static member M() = ()
static member M() = ()

open type Test.TestUnion

Expand All @@ -1004,7 +1004,7 @@ module Test =
| UCase1 of 'T
| UCase2 with

static member M() = ()
static member M() = ()

open type Test.TestUnion<int>

Expand Down
4 changes: 4 additions & 0 deletions tests/fsharp/typecheck/sigs/neg29.bsl
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,7 @@
neg29.fs(5,19,6,16): parse error FS0010: Incomplete structured construct at or before this point in type name. Expected '>' or other token.

neg29.fs(9,1,9,1): parse error FS0010: Incomplete structured construct at or before this point in implementation file

neg29.fs(6,19,6,20): parse error FS0010: Unexpected symbol '(' in expression

neg29.fs(6,18,6,19): parse error FS3156: Unexpected token '>' or incomplete expression
6 changes: 6 additions & 0 deletions tests/service/data/SyntaxTree/Member/Interface 06.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module Module

type T =
interface I with

let _ = ()
39 changes: 39 additions & 0 deletions tests/service/data/SyntaxTree/Member/Interface 06.fs.bsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
ImplFile
(ParsedImplFileInput
("/root/Member/Interface 06.fs", false, QualifiedNameOfFile Module, [], [],
[SynModuleOrNamespace
([Module], false, NamedModule,
[Types
([SynTypeDefn
(SynComponentInfo
([], None, [], [T],
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
false, None, (3,5--3,6)),
ObjectModel
(Unspecified,
[Interface
(LongIdent (SynLongIdent ([I], [], [None])),
Some (4,16--4,20), Some [], (4,4--4,20));
LetBindings
([SynBinding
(None, Normal, false, false, [],
PreXmlDoc ((6,4), FSharp.Compiler.Xml.XmlDocCollector),
SynValData
(None,
SynValInfo ([], SynArgInfo ([], false, None)),
None), Wild (6,8--6,9), None,
Const (Unit, (6,12--6,14)), (6,8--6,9),
Yes (6,4--6,14),
{ LeadingKeyword = Let (6,4--6,7)
InlineKeyword = None
EqualsRange = Some (6,10--6,11) })], false, false,
(6,4--6,14))], (4,4--6,14)), [], None, (3,5--6,14),
{ LeadingKeyword = Type (3,0--3,4)
EqualsRange = Some (3,7--3,8)
WithKeyword = None })], (3,0--6,14))],
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
(1,0--6,14), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
{ ConditionalDirectives = []
CodeComments = [] }, set []))

(6,4)-(6,14) parse error Possible incorrect indentation: this token is offside of context started at position (4:5). Try indenting this token further or using standard formatting conventions.
6 changes: 6 additions & 0 deletions tests/service/data/SyntaxTree/Member/Interface 07.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module Module

type T =
interface I

member this.P = 1
47 changes: 47 additions & 0 deletions tests/service/data/SyntaxTree/Member/Interface 07.fs.bsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
ImplFile
(ParsedImplFileInput
("/root/Member/Interface 07.fs", false, QualifiedNameOfFile Module, [], [],
[SynModuleOrNamespace
([Module], false, NamedModule,
[Types
([SynTypeDefn
(SynComponentInfo
([], None, [], [T],
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
false, None, (3,5--3,6)),
ObjectModel
(Unspecified,
[Interface
(LongIdent (SynLongIdent ([I], [], [None])), None, None,
(4,4--4,15));
Member
(SynBinding
(None, Normal, false, false, [],
PreXmlDoc ((6,4), FSharp.Compiler.Xml.XmlDocCollector),
SynValData
(Some { IsInstance = true
IsDispatchSlot = false
IsOverrideOrExplicitImpl = false
IsFinal = false
GetterOrSetterIsCompilerGenerated = false
MemberKind = Member },
SynValInfo
([[SynArgInfo ([], false, None)]; []],
SynArgInfo ([], false, None)), None),
LongIdent
(SynLongIdent
([this; P], [(6,15--6,16)], [None; None]), None,
None, Pats [], None, (6,11--6,17)), None,
Const (Int32 1, (6,20--6,21)), (6,11--6,17),
NoneAtInvisible,
{ LeadingKeyword = Member (6,4--6,10)
InlineKeyword = None
EqualsRange = Some (6,18--6,19) }), (6,4--6,21))],
(4,4--6,21)), [], None, (3,5--6,21),
{ LeadingKeyword = Type (3,0--3,4)
EqualsRange = Some (3,7--3,8)
WithKeyword = None })], (3,0--6,21))],
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
(1,0--6,21), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
{ ConditionalDirectives = []
CodeComments = [] }, set []))

This file was deleted.

4 changes: 4 additions & 0 deletions tests/service/data/SyntaxTree/SignatureType/With 01.fsi
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
namespace X

type Foo with
member Meh: unit -> unit
Original file line number Diff line number Diff line change
@@ -1,30 +1,28 @@
SigFile
(ParsedSigFileInput
("/root/SignatureType/SynTypeDefnSigShouldContainsTheRangeOfTheWithKeyword.fsi",
QualifiedNameOfFile SynTypeDefnSigShouldContainsTheRangeOfTheWithKeyword,
[], [],
("/root/SignatureType/With 01.fsi", QualifiedNameOfFile With 01, [], [],
[SynModuleOrNamespaceSig
([X], false, DeclaredNamespace,
[Types
([SynTypeDefnSig
(SynComponentInfo
([], None, [], [Foo],
PreXmlDoc ((4,0), FSharp.Compiler.Xml.XmlDocCollector),
false, None, (4,5--4,8)),
Simple (None (4,5--5,25), (4,5--5,25)),
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
false, None, (3,5--3,8)),
Simple (None (3,5--4,28), (3,5--4,28)),
[Member
(SynValSig
([], SynIdent (Meh, None), SynValTyparDecls (None, true),
Fun
(LongIdent (SynLongIdent ([unit], [], [None])),
LongIdent (SynLongIdent ([unit], [], [None])),
(5,13--5,25), { ArrowRange = (5,18--5,20) }),
(4,16--4,28), { ArrowRange = (4,21--4,23) }),
SynValInfo
([[SynArgInfo ([], false, None)]],
SynArgInfo ([], false, None)), false, false,
PreXmlDoc ((5,0), FSharp.Compiler.Xml.XmlDocCollector),
None, None, (5,0--5,25),
{ LeadingKeyword = Member (5,0--5,6)
PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector),
None, None, (4,4--4,28),
{ LeadingKeyword = Member (4,4--4,10)
InlineKeyword = None
WithKeyword = None
EqualsRange = None }),
Expand All @@ -33,12 +31,12 @@ SigFile
IsOverrideOrExplicitImpl = false
IsFinal = false
GetterOrSetterIsCompilerGenerated = false
MemberKind = Member }, (5,0--5,25),
{ GetSetKeywords = None })], (4,5--5,25),
{ LeadingKeyword = Type (4,0--4,4)
MemberKind = Member }, (4,4--4,28),
{ GetSetKeywords = None })], (3,5--4,28),
{ LeadingKeyword = Type (3,0--3,4)
EqualsRange = None
WithKeyword = Some (4,9--4,13) })], (4,0--5,25))],
PreXmlDocEmpty, [], None, (2,0--5,25),
{ LeadingKeyword = Namespace (2,0--2,9) })],
WithKeyword = Some (3,9--3,13) })], (3,0--4,28))],
PreXmlDocEmpty, [], None, (1,0--4,28),
{ LeadingKeyword = Namespace (1,0--1,9) })],
{ ConditionalDirectives = []
CodeComments = [] }, set []))
7 changes: 7 additions & 0 deletions tests/service/data/SyntaxTree/Type/And 01.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module Module

type A = int

and

and C = int
45 changes: 45 additions & 0 deletions tests/service/data/SyntaxTree/Type/And 01.fs.bsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
ImplFile
(ParsedImplFileInput
("/root/Type/And 01.fs", false, QualifiedNameOfFile Module, [], [],
[SynModuleOrNamespace
([Module], false, NamedModule,
[Types
([SynTypeDefn
(SynComponentInfo
([], None, [], [A],
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
false, None, (3,5--3,6)),
Simple
(TypeAbbrev
(Ok, LongIdent (SynLongIdent ([int], [], [None])),
(3,9--3,12)), (3,9--3,12)), [], None, (3,5--3,12),
{ LeadingKeyword = Type (3,0--3,4)
EqualsRange = Some (3,7--3,8)
WithKeyword = None });
SynTypeDefn
(SynComponentInfo
([], None, [], [],
PreXmlDoc ((7,0), FSharp.Compiler.Xml.XmlDocCollector),
false, None, (7,0--7,3)),
Simple (None (7,0--7,3), (7,0--7,3)), [], None, (7,0--7,3),
{ LeadingKeyword = And (5,0--5,3)
EqualsRange = None
WithKeyword = None });
SynTypeDefn
(SynComponentInfo
([], None, [], [C],
PreXmlDoc ((7,4), FSharp.Compiler.Xml.XmlDocCollector),
false, None, (7,4--7,5)),
Simple
(TypeAbbrev
(Ok, LongIdent (SynLongIdent ([int], [], [None])),
(7,8--7,11)), (7,8--7,11)), [], None, (7,4--7,11),
{ LeadingKeyword = And (7,0--7,3)
EqualsRange = Some (7,6--7,7)
WithKeyword = None })], (3,0--7,11))],
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
(1,0--7,11), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
{ ConditionalDirectives = []
CodeComments = [] }, set []))

(7,0)-(7,3) parse error Unexpected keyword 'and' in type name
7 changes: 7 additions & 0 deletions tests/service/data/SyntaxTree/Type/And 02.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module Module

type A = int

and B

and C = int
Loading