diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 104e89ee693..cdd535ce565 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -167,6 +167,7 @@ let parse_error_rich = Some(fun (ctxt: ParseErrorContext<_>) -> %type argExpr %type declExprBlock %type headBindingPattern +%type atomTypeNonAtomicDeprecated %type atomicExprAfterType %type typedSequentialExprBlock %type atomicExpr @@ -973,8 +974,14 @@ classMemberSpfn: SynMemberSig.Interface($4, unionRanges (rhs parseState 3) ($4).Range) } | opt_attributes opt_access INHERIT appType - { if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) - SynMemberSig.Inherit($4, unionRanges (rhs parseState 3) ($4).Range) } + { if Option.isSome $2 then errorR (Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier (), rhs parseState 2)) + SynMemberSig.Inherit($4, unionRanges (rhs parseState 1) $4.Range) } + + | opt_attributes opt_access INHERIT recover + { if Option.isSome $2 then errorR (Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier (), rhs parseState 2)) + let mInherit = rhs parseState 3 + let ty = SynType.FromParseError(mInherit.EndRange) + SynMemberSig.Inherit(ty, unionRanges (rhs parseState 1) mInherit) } | opt_attributes opt_access VAL fieldDecl { let mWhole = rhs2 parseState 1 4 @@ -2133,7 +2140,7 @@ opt_classDefn: /* An 'inherits' definition in an object type definition */ inheritsDefn: | INHERIT atomTypeNonAtomicDeprecated optBaseSpec - { let mDecl = unionRanges (rhs parseState 1) (($2): SynType).Range + { let mDecl = unionRanges (rhs parseState 1) $2.Range SynMemberDefn.Inherit($2, $3, mDecl) } | INHERIT atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType optBaseSpec @@ -2142,7 +2149,7 @@ inheritsDefn: | INHERIT ends_coming_soon_or_recover { let mDecl = (rhs parseState 1) - if not $2 then errorR(Error(FSComp.SR.parsTypeNameCannotBeEmpty(), mDecl)) + if not $2 then errorR (Error(FSComp.SR.parsTypeNameCannotBeEmpty (), mDecl)) SynMemberDefn.Inherit(SynType.LongIdent(SynLongIdent([], [], [])), None, mDecl) } optAsSpec: diff --git a/tests/service/data/SyntaxTree/Member/Inherit 01.fs b/tests/service/data/SyntaxTree/Member/Inherit 01.fs new file mode 100644 index 00000000000..141827325f3 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 01.fs @@ -0,0 +1,4 @@ +module Module + +type T = + inherit I diff --git a/tests/service/data/SyntaxTree/Member/Inherit 01.fs.bsl b/tests/service/data/SyntaxTree/Member/Inherit 01.fs.bsl new file mode 100644 index 00000000000..e138535c113 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 01.fs.bsl @@ -0,0 +1,23 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Inherit 01.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, + [Inherit + (LongIdent (SynLongIdent ([I], [], [None])), None, + (4,4--4,13))], (4,4--4,13)), [], None, (3,5--4,13), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--4,13))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--4,13), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Member/Inherit 02.fs b/tests/service/data/SyntaxTree/Member/Inherit 02.fs new file mode 100644 index 00000000000..04196015cda --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 02.fs @@ -0,0 +1,4 @@ +module Module + +type T1 = + inherit T2() diff --git a/tests/service/data/SyntaxTree/Member/Inherit 02.fs.bsl b/tests/service/data/SyntaxTree/Member/Inherit 02.fs.bsl new file mode 100644 index 00000000000..51185750c32 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 02.fs.bsl @@ -0,0 +1,24 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Inherit 02.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [T1], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,7)), + ObjectModel + (Unspecified, + [ImplicitInherit + (LongIdent (SynLongIdent ([T2], [], [None])), + Const (Unit, (4,14--4,16)), None, (4,4--4,16))], + (4,4--4,16)), [], None, (3,5--4,16), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,8--3,9) + WithKeyword = None })], (3,0--4,16))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--4,16), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Member/Inherit 03.fs b/tests/service/data/SyntaxTree/Member/Inherit 03.fs new file mode 100644 index 00000000000..52e99a8e597 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 03.fs @@ -0,0 +1,4 @@ +module Module + +type T = + inherit diff --git a/tests/service/data/SyntaxTree/Member/Inherit 03.fs.bsl b/tests/service/data/SyntaxTree/Member/Inherit 03.fs.bsl new file mode 100644 index 00000000000..eeab1704856 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 03.fs.bsl @@ -0,0 +1,25 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Inherit 03.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, + [Inherit + (LongIdent (SynLongIdent ([], [], [])), None, + (4,4--4,11))], (4,4--4,11)), [], None, (3,5--4,11), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--4,11))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--4,11), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(4,4)-(4,11) parse error Type name cannot be empty. diff --git a/tests/service/data/SyntaxTree/Member/Inherit 04.fs b/tests/service/data/SyntaxTree/Member/Inherit 04.fs new file mode 100644 index 00000000000..f018e33c96d --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 04.fs @@ -0,0 +1,6 @@ +module Module + +type T = + inherit + +I diff --git a/tests/service/data/SyntaxTree/Member/Inherit 04.fs.bsl b/tests/service/data/SyntaxTree/Member/Inherit 04.fs.bsl new file mode 100644 index 00000000000..9c03baf2b56 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 04.fs.bsl @@ -0,0 +1,26 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Inherit 04.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, + [Inherit + (LongIdent (SynLongIdent ([], [], [])), None, + (4,4--4,11))], (4,4--4,11)), [], None, (3,5--4,11), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--4,11)); + Expr (Ident I, (6,0--6,1))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,1), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(4,4)-(4,11) parse error Type name cannot be empty. diff --git a/tests/service/data/SyntaxTree/Member/Inherit 05.fs b/tests/service/data/SyntaxTree/Member/Inherit 05.fs new file mode 100644 index 00000000000..37226f9a158 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 05.fs @@ -0,0 +1,6 @@ +module Module + +type T = + inherit + + member this.P = 1 diff --git a/tests/service/data/SyntaxTree/Member/Inherit 05.fs.bsl b/tests/service/data/SyntaxTree/Member/Inherit 05.fs.bsl new file mode 100644 index 00000000000..ddb47eb7ecc --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 05.fs.bsl @@ -0,0 +1,49 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Inherit 05.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, + [Inherit + (LongIdent (SynLongIdent ([], [], [])), None, + (4,4--4,11)); + 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 [])) + +(4,12)-(6,4) parse error Incomplete structured construct at or before this point in type definition diff --git a/tests/service/data/SyntaxTree/Member/Inherit 06.fsi b/tests/service/data/SyntaxTree/Member/Inherit 06.fsi new file mode 100644 index 00000000000..52e99a8e597 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 06.fsi @@ -0,0 +1,4 @@ +module Module + +type T = + inherit diff --git a/tests/service/data/SyntaxTree/Member/Inherit 06.fsi.bsl b/tests/service/data/SyntaxTree/Member/Inherit 06.fsi.bsl new file mode 100644 index 00000000000..3ac7c9adc29 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 06.fsi.bsl @@ -0,0 +1,24 @@ +SigFile + (ParsedSigFileInput + ("/root/Member/Inherit 06.fsi", QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespaceSig + ([Module], false, NamedModule, + [Types + ([SynTypeDefnSig + (SynComponentInfo + ([], None, [], [T], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + ObjectModel + (Unspecified, + [Inherit (FromParseError (4,11--4,11), (4,4--4,11))], + (4,4--4,11)), [], (3,5--4,11), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--4,11))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--4,11), { LeadingKeyword = Module (1,0--1,6) })], + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(5,0)-(5,0) parse error Incomplete structured construct at or before this point in member signature diff --git a/tests/service/data/SyntaxTree/Member/Inherit 07.fsi b/tests/service/data/SyntaxTree/Member/Inherit 07.fsi new file mode 100644 index 00000000000..84ffafda964 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 07.fsi @@ -0,0 +1,6 @@ +module Module + +type T = + inherit + + member P: int diff --git a/tests/service/data/SyntaxTree/Member/Inherit 07.fsi.bsl b/tests/service/data/SyntaxTree/Member/Inherit 07.fsi.bsl new file mode 100644 index 00000000000..434435dd0b8 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Inherit 07.fsi.bsl @@ -0,0 +1,43 @@ +SigFile + (ParsedSigFileInput + ("/root/Member/Inherit 07.fsi", QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespaceSig + ([Module], false, NamedModule, + [Types + ([SynTypeDefnSig + (SynComponentInfo + ([], None, [], [T], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + ObjectModel + (Unspecified, + [Inherit (FromParseError (4,11--4,11), (4,4--4,11)); + Member + (SynValSig + ([], SynIdent (P, None), + SynValTyparDecls (None, true), + LongIdent (SynLongIdent ([int], [], [None])), + SynValInfo ([], SynArgInfo ([], false, None)), false, + false, + PreXmlDoc ((6,4), FSharp.Compiler.Xml.XmlDocCollector), + None, None, (6,4--6,17), + { LeadingKeyword = Member (6,4--6,10) + InlineKeyword = None + WithKeyword = None + EqualsRange = None }), + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertyGet }, (6,4--6,17), + { GetSetKeywords = None })], (4,4--6,17)), [], + (3,5--6,17), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--6,17))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,17), { LeadingKeyword = Module (1,0--1,6) })], + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(4,12)-(6,4) parse error Incomplete structured construct at or before this point in member signature