From 7c919d4d872ab0aa0b8af20416cbc7b29511515a Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Tue, 11 Jul 2023 22:28:13 +0200 Subject: [PATCH 1/5] Parser: rework missing type body recovery --- src/Compiler/pars.fsy | 38 +++++++-------- .../data/SyntaxTree/Type/Abbreviation 01.fs | 3 ++ .../SyntaxTree/Type/Abbreviation 01.fs.bsl | 22 +++++++++ .../data/SyntaxTree/Type/Abbreviation 02.fs | 3 ++ .../SyntaxTree/Type/Abbreviation 02.fs.bsl | 26 +++++++++++ .../data/SyntaxTree/Type/Abbreviation 03.fs | 3 ++ .../SyntaxTree/Type/Abbreviation 03.fs.bsl | 28 +++++++++++ .../data/SyntaxTree/Type/Abbreviation 04.fs | 3 ++ .../SyntaxTree/Type/Abbreviation 04.fs.bsl | 27 +++++++++++ .../data/SyntaxTree/Type/And 03.fs.bsl | 8 ++-- .../data/SyntaxTree/Type/And 06.fs.bsl | 8 ++-- .../service/data/SyntaxTree/Type/Class 01.fs | 5 ++ .../data/SyntaxTree/Type/Class 01.fs.bsl | 20 ++++++++ .../service/data/SyntaxTree/Type/Class 02.fs | 8 ++++ .../data/SyntaxTree/Type/Class 02.fs.bsl | 45 ++++++++++++++++++ .../service/data/SyntaxTree/Type/Class 03.fs | 7 +++ .../data/SyntaxTree/Type/Class 03.fs.bsl | 30 ++++++++++++ .../service/data/SyntaxTree/Type/Class 04.fs | 7 +++ .../data/SyntaxTree/Type/Class 04.fs.bsl | 32 +++++++++++++ .../service/data/SyntaxTree/Type/Class 05.fs | 7 +++ .../data/SyntaxTree/Type/Class 05.fs.bsl | 46 +++++++++++++++++++ .../SyntaxTree/Type/Primary ctor 02.fs.bsl | 6 +-- .../SyntaxTree/Type/Primary ctor 04.fs.bsl | 8 ++-- .../service/data/SyntaxTree/Type/Struct 01.fs | 3 ++ .../data/SyntaxTree/Type/Struct 01.fs.bsl | 19 ++++++++ .../service/data/SyntaxTree/Type/Struct 02.fs | 6 +++ .../data/SyntaxTree/Type/Struct 02.fs.bsl | 28 +++++++++++ ...delClassContainsTheRangeOfTheEqualsSign.fs | 4 -- ...lassContainsTheRangeOfTheEqualsSign.fs.bsl | 32 ------------- .../data/SyntaxTree/Type/Type 03.fs.bsl | 8 ++-- .../data/SyntaxTree/Type/Type 04.fs.bsl | 8 ++-- .../data/SyntaxTree/Type/Type 05.fs.bsl | 8 ++-- .../data/SyntaxTree/Type/Type 06.fs.bsl | 8 ++-- tests/service/data/SyntaxTree/Type/Type 11.fs | 5 ++ .../data/SyntaxTree/Type/Type 11.fs.bsl | 32 +++++++++++++ tests/service/data/SyntaxTree/Type/Type 12.fs | 5 ++ .../data/SyntaxTree/Type/Type 12.fs.bsl | 21 +++++++++ 37 files changed, 489 insertions(+), 88 deletions(-) create mode 100644 tests/service/data/SyntaxTree/Type/Abbreviation 01.fs create mode 100644 tests/service/data/SyntaxTree/Type/Abbreviation 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Abbreviation 02.fs create mode 100644 tests/service/data/SyntaxTree/Type/Abbreviation 02.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Abbreviation 03.fs create mode 100644 tests/service/data/SyntaxTree/Type/Abbreviation 03.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Abbreviation 04.fs create mode 100644 tests/service/data/SyntaxTree/Type/Abbreviation 04.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Class 01.fs create mode 100644 tests/service/data/SyntaxTree/Type/Class 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Class 02.fs create mode 100644 tests/service/data/SyntaxTree/Type/Class 02.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Class 03.fs create mode 100644 tests/service/data/SyntaxTree/Type/Class 03.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Class 04.fs create mode 100644 tests/service/data/SyntaxTree/Type/Class 04.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Class 05.fs create mode 100644 tests/service/data/SyntaxTree/Type/Class 05.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Struct 01.fs create mode 100644 tests/service/data/SyntaxTree/Type/Struct 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Struct 02.fs create mode 100644 tests/service/data/SyntaxTree/Type/Struct 02.fs.bsl delete mode 100644 tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs delete mode 100644 tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Type 11.fs create mode 100644 tests/service/data/SyntaxTree/Type/Type 11.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Type 12.fs create mode 100644 tests/service/data/SyntaxTree/Type/Type 12.fs.bsl diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 26414673888..f32554957eb 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -1588,24 +1588,6 @@ tyconDefn: let trivia: SynTypeDefnTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = None; WithKeyword = None } SynTypeDefn($1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None($1.Range), $1.Range), [], None, $1.Range, trivia) } - | typeNameInfo opt_equals tyconDefnRhsBlock - { match $2 with - | Some _ -> () - | None -> - let (SynComponentInfo(_, _, _, lid, _, _, _, _)) = $1 - // While the spec doesn't allow long idents here, the parser doesn't enforce this, so take one ident - let typeNameId = List.last lid - raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsEqualsMissingInTypeDefinition(typeNameId.ToString())) - - let nameRange = rhs parseState 1 - let (tcDefRepr: SynTypeDefnRepr), mWith, members = $3 nameRange - let declRange = unionRanges (rhs parseState 1) tcDefRepr.Range - let mWhole = (declRange, members) ||> unionRangeWithListBy (fun (mem: SynMemberDefn) -> mem.Range) - - fun leadingKeyword -> - let trivia: SynTypeDefnTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = $2; WithKeyword = mWith } - SynTypeDefn($1, tcDefRepr, members, None, mWhole, trivia) } - | typeNameInfo tyconDefnAugmentation { let mWithKwd, classDefns = $2 let m = (rhs parseState 1, classDefns) ||> unionRangeWithListBy (fun mem -> mem.Range) @@ -1632,11 +1614,21 @@ tyconDefn: let tcDefRepr = match tcDefRepr, memberCtorPattern with + | SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None _, m), Some ctor -> + reportParseErrorAt m (FSComp.SR.parsEmptyTypeDefinition()) + SynTypeDefnRepr.ObjectModel(SynTypeDefnKind.Unspecified, [ctor], unionRanges m mEquals) + + | SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None mName, m), _ -> + reportParseErrorAt m (FSComp.SR.parsEmptyTypeDefinition()) + tcDefRepr + | SynTypeDefnRepr.ObjectModel(k, cspec, m), Some ctor -> SynTypeDefnRepr.ObjectModel(k, ctor :: cspec, m) + | _, Some ctor -> reportParseErrorAt (rhs2 parseState 1 5) (FSComp.SR.parsOnlyClassCanTakeValueArguments ()) tcDefRepr + | _ -> match az with | Some(_, Some id) -> @@ -1685,7 +1677,7 @@ tyconDefn: fun leadingKeyword -> let trivia = { SynTypeDefnTrivia.Zero with LeadingKeyword = leadingKeyword } - SynTypeDefn($1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None(mName), mName), members, None, mName, trivia) } + SynTypeDefn($1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None(mName), mName), members, None, mWhole, trivia) } /* The right-hand-side of a type definition */ @@ -1715,6 +1707,10 @@ tyconDefnRhsBlock: let tcDefRepr, members = $2 nameRange (checkForMultipleAugmentations m ($4 @ optClassDefn) []) tcDefRepr, mWith, members) } + | OBLOCKBEGIN oblockend + { fun mName -> + SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None mName, mName), None, [] } + | tyconDefnRhs opt_classDefn { let m = rhs parseState 1 let mWith, optClassDefn = $2 @@ -1775,7 +1771,7 @@ tyconClassDefn: /* The right-hand-side of a object type definition where the class/interface/struct kind has not been specified */ classDefnBlockKindUnspecified: - | OBLOCKBEGIN classDefnMembers recover + | OBLOCKBEGIN classDefnMembersAtLeastOne recover { if not $3 then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedEndOfFileTypeDefinition()) let mopt = match $2 with @@ -1783,7 +1779,7 @@ classDefnBlockKindUnspecified: | _ -> None false, $2, mopt } - | OBLOCKBEGIN classDefnMembers oblockend + | OBLOCKBEGIN classDefnMembersAtLeastOne oblockend { let mopt = match $2 with | _ :: _ -> Some((rhs parseState 1, $2) ||> unionRangeWithListBy (fun (d: SynMemberDefn) -> d.Range)) diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 01.fs b/tests/service/data/SyntaxTree/Type/Abbreviation 01.fs new file mode 100644 index 00000000000..53e093c9838 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Abbreviation 01.fs @@ -0,0 +1,3 @@ +module Module + +type T = int diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 01.fs.bsl b/tests/service/data/SyntaxTree/Type/Abbreviation 01.fs.bsl new file mode 100644 index 00000000000..f5ca6da29e6 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Abbreviation 01.fs.bsl @@ -0,0 +1,22 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Abbreviation 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)), + 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 })], (3,0--3,12))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,12), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 02.fs b/tests/service/data/SyntaxTree/Type/Abbreviation 02.fs new file mode 100644 index 00000000000..6275a33b1b5 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Abbreviation 02.fs @@ -0,0 +1,3 @@ +module Module + +type T = global.Int diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 02.fs.bsl b/tests/service/data/SyntaxTree/Type/Abbreviation 02.fs.bsl new file mode 100644 index 00000000000..6d0a7728993 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Abbreviation 02.fs.bsl @@ -0,0 +1,26 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Abbreviation 02.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)), + Simple + (TypeAbbrev + (Ok, + LongIdent + (SynLongIdent + ([`global`; Int], [(3,15--3,16)], + [Some (OriginalNotation "global"); None])), + (3,9--3,19)), (3,9--3,19)), [], None, (3,5--3,19), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--3,19))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,19), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 03.fs b/tests/service/data/SyntaxTree/Type/Abbreviation 03.fs new file mode 100644 index 00000000000..3218b348a54 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Abbreviation 03.fs @@ -0,0 +1,3 @@ +module Module + +type T = a diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 03.fs.bsl b/tests/service/data/SyntaxTree/Type/Abbreviation 03.fs.bsl new file mode 100644 index 00000000000..d2fb3a0cb2b --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Abbreviation 03.fs.bsl @@ -0,0 +1,28 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Abbreviation 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)), + Simple + (TypeAbbrev + (Ok, + App + (LongIdent (SynLongIdent ([a], [], [None])), + Some (3,10--3,11), + [LongIdent (SynLongIdent ([b], [], [None])); + LongIdent (SynLongIdent ([c], [], [None]))], + [(3,12--3,13)], Some (3,15--3,16), false, (3,9--3,16)), + (3,9--3,16)), (3,9--3,16)), [], None, (3,5--3,16), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--3,16))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,16), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 04.fs b/tests/service/data/SyntaxTree/Type/Abbreviation 04.fs new file mode 100644 index 00000000000..83595ed5e8b --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Abbreviation 04.fs @@ -0,0 +1,3 @@ +module Module + +type T = (a -> b) diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 04.fs.bsl b/tests/service/data/SyntaxTree/Type/Abbreviation 04.fs.bsl new file mode 100644 index 00000000000..53dd6bbce50 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Abbreviation 04.fs.bsl @@ -0,0 +1,27 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Abbreviation 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)), + Simple + (TypeAbbrev + (Ok, + Paren + (Fun + (LongIdent (SynLongIdent ([a], [], [None])), + LongIdent (SynLongIdent ([b], [], [None])), + (3,10--3,16), { ArrowRange = (3,12--3,14) }), + (3,9--3,17)), (3,9--3,17)), (3,9--3,17)), [], None, + (3,5--3,17), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--3,17))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,17), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/And 03.fs.bsl b/tests/service/data/SyntaxTree/Type/And 03.fs.bsl index bf2b92aa99d..0334d8da564 100644 --- a/tests/service/data/SyntaxTree/Type/And 03.fs.bsl +++ b/tests/service/data/SyntaxTree/Type/And 03.fs.bsl @@ -21,10 +21,10 @@ ImplFile ([], None, [], [B], PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), false, None, (5,4--5,5)), - ObjectModel (Unspecified, [], (7,0--7,0)), [], None, - (5,4--7,0), { LeadingKeyword = And (5,0--5,3) - EqualsRange = Some (5,6--5,7) - WithKeyword = None }); + Simple (None (5,4--5,7), (5,4--5,7)), [], None, (5,4--5,7), + { LeadingKeyword = And (5,0--5,3) + EqualsRange = Some (5,6--5,7) + WithKeyword = None }); SynTypeDefn (SynComponentInfo ([], None, [], [C], diff --git a/tests/service/data/SyntaxTree/Type/And 06.fs.bsl b/tests/service/data/SyntaxTree/Type/And 06.fs.bsl index 6e0ad8564e5..45c17c9c934 100644 --- a/tests/service/data/SyntaxTree/Type/And 06.fs.bsl +++ b/tests/service/data/SyntaxTree/Type/And 06.fs.bsl @@ -21,10 +21,10 @@ ImplFile ([], None, [], [B], PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), false, None, (5,4--5,5)), - ObjectModel (Unspecified, [], (5,6--5,6)), [], None, - (5,4--5,7), { LeadingKeyword = And (5,0--5,3) - EqualsRange = Some (5,6--5,7) - WithKeyword = None })], (3,0--5,7))], + Simple (None (5,4--5,7), (5,4--5,7)), [], None, (5,4--5,7), + { LeadingKeyword = And (5,0--5,3) + EqualsRange = Some (5,6--5,7) + WithKeyword = None })], (3,0--5,7))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--5,7), { LeadingKeyword = Module (1,0--1,6) })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/Type/Class 01.fs b/tests/service/data/SyntaxTree/Type/Class 01.fs new file mode 100644 index 00000000000..c11c325c8dc --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Class 01.fs @@ -0,0 +1,5 @@ +module Module + +type T = class end + +() diff --git a/tests/service/data/SyntaxTree/Type/Class 01.fs.bsl b/tests/service/data/SyntaxTree/Type/Class 01.fs.bsl new file mode 100644 index 00000000000..fe8be852708 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Class 01.fs.bsl @@ -0,0 +1,20 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Class 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 (Class, [], (3,9--3,18)), [], None, (3,5--3,18), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--3,18)); + Expr (Const (Unit, (5,0--5,2)), (5,0--5,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--5,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/Class 02.fs b/tests/service/data/SyntaxTree/Type/Class 02.fs new file mode 100644 index 00000000000..9dbd59732d7 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Class 02.fs @@ -0,0 +1,8 @@ +module Module + +type T = + class + member this.P = 1 + end + +() diff --git a/tests/service/data/SyntaxTree/Type/Class 02.fs.bsl b/tests/service/data/SyntaxTree/Type/Class 02.fs.bsl new file mode 100644 index 00000000000..f7e959d10a0 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Class 02.fs.bsl @@ -0,0 +1,45 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Class 02.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 + (Class, + [Member + (SynBinding + (None, Normal, false, false, [], + PreXmlDoc ((5,8), 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], [(5,19--5,20)], [None; None]), None, + None, Pats [], None, (5,15--5,21)), None, + Const (Int32 1, (5,24--5,25)), (5,15--5,21), + NoneAtInvisible, + { LeadingKeyword = Member (5,8--5,14) + InlineKeyword = None + EqualsRange = Some (5,22--5,23) }), (5,8--5,25))], + (4,4--6,7)), [], None, (3,5--6,7), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--6,7)); + Expr (Const (Unit, (8,0--8,2)), (8,0--8,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--8,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/Class 03.fs b/tests/service/data/SyntaxTree/Type/Class 03.fs new file mode 100644 index 00000000000..111887432d7 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Class 03.fs @@ -0,0 +1,7 @@ +module Module + +type T () = + class + end + +() diff --git a/tests/service/data/SyntaxTree/Type/Class 03.fs.bsl b/tests/service/data/SyntaxTree/Type/Class 03.fs.bsl new file mode 100644 index 00000000000..e3e58a8b719 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Class 03.fs.bsl @@ -0,0 +1,30 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Class 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 + (Class, + [ImplicitCtor + (None, [], SimplePats ([], [], (3,7--3,9)), None, + PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = None })], (4,4--5,7)), [], + Some + (ImplicitCtor + (None, [], SimplePats ([], [], (3,7--3,9)), None, + PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = None })), (3,5--5,7), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,10--3,11) + WithKeyword = None })], (3,0--5,7)); + Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--7,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/Class 04.fs b/tests/service/data/SyntaxTree/Type/Class 04.fs new file mode 100644 index 00000000000..d6b429efa74 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Class 04.fs @@ -0,0 +1,7 @@ +module Module + +type T private () = + class + end + +() diff --git a/tests/service/data/SyntaxTree/Type/Class 04.fs.bsl b/tests/service/data/SyntaxTree/Type/Class 04.fs.bsl new file mode 100644 index 00000000000..e137aa4ebfc --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Class 04.fs.bsl @@ -0,0 +1,32 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Class 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 + (Class, + [ImplicitCtor + (Some (Private (3,7--3,14)), [], + SimplePats ([], [], (3,15--3,17)), None, + PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = None })], (4,4--5,7)), [], + Some + (ImplicitCtor + (Some (Private (3,7--3,14)), [], + SimplePats ([], [], (3,15--3,17)), None, + PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = None })), (3,5--5,7), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,18--3,19) + WithKeyword = None })], (3,0--5,7)); + Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--7,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/Class 05.fs b/tests/service/data/SyntaxTree/Type/Class 05.fs new file mode 100644 index 00000000000..0e0da369fe3 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Class 05.fs @@ -0,0 +1,7 @@ +module Module + +type T [] () = + class + end + +() diff --git a/tests/service/data/SyntaxTree/Type/Class 05.fs.bsl b/tests/service/data/SyntaxTree/Type/Class 05.fs.bsl new file mode 100644 index 00000000000..903fa37b286 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Class 05.fs.bsl @@ -0,0 +1,46 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Class 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 + (Class, + [ImplicitCtor + (None, + [{ Attributes = + [{ TypeName = SynLongIdent ([A], [], [None]) + ArgExpr = Const (Unit, (3,9--3,10)) + Target = None + AppliesToGetterAndSetter = false + Range = (3,9--3,10) }] + Range = (3,7--3,12) }], + SimplePats ([], [], (3,13--3,15)), None, + PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = None })], (4,4--5,7)), [], + Some + (ImplicitCtor + (None, + [{ Attributes = + [{ TypeName = SynLongIdent ([A], [], [None]) + ArgExpr = Const (Unit, (3,9--3,10)) + Target = None + AppliesToGetterAndSetter = false + Range = (3,9--3,10) }] + Range = (3,7--3,12) }], + SimplePats ([], [], (3,13--3,15)), None, + PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = None })), (3,5--5,7), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,16--3,17) + WithKeyword = None })], (3,0--5,7)); + Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--7,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs.bsl b/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs.bsl index 821925690b1..a770ed3442e 100644 --- a/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs.bsl +++ b/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs.bsl @@ -14,15 +14,15 @@ ImplFile [ImplicitCtor (None, [], SimplePats ([], [], (3,6--3,8)), None, PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), - (3,5--3,6), { AsKeyword = None })], (5,0--5,0)), [], + (3,5--3,6), { AsKeyword = None })], (3,5--3,10)), [], Some (ImplicitCtor (None, [], SimplePats ([], [], (3,6--3,8)), None, PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), - (3,5--3,6), { AsKeyword = None })), (3,5--5,0), + (3,5--3,6), { AsKeyword = None })), (3,5--3,10), { LeadingKeyword = Type (3,0--3,4) EqualsRange = Some (3,9--3,10) - WithKeyword = None })], (3,0--5,0)); + WithKeyword = None })], (3,0--3,10)); Expr (Const (Unit, (5,0--5,2)), (5,0--5,2))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--5,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), diff --git a/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs.bsl b/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs.bsl index 8affb14690e..4fbcdb810b7 100644 --- a/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs.bsl +++ b/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs.bsl @@ -14,17 +14,17 @@ ImplFile [ImplicitCtor (None, [], SimplePats ([], [], (3,6--3,8)), None, PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), - (3,5--3,6), { AsKeyword = None })], (3,9--3,9)), [], + (3,5--3,6), { AsKeyword = None })], (3,5--3,10)), [], Some (ImplicitCtor (None, [], SimplePats ([], [], (3,6--3,8)), None, PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), - (3,5--3,6), { AsKeyword = None })), (3,5--3,9), + (3,5--3,6), { AsKeyword = None })), (3,5--3,10), { LeadingKeyword = Type (3,0--3,4) EqualsRange = Some (3,9--3,10) - WithKeyword = None })], (3,0--3,9))], + WithKeyword = None })], (3,0--3,10))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, - (1,0--3,9), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + (1,0--3,10), { LeadingKeyword = Module (1,0--1,6) })], (true, true), { ConditionalDirectives = [] CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/Struct 01.fs b/tests/service/data/SyntaxTree/Type/Struct 01.fs new file mode 100644 index 00000000000..25401c89409 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Struct 01.fs @@ -0,0 +1,3 @@ +module Module + +type S = struct end diff --git a/tests/service/data/SyntaxTree/Type/Struct 01.fs.bsl b/tests/service/data/SyntaxTree/Type/Struct 01.fs.bsl new file mode 100644 index 00000000000..9996befe9da --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Struct 01.fs.bsl @@ -0,0 +1,19 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Struct 01.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [S], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + ObjectModel (Struct, [], (3,9--3,19)), [], None, (3,5--3,19), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--3,19))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,19), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/Struct 02.fs b/tests/service/data/SyntaxTree/Type/Struct 02.fs new file mode 100644 index 00000000000..d7397ea29cd --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Struct 02.fs @@ -0,0 +1,6 @@ +module Module + +type S = + struct + val Field: int + end diff --git a/tests/service/data/SyntaxTree/Type/Struct 02.fs.bsl b/tests/service/data/SyntaxTree/Type/Struct 02.fs.bsl new file mode 100644 index 00000000000..5ed03aa81bd --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Struct 02.fs.bsl @@ -0,0 +1,28 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Struct 02.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [S], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + ObjectModel + (Struct, + [ValField + (SynField + ([], false, Some Field, + LongIdent (SynLongIdent ([int], [], [None])), false, + PreXmlDoc ((5,8), FSharp.Compiler.Xml.XmlDocCollector), + None, (5,12--5,22), + { LeadingKeyword = Some (Val (5,8--5,11)) }), + (5,8--5,22))], (4,4--6,7)), [], None, (3,5--6,7), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--6,7))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,7), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs b/tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs deleted file mode 100644 index 9adae91b8b7..00000000000 --- a/tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs +++ /dev/null @@ -1,4 +0,0 @@ - -type Foobar () = - class - end diff --git a/tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs.bsl b/tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs.bsl deleted file mode 100644 index 0de04ed069a..00000000000 --- a/tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs.bsl +++ /dev/null @@ -1,32 +0,0 @@ -ImplFile - (ParsedImplFileInput - ("/root/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs", - false, - QualifiedNameOfFile - SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign, [], [], - [SynModuleOrNamespace - ([SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign], - false, AnonModule, - [Types - ([SynTypeDefn - (SynComponentInfo - ([], None, [], [Foobar], - PreXmlDoc ((2,0), FSharp.Compiler.Xml.XmlDocCollector), - false, None, (2,5--2,11)), - ObjectModel - (Class, - [ImplicitCtor - (None, [], SimplePats ([], [], (2,12--2,14)), None, - PreXmlDoc ((2,12), FSharp.Compiler.Xml.XmlDocCollector), - (2,5--2,11), { AsKeyword = None })], (3,4--4,7)), [], - Some - (ImplicitCtor - (None, [], SimplePats ([], [], (2,12--2,14)), None, - PreXmlDoc ((2,12), FSharp.Compiler.Xml.XmlDocCollector), - (2,5--2,11), { AsKeyword = None })), (2,5--4,7), - { LeadingKeyword = Type (2,0--2,4) - EqualsRange = Some (2,15--2,16) - WithKeyword = None })], (2,0--4,7))], PreXmlDocEmpty, [], - None, (2,0--5,0), { LeadingKeyword = None })], (true, true), - { ConditionalDirectives = [] - CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/Type 03.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 03.fs.bsl index 47258d8b728..9cb15932e4c 100644 --- a/tests/service/data/SyntaxTree/Type/Type 03.fs.bsl +++ b/tests/service/data/SyntaxTree/Type/Type 03.fs.bsl @@ -9,10 +9,10 @@ ImplFile ([], None, [], [T], PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), false, None, (3,5--3,6)), - ObjectModel (Unspecified, [], (5,0--5,0)), [], None, - (3,5--5,0), { LeadingKeyword = Type (3,0--3,4) - EqualsRange = Some (3,7--3,8) - WithKeyword = None })], (3,0--5,0)); + Simple (None (3,5--3,8), (3,5--3,8)), [], None, (3,5--3,8), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--3,8)); Expr (Const (Unit, (5,0--5,2)), (5,0--5,2))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--5,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), diff --git a/tests/service/data/SyntaxTree/Type/Type 04.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 04.fs.bsl index 65fc3926189..83a744a8417 100644 --- a/tests/service/data/SyntaxTree/Type/Type 04.fs.bsl +++ b/tests/service/data/SyntaxTree/Type/Type 04.fs.bsl @@ -9,10 +9,10 @@ ImplFile ([], None, [], [T1], PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), false, None, (3,5--3,7)), - ObjectModel (Unspecified, [], (5,0--5,0)), [], None, - (3,5--5,0), { LeadingKeyword = Type (3,0--3,4) - EqualsRange = Some (3,8--3,9) - WithKeyword = None })], (3,0--5,0)); + Simple (None (3,5--3,9), (3,5--3,9)), [], None, (3,5--3,9), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,8--3,9) + WithKeyword = None })], (3,0--3,9)); Types ([SynTypeDefn (SynComponentInfo diff --git a/tests/service/data/SyntaxTree/Type/Type 05.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 05.fs.bsl index d5de1801c1c..ab92f140113 100644 --- a/tests/service/data/SyntaxTree/Type/Type 05.fs.bsl +++ b/tests/service/data/SyntaxTree/Type/Type 05.fs.bsl @@ -9,10 +9,10 @@ ImplFile ([], None, [], [T1], PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), false, None, (3,5--3,7)), - ObjectModel (Unspecified, [], (5,0--5,0)), [], None, - (3,5--5,0), { LeadingKeyword = Type (3,0--3,4) - EqualsRange = Some (3,8--3,9) - WithKeyword = None }); + Simple (None (3,5--3,9), (3,5--3,9)), [], None, (3,5--3,9), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,8--3,9) + WithKeyword = None }); SynTypeDefn (SynComponentInfo ([], None, [], [T2], diff --git a/tests/service/data/SyntaxTree/Type/Type 06.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 06.fs.bsl index c113ea3c208..48e453af537 100644 --- a/tests/service/data/SyntaxTree/Type/Type 06.fs.bsl +++ b/tests/service/data/SyntaxTree/Type/Type 06.fs.bsl @@ -9,10 +9,10 @@ ImplFile ([], None, [], [], PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), false, None, (3,5--3,6)), - ObjectModel (Unspecified, [], (3,5--3,5)), [], None, - (3,5--3,6), { LeadingKeyword = Type (3,0--3,4) - EqualsRange = Some (3,5--3,6) - WithKeyword = None })], (3,0--3,6))], + Simple (None (3,5--3,6), (3,5--3,6)), [], None, (3,5--3,6), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,5--3,6) + WithKeyword = None })], (3,0--3,6))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--3,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/Type/Type 11.fs b/tests/service/data/SyntaxTree/Type/Type 11.fs new file mode 100644 index 00000000000..f640106b52d --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 11.fs @@ -0,0 +1,5 @@ +module Module + +type T() = + +() diff --git a/tests/service/data/SyntaxTree/Type/Type 11.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 11.fs.bsl new file mode 100644 index 00000000000..fb9f7a3d57e --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 11.fs.bsl @@ -0,0 +1,32 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Type 11.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, + [ImplicitCtor + (None, [], SimplePats ([], [], (3,6--3,8)), None, + PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = None })], (3,5--3,10)), [], + Some + (ImplicitCtor + (None, [], SimplePats ([], [], (3,6--3,8)), None, + PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = None })), (3,5--3,10), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,9--3,10) + WithKeyword = None })], (3,0--3,10)); + Expr (Const (Unit, (5,0--5,2)), (5,0--5,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--5,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,5)-(3,7) parse error A type definition requires one or more members or other declarations. If you intend to define an empty class, struct or interface, then use 'type ... = class end', 'interface end' or 'struct end'. diff --git a/tests/service/data/SyntaxTree/Type/Type 12.fs b/tests/service/data/SyntaxTree/Type/Type 12.fs new file mode 100644 index 00000000000..e27562b2ffd --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 12.fs @@ -0,0 +1,5 @@ +module Module + +type X | A | B + +() diff --git a/tests/service/data/SyntaxTree/Type/Type 12.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 12.fs.bsl new file mode 100644 index 00000000000..9bacae3a626 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 12.fs.bsl @@ -0,0 +1,21 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Type 12.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [X], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + Simple (None (3,5--3,6), (3,5--3,6)), [], None, (3,5--3,6), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = None + WithKeyword = None })], (3,0--3,6))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,7)-(3,8) parse error Unexpected symbol '|' in type definition. Expected '=' or other token. From 83abdaff62ae85114f596fa86558013417804ecf Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Fri, 14 Jul 2023 15:56:36 +0200 Subject: [PATCH 2/5] Update baselines --- .../TypeAbbreviations/TypeAbbreviations.fs | 1 - .../ErrorMessages/TypeEqualsMissingTests.fs | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/TypeAbbreviations/TypeAbbreviations.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/TypeAbbreviations/TypeAbbreviations.fs index a584aa2ca21..c186a0d33e9 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/TypeAbbreviations/TypeAbbreviations.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/TypeAbbreviations/TypeAbbreviations.fs @@ -128,7 +128,6 @@ module TypeAbbreviations = |> shouldFail |> withDiagnostics [ (Error 10, Line 8, Col 1, Line 8, Col 5, "Incomplete structured construct at or before this point in type definition") - (Error 547, Line 6, Col 6, Line 6, Col 15, "A type definition requires one or more members or other declarations. If you intend to define an empty class, struct or interface, then use 'type ... = class end', 'interface end' or 'struct end'.") ] //SOURCE=E_IncorrectRightSide_Keyword.fsx SCFLAGS="--test:ErrorRanges" # E_IncorrectRightSide_Keyword.fsx diff --git a/tests/FSharp.Compiler.ComponentTests/ErrorMessages/TypeEqualsMissingTests.fs b/tests/FSharp.Compiler.ComponentTests/ErrorMessages/TypeEqualsMissingTests.fs index 39612f2b27b..13d596019de 100644 --- a/tests/FSharp.Compiler.ComponentTests/ErrorMessages/TypeEqualsMissingTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/ErrorMessages/TypeEqualsMissingTests.fs @@ -16,6 +16,6 @@ module ``Type definition missing equals`` = type X | A | B """ FSharpDiagnosticSeverity.Error - 3360 + 10 (2, 8, 2, 9) - "Unexpected token in type definition. Expected '=' after the type 'X'." + "Unexpected symbol '|' in type definition. Expected '=' or other token." From 8acdc0f95ff3120e90dbb96dcf046d2d61060a39 Mon Sep 17 00:00:00 2001 From: Petr Date: Mon, 17 Jul 2023 18:12:10 +0200 Subject: [PATCH 3/5] Adjust the code fix --- .../Service/FSharpParseFileResults.fs | 18 ++++++++++ .../Service/FSharpParseFileResults.fsi | 3 ++ .../AddMissingEqualsToTypeDefinition.fs | 35 ++++++++++++------- .../AddMissingEqualsToTypeDefinitionTests.fs | 23 ++++-------- 4 files changed, 50 insertions(+), 29 deletions(-) diff --git a/src/Compiler/Service/FSharpParseFileResults.fs b/src/Compiler/Service/FSharpParseFileResults.fs index 67964dc1bc7..97f7c96acee 100644 --- a/src/Compiler/Service/FSharpParseFileResults.fs +++ b/src/Compiler/Service/FSharpParseFileResults.fs @@ -505,6 +505,24 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, let result = SyntaxTraversal.Traverse(pos, input, visitor) result.IsSome + member _.IsPositionWithinTypeDefinition pos = + let visitor = + { new SyntaxVisitorBase<_>() with + override _.VisitComponentInfo(path, _) = + let typeDefs = + path + |> List.filter (function + | SyntaxNode.SynModule (SynModuleDecl.Types _) -> true + | _ -> false) + + match typeDefs with + | [] -> None + | _ -> Some true + } + + let result = SyntaxTraversal.Traverse(pos, input, visitor) + result.IsSome + member _.IsBindingALambdaAtPosition pos = let visitor = { new SyntaxVisitorBase<_>() with diff --git a/src/Compiler/Service/FSharpParseFileResults.fsi b/src/Compiler/Service/FSharpParseFileResults.fsi index ec18bcf8f7c..7ee4b8ba51f 100644 --- a/src/Compiler/Service/FSharpParseFileResults.fsi +++ b/src/Compiler/Service/FSharpParseFileResults.fsi @@ -68,6 +68,9 @@ type public FSharpParseFileResults = /// Determines if the expression or pattern at the given position has a type annotation member IsTypeAnnotationGivenAtPosition: pos -> bool + /// Determines if the given position is bound to a type definition + member IsPositionWithinTypeDefinition: pos -> bool + /// Determines if the binding at the given position is bound to a lambda expression member IsBindingALambdaAtPosition: pos -> bool diff --git a/vsintegration/src/FSharp.Editor/CodeFixes/AddMissingEqualsToTypeDefinition.fs b/vsintegration/src/FSharp.Editor/CodeFixes/AddMissingEqualsToTypeDefinition.fs index 07896e9743b..46e5d096a9b 100644 --- a/vsintegration/src/FSharp.Editor/CodeFixes/AddMissingEqualsToTypeDefinition.fs +++ b/vsintegration/src/FSharp.Editor/CodeFixes/AddMissingEqualsToTypeDefinition.fs @@ -16,26 +16,35 @@ type internal AddMissingEqualsToTypeDefinitionCodeFixProvider() = static let title = SR.AddMissingEqualsToTypeDefinition() - override _.FixableDiagnosticIds = ImmutableArray.Create "FS3360" + override _.FixableDiagnosticIds = ImmutableArray.Create "FS0010" override this.RegisterCodeFixesAsync context = context.RegisterFsharpFix this interface IFSharpCodeFixProvider with member _.GetCodeFixIfAppliesAsync context = cancellableTask { - let! range = context.GetErrorRangeAsync() + let message = + context.Diagnostics + |> Seq.exactlyOne + |> fun d -> d.Descriptor.MessageFormat.ToString() - let! parseResults = context.Document.GetFSharpParseResultsAsync(nameof AddMissingEqualsToTypeDefinitionCodeFixProvider) - - if parseResults.IsTypeName range then + // this should eliminate 99.9% of germs + if not <| message.Contains "=" then return None - else - return - Some - { - Name = CodeFix.AddMissingEqualsToTypeDefinition - Message = title - Changes = [ TextChange(TextSpan(context.Span.Start, 0), "= ") ] - } + + let! range = context.GetErrorRangeAsync() + let! parseResults = context.Document.GetFSharpParseResultsAsync(nameof AddMissingEqualsToTypeDefinitionCodeFixProvider) + + if not <| parseResults.IsPositionWithinTypeDefinition range.Start then + return None + + else + return + Some + { + Name = CodeFix.AddMissingEqualsToTypeDefinition + Message = title + Changes = [ TextChange(TextSpan(context.Span.Start, 0), "= ") ] + } } diff --git a/vsintegration/tests/FSharp.Editor.Tests/CodeFixes/AddMissingEqualsToTypeDefinitionTests.fs b/vsintegration/tests/FSharp.Editor.Tests/CodeFixes/AddMissingEqualsToTypeDefinitionTests.fs index 0b3e28bb830..4b02e503e54 100644 --- a/vsintegration/tests/FSharp.Editor.Tests/CodeFixes/AddMissingEqualsToTypeDefinitionTests.fs +++ b/vsintegration/tests/FSharp.Editor.Tests/CodeFixes/AddMissingEqualsToTypeDefinitionTests.fs @@ -8,10 +8,10 @@ open Xunit open CodeFixTestFramework let private codeFix = AddMissingEqualsToTypeDefinitionCodeFixProvider() -let private diagnostic = 3360 // Unexpected token in type def... +let private diagnostic = 0010 // Unexpected symbol... [] -let ``Fixes FS0360 for missing equals in type def - simple types`` () = +let ``Fixes FS0010 for missing equals in type def - simple types`` () = let code = """ type Song { Artist : string; Title : int } @@ -32,7 +32,7 @@ type Song = { Artist : string; Title : int } Assert.Equal(expected, actual) [] -let ``Fixes FS0360 for missing equals in type def - records`` () = +let ``Fixes FS0010 for missing equals in type def - records`` () = let code = """ type Name Name of string @@ -52,19 +52,10 @@ type Name = Name of string Assert.Equal(expected, actual) -[] -// apparently this throws the same error hah -let ``Doesn't fix FS0360 for invalid interface defs`` () = - let code = - """ -type IA<'b> = - abstract Foo : int -> int - -type IB<'b> = - inherit IA<'b> - inherit IA -""" - +[] +[] +[Tady nebo před tímto místem začal neúplný interpolovaný doslovný řetězec. - - Unexpected token in type definition. Expected '=' after the type '{0}'. - Neočekávaný token v definici typu. Za typem {0} se očekává =. - - Expected a pattern after this point Za tímto bodem byl očekáván vzor diff --git a/src/Compiler/xlf/FSComp.txt.de.xlf b/src/Compiler/xlf/FSComp.txt.de.xlf index 7d27833b09f..0a210f79b28 100644 --- a/src/Compiler/xlf/FSComp.txt.de.xlf +++ b/src/Compiler/xlf/FSComp.txt.de.xlf @@ -802,11 +802,6 @@ Unvollständige interpolierte ausführliche Zeichenfolge, die an oder vor dieser Stelle begonnen wurde. - - Unexpected token in type definition. Expected '=' after the type '{0}'. - Unerwartetes Token in Typdefinition. Nach Typ "{0}" wurde "=" erwartet. - - Expected a pattern after this point Nach diesem Punkt wurde ein Muster erwartet. diff --git a/src/Compiler/xlf/FSComp.txt.es.xlf b/src/Compiler/xlf/FSComp.txt.es.xlf index a8e677179ba..02d718da76b 100644 --- a/src/Compiler/xlf/FSComp.txt.es.xlf +++ b/src/Compiler/xlf/FSComp.txt.es.xlf @@ -802,11 +802,6 @@ La cadena textual interpolada incompleta comenzaba aquí o antes. - - Unexpected token in type definition. Expected '=' after the type '{0}'. - Token inesperado en la definición de tipo. Se esperaba "=" después del tipo "{0}". - - Expected a pattern after this point Se esperaba un patrón después de este punto diff --git a/src/Compiler/xlf/FSComp.txt.fr.xlf b/src/Compiler/xlf/FSComp.txt.fr.xlf index a22f959e7aa..bab2c985de1 100644 --- a/src/Compiler/xlf/FSComp.txt.fr.xlf +++ b/src/Compiler/xlf/FSComp.txt.fr.xlf @@ -802,11 +802,6 @@ Chaîne verbatim interpolée incomplète ayant débuté à cet emplacement ou avant - - Unexpected token in type definition. Expected '=' after the type '{0}'. - Jeton inattendu dans la définition de type. Signe '=' attendu après le type '{0}'. - - Expected a pattern after this point Modèle attendu après ce point diff --git a/src/Compiler/xlf/FSComp.txt.it.xlf b/src/Compiler/xlf/FSComp.txt.it.xlf index 7d21cdb16a1..4c77bc07e09 100644 --- a/src/Compiler/xlf/FSComp.txt.it.xlf +++ b/src/Compiler/xlf/FSComp.txt.it.xlf @@ -802,11 +802,6 @@ La stringa verbatim interpolata incompleta inizia in questa posizione o prima di essa - - Unexpected token in type definition. Expected '=' after the type '{0}'. - Token imprevisto nella definizione del tipo. Dopo il tipo '{0}' è previsto '='. - - Expected a pattern after this point Previsto un criterio dopo questa posizione diff --git a/src/Compiler/xlf/FSComp.txt.ja.xlf b/src/Compiler/xlf/FSComp.txt.ja.xlf index ad052e25d22..777a07b3cb1 100644 --- a/src/Compiler/xlf/FSComp.txt.ja.xlf +++ b/src/Compiler/xlf/FSComp.txt.ja.xlf @@ -802,11 +802,6 @@ この位置以前に始まった補間された逐語的文字列が不完全です - - Unexpected token in type definition. Expected '=' after the type '{0}'. - 型定義に予期しないトークンがあります。型 '{0}' の後には '=' が必要です。 - - Expected a pattern after this point このポイントの後にパターンが必要です diff --git a/src/Compiler/xlf/FSComp.txt.ko.xlf b/src/Compiler/xlf/FSComp.txt.ko.xlf index a003c8ae916..c938d79b00a 100644 --- a/src/Compiler/xlf/FSComp.txt.ko.xlf +++ b/src/Compiler/xlf/FSComp.txt.ko.xlf @@ -802,11 +802,6 @@ 불완전한 보간 축자 문자열이 여기 또는 이전에서 시작되었습니다. - - Unexpected token in type definition. Expected '=' after the type '{0}'. - 형식 정의에 예기치 않은 토큰이 있습니다. '{0}' 형식 뒤에 '='가 필요합니다. - - Expected a pattern after this point 이 지점 뒤에 패턴이 필요합니다. diff --git a/src/Compiler/xlf/FSComp.txt.pl.xlf b/src/Compiler/xlf/FSComp.txt.pl.xlf index f829eaf8e68..5231b82185f 100644 --- a/src/Compiler/xlf/FSComp.txt.pl.xlf +++ b/src/Compiler/xlf/FSComp.txt.pl.xlf @@ -802,11 +802,6 @@ Niekompletny interpolowany dosłowny ciąg rozpoczęty w tym miejscu lub wcześniej - - Unexpected token in type definition. Expected '=' after the type '{0}'. - Nieoczekiwany token w definicji typu. Oczekiwano znaku „=” po typie „{0}”. - - Expected a pattern after this point Oczekiwano wzorca po tym punkcie diff --git a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf index cc2041d6026..fc778cdb2b8 100644 --- a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf +++ b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf @@ -802,11 +802,6 @@ A cadeia de caracteres verbatim interpolada incompleta foi iniciada aqui ou anteriormente - - Unexpected token in type definition. Expected '=' after the type '{0}'. - Token inesperado na definição de tipo. Esperava-se '=' após o tipo '{0}'. - - Expected a pattern after this point Um padrão é esperado após este ponto diff --git a/src/Compiler/xlf/FSComp.txt.ru.xlf b/src/Compiler/xlf/FSComp.txt.ru.xlf index 49e6c92d5e8..da40f20306c 100644 --- a/src/Compiler/xlf/FSComp.txt.ru.xlf +++ b/src/Compiler/xlf/FSComp.txt.ru.xlf @@ -802,11 +802,6 @@ Неполная интерполированная буквальная строка, начатая в этой позиции или до нее - - Unexpected token in type definition. Expected '=' after the type '{0}'. - Неожиданный токен в определении типа. После типа "{0}" ожидается "=". - - Expected a pattern after this point После этой точки ожидался шаблон diff --git a/src/Compiler/xlf/FSComp.txt.tr.xlf b/src/Compiler/xlf/FSComp.txt.tr.xlf index 5ea3abcc5ac..f8680d165ea 100644 --- a/src/Compiler/xlf/FSComp.txt.tr.xlf +++ b/src/Compiler/xlf/FSComp.txt.tr.xlf @@ -802,11 +802,6 @@ Tamamlanmamış düz metin arasına kod eklenmiş düz metin dizesi, burada veya daha önce başlıyordu - - Unexpected token in type definition. Expected '=' after the type '{0}'. - Tür tanımında beklenmeyen belirteç var. '{0}' türünden sonra '=' bekleniyordu. - - Expected a pattern after this point Bu noktadan sonra bir desen bekleniyordu diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf index e95ce09f131..ff70d448307 100644 --- a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf @@ -802,11 +802,6 @@ 在此处或之前开始的内插逐字字符串不完整 - - Unexpected token in type definition. Expected '=' after the type '{0}'. - 类型定义中出现意外标记。类型“{0}”后应为 "="。 - - Expected a pattern after this point 此点之后应有一个模式 diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf index 994a149ea54..71ff3d47eea 100644 --- a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf @@ -802,11 +802,6 @@ 未完成的插補逐字字串於此處或之前開始 - - Unexpected token in type definition. Expected '=' after the type '{0}'. - 型別定義中出現非預期的權杖。類型 '{0}' 之後應該要有 '='。 - - Expected a pattern after this point 在這個點之後必須有模式