From 69d74d853fe9c40a97b928a02a1edc1b1b44888b Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Sun, 25 Jun 2023 21:49:02 +0200 Subject: [PATCH 1/7] Parser: recover on unfinished `inherit` (#15476) --- src/Compiler/pars.fsy | 15 ++++-- .../data/SyntaxTree/Member/Inherit 01.fs | 4 ++ .../data/SyntaxTree/Member/Inherit 01.fs.bsl | 23 +++++++++ .../data/SyntaxTree/Member/Inherit 02.fs | 4 ++ .../data/SyntaxTree/Member/Inherit 02.fs.bsl | 24 +++++++++ .../data/SyntaxTree/Member/Inherit 03.fs | 4 ++ .../data/SyntaxTree/Member/Inherit 03.fs.bsl | 25 ++++++++++ .../data/SyntaxTree/Member/Inherit 04.fs | 6 +++ .../data/SyntaxTree/Member/Inherit 04.fs.bsl | 26 ++++++++++ .../data/SyntaxTree/Member/Inherit 05.fs | 6 +++ .../data/SyntaxTree/Member/Inherit 05.fs.bsl | 49 +++++++++++++++++++ .../data/SyntaxTree/Member/Inherit 06.fsi | 4 ++ .../data/SyntaxTree/Member/Inherit 06.fsi.bsl | 24 +++++++++ .../data/SyntaxTree/Member/Inherit 07.fsi | 6 +++ .../data/SyntaxTree/Member/Inherit 07.fsi.bsl | 43 ++++++++++++++++ 15 files changed, 259 insertions(+), 4 deletions(-) create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 01.fs create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 02.fs create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 02.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 03.fs create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 03.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 04.fs create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 04.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 05.fs create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 05.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 06.fsi create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 06.fsi.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 07.fsi create mode 100644 tests/service/data/SyntaxTree/Member/Inherit 07.fsi.bsl 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 From 5225dc8a982321ed525475df49185796abfdb423 Mon Sep 17 00:00:00 2001 From: Janusz Wrobel Date: Sun, 25 Jun 2023 20:54:08 +0100 Subject: [PATCH 2/7] Graph-based type-checking: fix when node processing throws (#15479) * Graph-based type-checking: fix when node processing throws --- .../Driver/GraphChecking/GraphProcessing.fs | 3 ++- .../FSharp.Compiler.ComponentTests.fsproj | 1 + .../TypeChecks/Graph/GraphProcessingTests.fs | 23 +++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/GraphProcessingTests.fs diff --git a/src/Compiler/Driver/GraphChecking/GraphProcessing.fs b/src/Compiler/Driver/GraphChecking/GraphProcessing.fs index 332ed2a00ec..2cadaf25ac5 100644 --- a/src/Compiler/Driver/GraphChecking/GraphProcessing.fs +++ b/src/Compiler/Driver/GraphChecking/GraphProcessing.fs @@ -91,9 +91,10 @@ let processGraph<'Item, 'Result when 'Item: equality and 'Item: comparison> /// Only the first exception encountered is stored - this can cause non-deterministic errors if more than one item fails. let raiseExn, getExn = let mutable exn: ('Item * System.Exception) option = None + let lockObj = obj () // Only set the exception if it hasn't been set already let setExn newExn = - lock exn (fun () -> + lock lockObj (fun () -> match exn with | Some _ -> () | None -> exn <- newExn diff --git a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj index 0145bcfa609..c99458dabbf 100644 --- a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj +++ b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj @@ -207,6 +207,7 @@ + diff --git a/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/GraphProcessingTests.fs b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/GraphProcessingTests.fs new file mode 100644 index 00000000000..3e5483b0a7f --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/TypeChecks/Graph/GraphProcessingTests.fs @@ -0,0 +1,23 @@ +module TypeChecks.GraphProcessingTests + +open System.Threading +open FSharp.Compiler.GraphChecking.GraphProcessing +open NUnit.Framework + +[] +let ``When processing a node throws an exception, an exception is raised with the original exception included`` () = + let graph = [1, [|2|]; 2, [||]] |> readOnlyDict + let work (_processor : int -> ProcessedNode) (_node : NodeInfo) : string = failwith "Work exception" + + let exn = + Assert.Throws( + fun () -> + processGraph + graph + work + CancellationToken.None + |> ignore + ) + Assert.That(exn.Message, Is.EqualTo("Encountered exception when processing item '2'")) + Assert.That(exn.InnerException, Is.Not.Null) + Assert.That(exn.InnerException.Message, Is.EqualTo("Work exception")) From 74a91941a563a4e4c4ea229ca5441fa9be6b0e03 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Mon, 26 Jun 2023 14:21:34 +0200 Subject: [PATCH 3/7] Parser: recover on unfinished `val` fields and auto properties (#15478) * Parser: recover on unfinished `val` fields and auto properties * Fantomas --- src/Compiler/Checking/CheckDeclarations.fs | 8 +- src/Compiler/SyntaxTree/ParseHelpers.fs | 46 ++++++++ src/Compiler/SyntaxTree/ParseHelpers.fsi | 27 +++++ src/Compiler/pars.fsy | 104 ++++++++++++++---- .../SyntaxTree/Member/Auto property 01.fs | 4 + .../SyntaxTree/Member/Auto property 01.fs.bsl | 42 +++++++ .../SyntaxTree/Member/Auto property 02.fs | 6 + .../SyntaxTree/Member/Auto property 02.fs.bsl | 49 +++++++++ .../SyntaxTree/Member/Auto property 03.fs | 7 ++ .../SyntaxTree/Member/Auto property 03.fs.bsl | 70 ++++++++++++ .../SyntaxTree/Member/Auto property 04.fs | 7 ++ .../SyntaxTree/Member/Auto property 04.fs.bsl | 65 +++++++++++ .../SyntaxTree/Member/Auto property 05.fs | 7 ++ .../SyntaxTree/Member/Auto property 05.fs.bsl | 67 +++++++++++ .../SyntaxTree/Member/Auto property 06.fs | 6 + .../SyntaxTree/Member/Auto property 06.fs.bsl | 45 ++++++++ .../data/SyntaxTree/Member/Field 01.fs | 4 + .../data/SyntaxTree/Member/Field 01.fs.bsl | 28 +++++ .../data/SyntaxTree/Member/Field 02.fs | 7 ++ .../data/SyntaxTree/Member/Field 02.fs.bsl | 39 +++++++ .../data/SyntaxTree/Member/Field 03.fs | 7 ++ .../data/SyntaxTree/Member/Field 03.fs.bsl | 38 +++++++ .../data/SyntaxTree/Member/Field 04.fs | 7 ++ .../data/SyntaxTree/Member/Field 04.fs.bsl | 38 +++++++ .../data/SyntaxTree/Member/Field 05.fs | 6 + .../data/SyntaxTree/Member/Field 05.fs.bsl | 31 ++++++ .../data/SyntaxTree/Member/Field 06.fs | 6 + .../data/SyntaxTree/Member/Field 06.fs.bsl | 30 +++++ .../data/SyntaxTree/Member/Field 07.fs | 6 + .../data/SyntaxTree/Member/Field 07.fs.bsl | 30 +++++ .../data/SyntaxTree/Member/Field 08.fs | 8 ++ .../data/SyntaxTree/Member/Field 08.fs.bsl | 30 +++++ .../data/SyntaxTree/Member/Field 09.fs | 6 + .../data/SyntaxTree/Member/Field 09.fs.bsl | 31 ++++++ 34 files changed, 886 insertions(+), 26 deletions(-) create mode 100644 tests/service/data/SyntaxTree/Member/Auto property 01.fs create mode 100644 tests/service/data/SyntaxTree/Member/Auto property 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Auto property 02.fs create mode 100644 tests/service/data/SyntaxTree/Member/Auto property 02.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Auto property 03.fs create mode 100644 tests/service/data/SyntaxTree/Member/Auto property 03.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Auto property 04.fs create mode 100644 tests/service/data/SyntaxTree/Member/Auto property 04.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Auto property 05.fs create mode 100644 tests/service/data/SyntaxTree/Member/Auto property 05.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Auto property 06.fs create mode 100644 tests/service/data/SyntaxTree/Member/Auto property 06.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Field 01.fs create mode 100644 tests/service/data/SyntaxTree/Member/Field 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Field 02.fs create mode 100644 tests/service/data/SyntaxTree/Member/Field 02.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Field 03.fs create mode 100644 tests/service/data/SyntaxTree/Member/Field 03.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Field 04.fs create mode 100644 tests/service/data/SyntaxTree/Member/Field 04.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Field 05.fs create mode 100644 tests/service/data/SyntaxTree/Member/Field 05.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Field 06.fs create mode 100644 tests/service/data/SyntaxTree/Member/Field 06.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Field 07.fs create mode 100644 tests/service/data/SyntaxTree/Member/Field 07.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Field 08.fs create mode 100644 tests/service/data/SyntaxTree/Member/Field 08.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Field 09.fs create mode 100644 tests/service/data/SyntaxTree/Member/Field 09.fs.bsl diff --git a/src/Compiler/Checking/CheckDeclarations.fs b/src/Compiler/Checking/CheckDeclarations.fs index 7d254fb8388..dcd34ee74dc 100644 --- a/src/Compiler/Checking/CheckDeclarations.fs +++ b/src/Compiler/Checking/CheckDeclarations.fs @@ -4142,7 +4142,9 @@ module TcDeclarations = // Convert auto properties to let bindings in the pre-list let rec preAutoProps memb = - match memb with + match memb with + | SynMemberDefn.AutoProperty(ident = id) when id.idText = "" -> [] + | SynMemberDefn.AutoProperty(attributes=Attributes attribs; isStatic=isStatic; ident=id; typeOpt=tyOpt; propKind=propKind; xmlDoc=xmlDoc; synExpr=synExpr; range=mWholeAutoProp) -> // Only the keep the field-targeted attributes let attribs = attribs |> List.filter (fun a -> match a.Target with Some t when t.idText = "field" -> true | _ -> false) @@ -4169,7 +4171,9 @@ module TcDeclarations = // Convert auto properties to member bindings in the post-list let rec postAutoProps memb = - match memb with + match memb with + | SynMemberDefn.AutoProperty(ident = id) when id.idText = "" -> [] + | 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 diff --git a/src/Compiler/SyntaxTree/ParseHelpers.fs b/src/Compiler/SyntaxTree/ParseHelpers.fs index 80929510001..5ba4d87f795 100644 --- a/src/Compiler/SyntaxTree/ParseHelpers.fs +++ b/src/Compiler/SyntaxTree/ParseHelpers.fs @@ -1099,3 +1099,49 @@ let mkSynUnionCase attributes (access: SynAccess option) id kind mDecl (xmlDoc, let trivia: SynUnionCaseTrivia = { BarRange = Some mBar } let mDecl = unionRangeWithXmlDoc xmlDoc mDecl SynUnionCase(attributes, id, kind, xmlDoc, None, mDecl, trivia) + +let mkAutoPropDefn mVal access ident typ mEquals (expr: SynExpr) accessors xmlDoc attribs flags rangeStart = + let mWith, (getSet, getSetOpt) = accessors + let memberRange = unionRanges rangeStart expr.Range |> unionRangeWithXmlDoc xmlDoc + let flags, leadingKeyword = flags + let leadingKeyword = appendValToLeadingKeyword mVal leadingKeyword + let memberFlags: SynMemberFlags = flags SynMemberKind.Member + let memberFlagsForSet = flags SynMemberKind.PropertySet + let isStatic = not memberFlags.IsInstance + + let trivia = + { + LeadingKeyword = leadingKeyword + WithKeyword = mWith + EqualsRange = mEquals + GetSetKeywords = getSetOpt + } + + SynMemberDefn.AutoProperty( + attribs, + isStatic, + ident, + typ, + getSet, + memberFlags, + memberFlagsForSet, + xmlDoc, + access, + expr, + memberRange, + trivia + ) + +let mkValField mVal mRhs mut access ident (typ: SynType) xmlDoc rangeStart attribs mStaticOpt = + let isStatic = Option.isSome mStaticOpt + let mValDecl = unionRanges rangeStart typ.Range |> unionRangeWithXmlDoc xmlDoc + + let leadingKeyword = + match mStaticOpt with + | None -> SynLeadingKeyword.Val mVal + | Some mStatic -> SynLeadingKeyword.StaticVal(mStatic, mVal) + + let fld = + SynField(attribs, isStatic, Some ident, typ, mut, xmlDoc, access, mRhs, { LeadingKeyword = Some leadingKeyword }) + + SynMemberDefn.ValField(fld, mValDecl) diff --git a/src/Compiler/SyntaxTree/ParseHelpers.fsi b/src/Compiler/SyntaxTree/ParseHelpers.fsi index 326a806e131..5bcff5f26fa 100644 --- a/src/Compiler/SyntaxTree/ParseHelpers.fsi +++ b/src/Compiler/SyntaxTree/ParseHelpers.fsi @@ -247,3 +247,30 @@ val mkSynUnionCase: mDecl: range -> (PreXmlDoc * range) -> SynUnionCase + +val mkAutoPropDefn: + mVal: range -> + access: SynAccess option -> + ident: Ident -> + typ: SynType option -> + mEquals: range option -> + expr: SynExpr -> + accessors: range option * (SynMemberKind * GetSetKeywords option) -> + xmlDoc: PreXmlDoc -> + attribs: SynAttributes -> + flags: (SynMemberKind -> SynMemberFlags) * SynLeadingKeyword -> + rangeStart: range -> + SynMemberDefn + +val mkValField: + mVal: range -> + mRhs: range -> + mut: bool -> + access: SynAccess option -> + ident: Ident -> + typ: SynType -> + xmlDoc: PreXmlDoc -> + range -> + SynAttributes -> + range option -> + SynMemberDefn diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index cdd535ce565..ee708ba8f51 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -2024,42 +2024,98 @@ valDefnDecl: | VAL opt_mutable opt_access ident COLON typ { let mVal = rhs parseState 1 let mRhs = rhs2 parseState 4 6 - let mValDecl = rhs2 parseState 1 6 - (fun rangeStart attribs mStaticOpt -> - let isStatic = Option.isSome mStaticOpt - let xmlDoc = grabXmlDocAtRangeStart(parseState, attribs, rangeStart) - let mValDecl = unionRanges rangeStart mValDecl |> unionRangeWithXmlDoc xmlDoc - let leadingKeyword = - match mStaticOpt with - | None -> SynLeadingKeyword.Val mVal - | Some mStatic -> SynLeadingKeyword.StaticVal(mStatic, mVal) - let fld = SynField(attribs, isStatic, Some $4, $6, $2, xmlDoc, $3, mRhs, { LeadingKeyword = Some leadingKeyword }) - [ SynMemberDefn.ValField(fld, mValDecl) ]) } + fun rangeStart attribs mStaticOpt -> + let xmlDoc = grabXmlDocAtRangeStart (parseState, attribs, rangeStart) + [ mkValField mVal mRhs $2 $3 $4 $6 xmlDoc rangeStart attribs mStaticOpt ] } + + | VAL opt_mutable opt_access ident COLON recover + { let mVal = rhs parseState 1 + let mRhs = rhs2 parseState 4 6 + let mColon = rhs parseState 5 + let ty = SynType.FromParseError(mColon.EndRange) + fun rangeStart attribs mStaticOpt -> + let xmlDoc = grabXmlDocAtRangeStart (parseState, attribs, rangeStart) + [ mkValField mVal mRhs $2 $3 $4 ty xmlDoc rangeStart attribs mStaticOpt ] } + + | VAL opt_mutable opt_access ident recover + { let mVal = rhs parseState 1 + let mRhs = rhs2 parseState 4 6 + let mColon = rhs parseState 5 + let ty = SynType.FromParseError(mColon.EndRange) + fun rangeStart attribs mStaticOpt -> + let xmlDoc = grabXmlDocAtRangeStart (parseState, attribs, rangeStart) + [ mkValField mVal mRhs $2 $3 $4 ty xmlDoc rangeStart attribs mStaticOpt ] } + + | VAL opt_mutable opt_access recover + { let mVal = rhs parseState 1 + let mRhs = rhs2 parseState 4 6 + let id = mkSynId mVal.EndRange "" + let mColon = rhs parseState 5 + let ty = SynType.FromParseError(mColon.EndRange) + fun rangeStart attribs mStaticOpt -> + let xmlDoc = grabXmlDocAtRangeStart (parseState, attribs, rangeStart) + [ mkValField mVal mRhs $2 $3 id ty xmlDoc rangeStart attribs mStaticOpt ] } /* An auto-property definition in an object type definition */ autoPropsDefnDecl: | VAL opt_mutable opt_access ident opt_typ EQUALS typedSequentialExprBlock classMemberSpfnGetSet { let mVal = rhs parseState 1 - let mWith, (getSet, getSetOpt) = $8 let mEquals = rhs parseState 6 if $2 then - errorR (Error (FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSet (), rhs parseState 3)) - (fun attribs flags rangeStart -> + errorR (Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSet (), rhs parseState 2)) + fun attribs flags rangeStart -> + let xmlDoc = grabXmlDocAtRangeStart (parseState, attribs, rangeStart) + [ mkAutoPropDefn mVal $3 $4 $5 (Some mEquals) $7 $8 xmlDoc attribs flags rangeStart ] } + +| VAL opt_mutable opt_access ident opt_typ ends_coming_soon_or_recover + { let mVal = rhs parseState 1 + let mEnd = + match $5 with + | Some t -> t.Range + | _ -> $4.idRange + let expr = arbExpr ("autoProp1", mEnd.EndRange) + if $2 then + errorR (Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSet (), rhs parseState 2)) + fun attribs flags rangeStart -> + let xmlDoc = grabXmlDocAtRangeStart (parseState, attribs, rangeStart) + [ mkAutoPropDefn mVal $3 $4 $5 None expr (None, (SynMemberKind.Member, None)) xmlDoc attribs flags rangeStart ] } + + | VAL opt_mutable opt_access ident opt_typ OBLOCKSEP + { let mVal = rhs parseState 1 + let mEnd = + match $5 with + | Some t -> t.Range + | _ -> $4.idRange + let expr = arbExpr ("autoProp2", mEnd.EndRange) + if $2 then + errorR (Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSet (), rhs parseState 2)) + fun attribs flags rangeStart -> + let xmlDoc = grabXmlDocAtRangeStart (parseState, attribs, rangeStart) + [ mkAutoPropDefn mVal $3 $4 $5 None expr (None, (SynMemberKind.Member, None)) xmlDoc attribs flags rangeStart ] } + +| VAL opt_mutable opt_access recover + { let mVal = rhs parseState 1 + let id = mkSynId mVal.EndRange "" + let expr = arbExpr ("autoProp3", mVal.EndRange) + if $2 then + errorR (Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSet (), rhs parseState 2)) + fun attribs flags rangeStart -> let xmlDoc = grabXmlDocAtRangeStart(parseState, attribs, rangeStart) - let memberRange = unionRanges rangeStart $7.Range |> unionRangeWithXmlDoc xmlDoc - let flags, leadingKeyword = flags - let leadingKeyword = appendValToLeadingKeyword mVal leadingKeyword - let memberFlags = flags SynMemberKind.Member - let memberFlagsForSet = flags SynMemberKind.PropertySet - let isStatic = not memberFlags.IsInstance - let trivia = { LeadingKeyword = leadingKeyword; WithKeyword = mWith; EqualsRange = Some mEquals; GetSetKeywords = getSetOpt } - [ SynMemberDefn.AutoProperty(attribs, isStatic, $4, $5, getSet, memberFlags, memberFlagsForSet, xmlDoc, $3, $7, memberRange, trivia) ]) } + [ mkAutoPropDefn mVal $3 id None None expr (None, (SynMemberKind.Member, None)) xmlDoc attribs flags rangeStart ] } /* An optional type on an auto-property definition */ opt_typ: - | /* EMPTY */ { None } - | COLON typ { Some $2 } + | /* EMPTY */ + { None } + + | COLON typ + { Some $2 } + + | COLON recover + { let mColon = rhs parseState 1 + let ty = SynType.FromParseError(mColon.EndRange) + Some ty } atomicPatternLongIdent: diff --git a/tests/service/data/SyntaxTree/Member/Auto property 01.fs b/tests/service/data/SyntaxTree/Member/Auto property 01.fs new file mode 100644 index 00000000000..be9e101b7e0 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Auto property 01.fs @@ -0,0 +1,4 @@ +module Module + +type T = + member val P1 = 1 diff --git a/tests/service/data/SyntaxTree/Member/Auto property 01.fs.bsl b/tests/service/data/SyntaxTree/Member/Auto property 01.fs.bsl new file mode 100644 index 00000000000..5155ca1b3e3 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Auto property 01.fs.bsl @@ -0,0 +1,42 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Auto property 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, + [AutoProperty + ([], false, P1, None, Member, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = Member }, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertySet }, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, Const (Int32 1, (4,20--4,21)), (4,4--4,21), + { LeadingKeyword = + MemberVal ((4,4--4,10), (4,11--4,14)) + WithKeyword = None + EqualsRange = Some (4,18--4,19) + GetSetKeywords = None })], (4,4--4,21)), [], None, + (3,5--4,21), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--4,21))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--4,21), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Member/Auto property 02.fs b/tests/service/data/SyntaxTree/Member/Auto property 02.fs new file mode 100644 index 00000000000..33d48c8636a --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Auto property 02.fs @@ -0,0 +1,6 @@ +module Module + +type T = + member val P1 = + +() diff --git a/tests/service/data/SyntaxTree/Member/Auto property 02.fs.bsl b/tests/service/data/SyntaxTree/Member/Auto property 02.fs.bsl new file mode 100644 index 00000000000..e48782f3ac6 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Auto property 02.fs.bsl @@ -0,0 +1,49 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Auto property 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 + (Unspecified, + [AutoProperty + ([], false, P1, None, Member, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = Member }, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertySet }, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, + ArbitraryAfterError + ("typedSequentialExprBlock1", (4,19--4,19)), + (4,4--4,19), + { LeadingKeyword = + MemberVal ((4,4--4,10), (4,11--4,14)) + WithKeyword = None + EqualsRange = Some (4,18--4,19) + GetSetKeywords = None })], (4,4--4,19)), [], None, + (3,5--4,19), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--4,19)); + Expr (Const (Unit, (6,0--6,2)), (6,0--6,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(6,0)-(6,1) 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,0)-(6,1) parse error Expecting expression diff --git a/tests/service/data/SyntaxTree/Member/Auto property 03.fs b/tests/service/data/SyntaxTree/Member/Auto property 03.fs new file mode 100644 index 00000000000..eb45b294aad --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Auto property 03.fs @@ -0,0 +1,7 @@ +module Module + +type T = + member val P1 = + member val P2 = 2 + +() diff --git a/tests/service/data/SyntaxTree/Member/Auto property 03.fs.bsl b/tests/service/data/SyntaxTree/Member/Auto property 03.fs.bsl new file mode 100644 index 00000000000..8cb8fe1d498 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Auto property 03.fs.bsl @@ -0,0 +1,70 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Auto property 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, + [AutoProperty + ([], false, P1, None, Member, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = Member }, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertySet }, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, + ArbitraryAfterError + ("typedSequentialExprBlock1", (4,19--4,19)), + (4,4--4,19), + { LeadingKeyword = + MemberVal ((4,4--4,10), (4,11--4,14)) + WithKeyword = None + EqualsRange = Some (4,18--4,19) + GetSetKeywords = None }); + AutoProperty + ([], false, P2, None, Member, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = Member }, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertySet }, + PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), + None, Const (Int32 2, (5,20--5,21)), (5,4--5,21), + { LeadingKeyword = + MemberVal ((5,4--5,10), (5,11--5,14)) + WithKeyword = None + EqualsRange = Some (5,18--5,19) + GetSetKeywords = None })], (4,4--5,21)), [], None, + (3,5--5,21), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--5,21)); + 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 [])) + +(5,4)-(5,10) 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. +(5,4)-(5,10) parse error Expecting expression diff --git a/tests/service/data/SyntaxTree/Member/Auto property 04.fs b/tests/service/data/SyntaxTree/Member/Auto property 04.fs new file mode 100644 index 00000000000..3f5c3891413 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Auto property 04.fs @@ -0,0 +1,7 @@ +module Module + +type T = + member val P1 + member val P2 = 2 + +() diff --git a/tests/service/data/SyntaxTree/Member/Auto property 04.fs.bsl b/tests/service/data/SyntaxTree/Member/Auto property 04.fs.bsl new file mode 100644 index 00000000000..9497c483352 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Auto property 04.fs.bsl @@ -0,0 +1,65 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Auto property 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, + [AutoProperty + ([], false, P1, None, Member, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = Member }, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertySet }, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, ArbitraryAfterError ("autoProp2", (4,17--4,17)), + (4,4--4,17), + { LeadingKeyword = + MemberVal ((4,4--4,10), (4,11--4,14)) + WithKeyword = None + EqualsRange = None + GetSetKeywords = None }); + AutoProperty + ([], false, P2, None, Member, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = Member }, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertySet }, + PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), + None, Const (Int32 2, (5,20--5,21)), (5,4--5,21), + { LeadingKeyword = + MemberVal ((5,4--5,10), (5,11--5,14)) + WithKeyword = None + EqualsRange = Some (5,18--5,19) + GetSetKeywords = None })], (4,4--5,21)), [], None, + (3,5--5,21), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--5,21)); + 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/Member/Auto property 05.fs b/tests/service/data/SyntaxTree/Member/Auto property 05.fs new file mode 100644 index 00000000000..7263c623d32 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Auto property 05.fs @@ -0,0 +1,7 @@ +module Module + +type T = + member val + member val P2 = 2 + +() diff --git a/tests/service/data/SyntaxTree/Member/Auto property 05.fs.bsl b/tests/service/data/SyntaxTree/Member/Auto property 05.fs.bsl new file mode 100644 index 00000000000..84a9f629f6e --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Auto property 05.fs.bsl @@ -0,0 +1,67 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Auto property 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, + [AutoProperty + ([], false, , None, Member, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = Member }, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertySet }, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, ArbitraryAfterError ("autoProp3", (4,14--4,14)), + (4,4--4,14), + { LeadingKeyword = + MemberVal ((4,4--4,10), (4,11--4,14)) + WithKeyword = None + EqualsRange = None + GetSetKeywords = None }); + AutoProperty + ([], false, P2, None, Member, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = Member }, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertySet }, + PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), + None, Const (Int32 2, (5,20--5,21)), (5,4--5,21), + { LeadingKeyword = + MemberVal ((5,4--5,10), (5,11--5,14)) + WithKeyword = None + EqualsRange = Some (5,18--5,19) + GetSetKeywords = None })], (4,4--5,21)), [], None, + (3,5--5,21), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--5,21)); + 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 [])) + +(4,15)-(5,4) parse error Incomplete structured construct at or before this point in member definition. Expected identifier or other token. diff --git a/tests/service/data/SyntaxTree/Member/Auto property 06.fs b/tests/service/data/SyntaxTree/Member/Auto property 06.fs new file mode 100644 index 00000000000..1cdbab7e476 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Auto property 06.fs @@ -0,0 +1,6 @@ +module Module + +type T = + member val P: = 1 + +() diff --git a/tests/service/data/SyntaxTree/Member/Auto property 06.fs.bsl b/tests/service/data/SyntaxTree/Member/Auto property 06.fs.bsl new file mode 100644 index 00000000000..50d5378bf80 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Auto property 06.fs.bsl @@ -0,0 +1,45 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Auto property 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, + [AutoProperty + ([], false, P, Some (FromParseError (4,17--4,17)), + Member, { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = Member }, + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertySet }, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, Const (Int32 1, (4,20--4,21)), (4,4--4,21), + { LeadingKeyword = + MemberVal ((4,4--4,10), (4,11--4,14)) + WithKeyword = None + EqualsRange = Some (4,18--4,19) + GetSetKeywords = None })], (4,4--4,21)), [], None, + (3,5--4,21), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--4,21)); + Expr (Const (Unit, (6,0--6,2)), (6,0--6,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(4,18)-(4,19) parse error Unexpected symbol '=' in member definition diff --git a/tests/service/data/SyntaxTree/Member/Field 01.fs b/tests/service/data/SyntaxTree/Member/Field 01.fs new file mode 100644 index 00000000000..094e0c75c0a --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 01.fs @@ -0,0 +1,4 @@ +module Module + +type T = + val F1: int diff --git a/tests/service/data/SyntaxTree/Member/Field 01.fs.bsl b/tests/service/data/SyntaxTree/Member/Field 01.fs.bsl new file mode 100644 index 00000000000..19453574e0a --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 01.fs.bsl @@ -0,0 +1,28 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Field 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, + [ValField + (SynField + ([], false, Some F1, + LongIdent (SynLongIdent ([int], [], [None])), false, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, (4,8--4,15), + { LeadingKeyword = Some (Val (4,4--4,7)) }), + (4,4--4,15))], (4,4--4,15)), [], None, (3,5--4,15), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--4,15))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--4,15), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Member/Field 02.fs b/tests/service/data/SyntaxTree/Member/Field 02.fs new file mode 100644 index 00000000000..7e522ba2457 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 02.fs @@ -0,0 +1,7 @@ +module Module + +type T = + val F1: + val F2: int + +() diff --git a/tests/service/data/SyntaxTree/Member/Field 02.fs.bsl b/tests/service/data/SyntaxTree/Member/Field 02.fs.bsl new file mode 100644 index 00000000000..fff1abdc078 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 02.fs.bsl @@ -0,0 +1,39 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Field 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 + (Unspecified, + [ValField + (SynField + ([], false, Some F1, FromParseError (4,11--4,11), + false, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, (4,8--5,4), + { LeadingKeyword = Some (Val (4,4--4,7)) }), + (4,4--4,11)); + ValField + (SynField + ([], false, Some F2, + LongIdent (SynLongIdent ([int], [], [None])), false, + PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), + None, (5,8--5,15), + { LeadingKeyword = Some (Val (5,4--5,7)) }), + (5,4--5,15))], (4,4--5,15)), [], None, (3,5--5,15), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--5,15)); + 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 [])) + +(4,12)-(5,4) parse error Incomplete structured construct at or before this point in type definition diff --git a/tests/service/data/SyntaxTree/Member/Field 03.fs b/tests/service/data/SyntaxTree/Member/Field 03.fs new file mode 100644 index 00000000000..9e2e5dccd78 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 03.fs @@ -0,0 +1,7 @@ +module Module + +type T = + val F1 + val F2: int + +() diff --git a/tests/service/data/SyntaxTree/Member/Field 03.fs.bsl b/tests/service/data/SyntaxTree/Member/Field 03.fs.bsl new file mode 100644 index 00000000000..de49a40d0ab --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 03.fs.bsl @@ -0,0 +1,38 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Field 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, + [ValField + (SynField + ([], false, Some F1, FromParseError (5,4--5,4), false, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, (4,8--134217728,0), + { LeadingKeyword = Some (Val (4,4--4,7)) }), + (4,4--5,4)); + ValField + (SynField + ([], false, Some F2, + LongIdent (SynLongIdent ([int], [], [None])), false, + PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), + None, (5,8--5,15), + { LeadingKeyword = Some (Val (5,4--5,7)) }), + (5,4--5,15))], (4,4--5,15)), [], None, (3,5--5,15), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--5,15)); + 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 [])) + +(4,11)-(5,4) parse error Incomplete structured construct at or before this point in type definition. Expected ':' or other token. diff --git a/tests/service/data/SyntaxTree/Member/Field 04.fs b/tests/service/data/SyntaxTree/Member/Field 04.fs new file mode 100644 index 00000000000..eb8014c2b4b --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 04.fs @@ -0,0 +1,7 @@ +module Module + +type T = + val + val F2: int + +() diff --git a/tests/service/data/SyntaxTree/Member/Field 04.fs.bsl b/tests/service/data/SyntaxTree/Member/Field 04.fs.bsl new file mode 100644 index 00000000000..17a1c250067 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 04.fs.bsl @@ -0,0 +1,38 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Field 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, + [ValField + (SynField + ([], false, Some , FromParseError (1,13--1,13), false, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, (4,8--134217728,0), + { LeadingKeyword = Some (Val (4,4--4,7)) }), + (1,13--4,7)); + ValField + (SynField + ([], false, Some F2, + LongIdent (SynLongIdent ([int], [], [None])), false, + PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), + None, (5,8--5,15), + { LeadingKeyword = Some (Val (5,4--5,7)) }), + (5,4--5,15))], (1,13--5,15)), [], None, (1,13--5,15), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (1,13--5,15)); + 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 [])) + +(4,8)-(5,4) parse error Incomplete structured construct at or before this point in type definition. Expected identifier or other token. diff --git a/tests/service/data/SyntaxTree/Member/Field 05.fs b/tests/service/data/SyntaxTree/Member/Field 05.fs new file mode 100644 index 00000000000..c71a0ae2196 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 05.fs @@ -0,0 +1,6 @@ +module Module + +type T = + val F: + +() diff --git a/tests/service/data/SyntaxTree/Member/Field 05.fs.bsl b/tests/service/data/SyntaxTree/Member/Field 05.fs.bsl new file mode 100644 index 00000000000..e5485cf278c --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 05.fs.bsl @@ -0,0 +1,31 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Field 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, + [ValField + (SynField + ([], false, Some F, FromParseError (4,10--4,10), + false, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, (4,8--6,1), + { LeadingKeyword = Some (Val (4,4--4,7)) }), + (4,4--4,10))], (4,4--4,10)), [], None, (3,5--4,10), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--4,10)); + Expr (Const (Unit, (6,0--6,2)), (6,0--6,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(6,0)-(6,1) parse error Incomplete structured construct at or before this point in type definition diff --git a/tests/service/data/SyntaxTree/Member/Field 06.fs b/tests/service/data/SyntaxTree/Member/Field 06.fs new file mode 100644 index 00000000000..996a61d5198 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 06.fs @@ -0,0 +1,6 @@ +module Module + +type T = + val F + +() diff --git a/tests/service/data/SyntaxTree/Member/Field 06.fs.bsl b/tests/service/data/SyntaxTree/Member/Field 06.fs.bsl new file mode 100644 index 00000000000..066a055a8da --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 06.fs.bsl @@ -0,0 +1,30 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Field 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, + [ValField + (SynField + ([], false, Some F, FromParseError (6,1--6,1), false, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, (4,8--134217728,0), + { LeadingKeyword = Some (Val (4,4--4,7)) }), + (4,4--6,1))], (4,4--6,1)), [], None, (3,5--6,1), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--6,1)); + Expr (Const (Unit, (6,0--6,2)), (6,0--6,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(6,0)-(6,1) parse error Incomplete structured construct at or before this point in type definition. Expected ':' or other token. diff --git a/tests/service/data/SyntaxTree/Member/Field 07.fs b/tests/service/data/SyntaxTree/Member/Field 07.fs new file mode 100644 index 00000000000..8160662eb49 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 07.fs @@ -0,0 +1,6 @@ +module Module + +type T = + val + +() diff --git a/tests/service/data/SyntaxTree/Member/Field 07.fs.bsl b/tests/service/data/SyntaxTree/Member/Field 07.fs.bsl new file mode 100644 index 00000000000..f86322e7ed2 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 07.fs.bsl @@ -0,0 +1,30 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Field 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, + [ValField + (SynField + ([], false, Some , FromParseError (1,13--1,13), false, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, (6,0--134217728,0), + { LeadingKeyword = Some (Val (4,4--4,7)) }), + (1,13--4,7))], (1,13--4,7)), [], None, (1,13--4,7), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (1,13--4,7)); + Expr (Const (Unit, (6,0--6,2)), (6,0--6,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(6,0)-(6,1) parse error Incomplete structured construct at or before this point in type definition. Expected identifier or other token. diff --git a/tests/service/data/SyntaxTree/Member/Field 08.fs b/tests/service/data/SyntaxTree/Member/Field 08.fs new file mode 100644 index 00000000000..2fd70083f8e --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 08.fs @@ -0,0 +1,8 @@ +module Module + +type T = + struct + val + end + +() diff --git a/tests/service/data/SyntaxTree/Member/Field 08.fs.bsl b/tests/service/data/SyntaxTree/Member/Field 08.fs.bsl new file mode 100644 index 00000000000..000f2c63128 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 08.fs.bsl @@ -0,0 +1,30 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Field 08.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 + (Struct, + [ValField + (SynField + ([], false, Some , FromParseError (1,13--1,13), false, + PreXmlDoc ((5,8), FSharp.Compiler.Xml.XmlDocCollector), + None, (6,4--134217728,0), + { LeadingKeyword = Some (Val (5,8--5,11)) }), + (1,13--5,11))], (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 [])) + +(6,4)-(6,7) parse error Unexpected keyword 'end' in member definition. Expected identifier or other token. diff --git a/tests/service/data/SyntaxTree/Member/Field 09.fs b/tests/service/data/SyntaxTree/Member/Field 09.fs new file mode 100644 index 00000000000..3ca7130b5ca --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 09.fs @@ -0,0 +1,6 @@ +module Module + +type T = + static val + +() diff --git a/tests/service/data/SyntaxTree/Member/Field 09.fs.bsl b/tests/service/data/SyntaxTree/Member/Field 09.fs.bsl new file mode 100644 index 00000000000..22f89b87864 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Field 09.fs.bsl @@ -0,0 +1,31 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Field 09.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, + [ValField + (SynField + ([], true, Some , FromParseError (1,13--1,13), false, + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, (6,0--134217728,0), + { LeadingKeyword = + Some (StaticVal ((4,4--4,10), (4,11--4,14))) }), + (1,13--4,10))], (1,13--4,10)), [], None, (1,13--4,10), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (1,13--4,10)); + Expr (Const (Unit, (6,0--6,2)), (6,0--6,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(6,0)-(6,1) parse error Incomplete structured construct at or before this point in type definition. Expected identifier or other token. From ae5e5fdc417a5ef3059f65e01608a28429716a07 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Mon, 26 Jun 2023 15:32:32 +0200 Subject: [PATCH 4/7] Parser: recover on unfinished constructors (#15440) * Parser: recover on unfinished 'as' in constructors * Update baselines * Update baselines * More tests * Update baselines --- src/Compiler/pars.fsy | 119 ++++++++++++++++-- .../CompilerOptions/fsc/codepage/codepage.fs | 2 - .../OffsideExceptions/OffsideExceptions.fs | 6 + tests/fsharp/typecheck/sigs/neg69.vsbsl | 3 + .../AsDeclarations/SanityCheck02.fs | 2 +- tests/service/data/SyntaxTree/Type/As 01.fs | 3 + .../service/data/SyntaxTree/Type/As 01.fs.bsl | 30 +++++ tests/service/data/SyntaxTree/Type/As 02.fs | 3 + .../service/data/SyntaxTree/Type/As 02.fs.bsl | 32 +++++ tests/service/data/SyntaxTree/Type/As 03.fs | 3 + .../service/data/SyntaxTree/Type/As 03.fs.bsl | 21 ++++ tests/service/data/SyntaxTree/Type/As 04.fs | 3 + .../service/data/SyntaxTree/Type/As 04.fs.bsl | 21 ++++ tests/service/data/SyntaxTree/Type/As 05.fs | 3 + .../service/data/SyntaxTree/Type/As 05.fs.bsl | 25 ++++ tests/service/data/SyntaxTree/Type/As 06.fs | 3 + .../service/data/SyntaxTree/Type/As 06.fs.bsl | 25 ++++ tests/service/data/SyntaxTree/Type/As 07.fs | 5 + .../service/data/SyntaxTree/Type/As 07.fs.bsl | 26 ++++ tests/service/data/SyntaxTree/Type/As 08.fs | 5 + .../service/data/SyntaxTree/Type/As 08.fs.bsl | 25 ++++ .../data/SyntaxTree/Type/Primary ctor 01.fs | 3 + .../SyntaxTree/Type/Primary ctor 01.fs.bsl | 29 +++++ .../data/SyntaxTree/Type/Primary ctor 02.fs | 5 + .../SyntaxTree/Type/Primary ctor 02.fs.bsl | 32 +++++ .../data/SyntaxTree/Type/Primary ctor 03.fs | 5 + .../SyntaxTree/Type/Primary ctor 03.fs.bsl | 26 ++++ .../data/SyntaxTree/Type/Primary ctor 04.fs | 3 + .../SyntaxTree/Type/Primary ctor 04.fs.bsl | 32 +++++ .../data/SyntaxTree/Type/Primary ctor 05.fs | 3 + .../SyntaxTree/Type/Primary ctor 05.fs.bsl | 25 ++++ tests/service/data/SyntaxTree/Type/Type 08.fs | 6 + .../data/SyntaxTree/Type/Type 08.fs.bsl | 27 ++++ tests/service/data/SyntaxTree/Type/Type 09.fs | 6 + .../data/SyntaxTree/Type/Type 09.fs.bsl | 29 +++++ tests/service/data/SyntaxTree/Type/Type 10.fs | 9 ++ .../data/SyntaxTree/Type/Type 10.fs.bsl | 56 +++++++++ 37 files changed, 649 insertions(+), 12 deletions(-) create mode 100644 tests/service/data/SyntaxTree/Type/As 01.fs create mode 100644 tests/service/data/SyntaxTree/Type/As 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/As 02.fs create mode 100644 tests/service/data/SyntaxTree/Type/As 02.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/As 03.fs create mode 100644 tests/service/data/SyntaxTree/Type/As 03.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/As 04.fs create mode 100644 tests/service/data/SyntaxTree/Type/As 04.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/As 05.fs create mode 100644 tests/service/data/SyntaxTree/Type/As 05.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/As 06.fs create mode 100644 tests/service/data/SyntaxTree/Type/As 06.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/As 07.fs create mode 100644 tests/service/data/SyntaxTree/Type/As 07.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/As 08.fs create mode 100644 tests/service/data/SyntaxTree/Type/As 08.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Primary ctor 01.fs create mode 100644 tests/service/data/SyntaxTree/Type/Primary ctor 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Primary ctor 02.fs create mode 100644 tests/service/data/SyntaxTree/Type/Primary ctor 02.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Primary ctor 03.fs create mode 100644 tests/service/data/SyntaxTree/Type/Primary ctor 03.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Primary ctor 04.fs create mode 100644 tests/service/data/SyntaxTree/Type/Primary ctor 04.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Primary ctor 05.fs create mode 100644 tests/service/data/SyntaxTree/Type/Primary ctor 05.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Type 08.fs create mode 100644 tests/service/data/SyntaxTree/Type/Type 08.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Type 09.fs create mode 100644 tests/service/data/SyntaxTree/Type/Type 09.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Type 10.fs create mode 100644 tests/service/data/SyntaxTree/Type/Type 10.fs.bsl diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index ee708ba8f51..ce2727e7a89 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -1613,27 +1613,79 @@ tyconDefn: let trivia: SynTypeDefnTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = None; WithKeyword = None } SynTypeDefn($1, SynTypeDefnRepr.ObjectModel(SynTypeDefnKind.Augmentation mWithKwd, [], m), classDefns, None, m, trivia) } - | typeNameInfo opt_attributes opt_access opt_HIGH_PRECEDENCE_APP simplePatterns optAsSpec EQUALS tyconDefnRhsBlock + | typeNameInfo opt_attributes opt_access opt_HIGH_PRECEDENCE_APP opt_simplePatterns optAsSpec EQUALS tyconDefnRhsBlock { let vis, spats, az = $3, $5, $6 let nameRange = rhs parseState 1 let (tcDefRepr, mWith, members) = $8 nameRange let (SynComponentInfo(_, _, _, lid, _, _, _, _)) = $1 let mEquals = rhs parseState 7 + // Gets the XML doc comments prior to the implicit constructor - let xmlDoc = grabXmlDoc(parseState, $2, 2) + let xmlDoc = grabXmlDoc (parseState, $2, 2) + 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 memberCtorPattern = + spats |> Option.map (fun spats -> + SynMemberDefn.ImplicitCtor(vis, $2, spats, Option.bind 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) - | _ -> reportParseErrorAt (rhs2 parseState 1 5) (FSComp.SR.parsOnlyClassCanTakeValueArguments()); tcDefRepr + match tcDefRepr, memberCtorPattern with + | 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) -> + reportParseErrorAt (rhs parseState 6) (FSComp.SR.tcLetAndDoRequiresImplicitConstructionSequence ()) + | _ -> () + + tcDefRepr + let declRange = unionRanges (rhs parseState 1) tcDefRepr.Range let mWhole = (declRange, members) ||> unionRangeWithListBy (fun (mem: SynMemberDefn) -> mem.Range) |> unionRangeWithXmlDoc xmlDoc + fun leadingKeyword -> let trivia: SynTypeDefnTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = Some mEquals; WithKeyword = mWith } - SynTypeDefn($1, tcDefRepr, members, Some memberCtorPattern, mWhole, trivia) } + SynTypeDefn($1, tcDefRepr, members, memberCtorPattern, mWhole, trivia) } + + | typeNameInfo opt_attributes opt_access opt_HIGH_PRECEDENCE_APP opt_simplePatterns optAsSpec recover + { let vis, spats, az = $3, $5, $6 + let (SynComponentInfo(longId = lid)) = $1 + // Gets the XML doc comments prior to the implicit constructor + let xmlDoc = grabXmlDoc (parseState, $2, 2) + let m = match lid with [] -> rhs parseState 1 | _ -> rangeOfLid lid + let mName = $1.Range + let members, mWhole = + match spats, vis, az with + | Some spats, _, _ -> + let memberCtorPattern = SynMemberDefn.ImplicitCtor(vis, $2, spats, Option.bind snd az, xmlDoc, m, { AsKeyword = Option.map fst az }) + [memberCtorPattern], unionRanges mName memberCtorPattern.Range + + | _, _, Some(mAs, asId) -> + let mAs = + asId |> Option.map (fun id -> + reportParseErrorAt (rhs parseState 6) (FSComp.SR.tcLetAndDoRequiresImplicitConstructionSequence ()) + id.idRange + ) + |> Option.defaultValue mAs + + [], unionRanges mName mAs + + | _, Some vis, _ -> + [], unionRanges mName vis.Range + + | _ -> + [], mName + + fun leadingKeyword -> + let trivia = { SynTypeDefnTrivia.Zero with LeadingKeyword = leadingKeyword } + SynTypeDefn($1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None(mName), mName), members, None, mName, trivia) } /* The right-hand-side of a type definition */ @@ -2005,7 +2057,7 @@ classDefnMember: let m = unionRanges mWholeBindLhs $7.Range |> unionRangeWithXmlDoc xmlDoc let mEquals = rhs parseState 6 let expr = $7 - let valSynData = SynValData (Some CtorMemberFlags, SynValInfo([SynInfo.InferSynArgInfoFromPat $4], SynInfo.unnamedRetVal), Option.map snd $5) + let valSynData = SynValData (Some CtorMemberFlags, SynValInfo([SynInfo.InferSynArgInfoFromPat $4], SynInfo.unnamedRetVal), Option.bind snd $5) let vis = $2 let declPat = SynPat.LongIdent(SynLongIdent([mkSynId (rhs parseState 3) "new"], [], [None]), None, Some noInferredTypars, SynArgPats.Pats [$4], vis, rhs parseState 3) // Check that 'SynPatForConstructorDecl' matches this correctly @@ -2013,6 +2065,46 @@ classDefnMember: let synBindingTrivia: SynBindingTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; InlineKeyword = None; EqualsRange = Some mEquals } [ SynMemberDefn.Member(SynBinding (None, SynBindingKind.Normal, false, false, $1, xmlDoc, valSynData, declPat, None, expr, mWholeBindLhs, DebugPointAtBinding.NoneAtInvisible, synBindingTrivia), m) ] } + | opt_attributes opt_access NEW atomicPattern optAsSpec ends_coming_soon_or_recover + { if not $6 then reportParseErrorAt (rhs parseState 6) (FSComp.SR.parsMissingMemberBody ()) + let mNew = rhs parseState 3 + let mAs = $5 |> Option.map (fun (mAs, id) -> id |> Option.map (fun id -> id.idRange) |> Option.defaultValue mAs) + let mEnd = mAs |> Option.defaultValue $4.Range + let xmlDoc = grabXmlDoc (parseState, $1, 1) + let m = unionRanges (rhs parseState 1) mEnd |> unionRangeWithXmlDoc xmlDoc + let expr = arbExpr ("new1", mEnd.EndRange) + let valSynData = SynValData (Some CtorMemberFlags, SynValInfo([SynInfo.InferSynArgInfoFromPat $4], SynInfo.unnamedRetVal), Option.bind snd $5) + let declPat = SynPat.LongIdent(SynLongIdent([mkSynId (rhs parseState 3) "new"], [], [None]), None, Some noInferredTypars, SynArgPats.Pats [$4], $2, rhs parseState 3) + assert (match declPat with SynPatForConstructorDecl _ -> true | _ -> false) + let synBindingTrivia: SynBindingTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; InlineKeyword = None; EqualsRange = None } + [ SynMemberDefn.Member(SynBinding(None, SynBindingKind.Normal, false, false, $1, xmlDoc, valSynData, declPat, None, expr, m, DebugPointAtBinding.NoneAtInvisible, synBindingTrivia), m) ] } + + | opt_attributes opt_access NEW atomicPattern optAsSpec OBLOCKSEP + { reportParseErrorAt (rhs parseState 5) (FSComp.SR.parsMissingMemberBody ()) + let mNew = rhs parseState 3 + let mAs = $5 |> Option.map (fun (mAs, id) -> id |> Option.map (fun id -> id.idRange) |> Option.defaultValue mAs) + let mEnd = mAs |> Option.defaultValue $4.Range + let xmlDoc = grabXmlDoc (parseState, $1, 1) + let m = unionRanges (rhs parseState 1) mEnd |> unionRangeWithXmlDoc xmlDoc + let expr = arbExpr ("new2", mEnd.EndRange) + let valSynData = SynValData(Some CtorMemberFlags, SynValInfo([SynInfo.InferSynArgInfoFromPat $4], SynInfo.unnamedRetVal), Option.bind snd $5) + let declPat = SynPat.LongIdent(SynLongIdent([mkSynId (rhs parseState 3) "new"], [], [None]), None, Some noInferredTypars, SynArgPats.Pats [$4], $2, rhs parseState 3) + assert (match declPat with SynPatForConstructorDecl _ -> true | _ -> false) + let synBindingTrivia: SynBindingTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; InlineKeyword = None; EqualsRange = None } + [ SynMemberDefn.Member(SynBinding (None, SynBindingKind.Normal, false, false, $1, xmlDoc, valSynData, declPat, None, expr, m, DebugPointAtBinding.NoneAtInvisible, synBindingTrivia), m) ] } + + | opt_attributes opt_access NEW recover opt_OBLOCKSEP + { let m = rhs2 parseState 1 3 + let mNew = rhs parseState 3 + let xmlDoc = grabXmlDoc (parseState, $1, 1) + let pat = patFromParseError (SynPat.Wild(mNew.EndRange)) + let expr = arbExpr ("new3", mNew.EndRange) + let valSynData = SynValData(Some CtorMemberFlags, SynValInfo([SynInfo.InferSynArgInfoFromPat pat], SynInfo.unnamedRetVal), None) + let vis = $2 + let declPat = SynPat.LongIdent(SynLongIdent([mkSynId (rhs parseState 3) "new"], [], [None]), None, Some noInferredTypars, SynArgPats.Pats [pat], vis, rhs parseState 3) + let synBindingTrivia: SynBindingTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; InlineKeyword = None; EqualsRange = None } + [ SynMemberDefn.Member(SynBinding(None, SynBindingKind.Normal, false, false, $1, xmlDoc, valSynData, declPat, None, expr, m, DebugPointAtBinding.NoneAtInvisible, synBindingTrivia), m) ] } + | opt_attributes opt_access STATIC typeKeyword tyconDefn { if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) let leadingKeyword = SynTypeDefnLeadingKeyword.StaticType(rhs parseState 3, rhs parseState 4) @@ -2217,7 +2309,10 @@ optAsSpec: asSpec: | AS ident - { rhs parseState 1, $2 } + { rhs parseState 1, Some $2 } + + | AS recover + { rhs parseState 1, None } optBaseSpec: | baseSpec @@ -3254,6 +3349,12 @@ simplePatternCommaList: | SynPat.Tuple(_, pats, commas, _) -> SynPat.Tuple(false, $1 :: pats, mComma :: commas, rhs2 parseState 1 3) | _ -> SynPat.Tuple(false, [$1; $3], [mComma], rhs2 parseState 1 3) } +opt_simplePatterns: + | simplePatterns + { Some $1 } + + | { None } + simplePatterns: | LPAREN simplePatternCommaList rparen { let parenPat = SynPat.Paren($2, rhs2 parseState 1 3) diff --git a/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/codepage/codepage.fs b/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/codepage/codepage.fs index c62bb9958ab..536083be938 100644 --- a/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/codepage/codepage.fs +++ b/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/codepage/codepage.fs @@ -202,6 +202,4 @@ Parameter name: codepage") |> shouldFail |> withDiagnostics [ (Error 10, Line 7, Col 10, Line 7, Col 11, "Unexpected character '�' in type name") - (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.") ] diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/OffsideExceptions.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/OffsideExceptions.fs index c032a5bc19a..bfd20903018 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/OffsideExceptions.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/OffsideExceptions.fs @@ -474,6 +474,12 @@ raise (new Exception("exit 1")) EndColumn = 40 } Message = "Unexpected end of quotation in expression. Expected incomplete structured construct at or before this point or other token." } + { Error = Error 3567 + Range = { StartLine = 5 + StartColumn = 30 + EndLine = 5 + EndColumn = 31 } + Message = "Expecting member body" } ] |> ignore [] diff --git a/tests/fsharp/typecheck/sigs/neg69.vsbsl b/tests/fsharp/typecheck/sigs/neg69.vsbsl index 7c5c0a5fecb..57f0efa65c3 100644 --- a/tests/fsharp/typecheck/sigs/neg69.vsbsl +++ b/tests/fsharp/typecheck/sigs/neg69.vsbsl @@ -1,3 +1,6 @@ +neg69.fsx(87,6,87,12): typecheck error FS0912: This declaration element is not permitted in an augmentation + +neg69.fsx(87,6,87,12): typecheck error FS0929: This type requires a definition neg69.fsx(88,43,88,44): parse error FS1241: Expected type argument or static argument diff --git a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/AsDeclarations/SanityCheck02.fs b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/AsDeclarations/SanityCheck02.fs index c45c452af92..c5eb12289d8 100644 --- a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/AsDeclarations/SanityCheck02.fs +++ b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/AsDeclarations/SanityCheck02.fs @@ -5,7 +5,7 @@ // Verify error when using 'as' to get a thisPointer when you don't have an // implicit constructor. -//Unexpected keyword 'as' in type definition\. Expected '\(' or other token +//This definition may only be used in a type with a primary constructor\. Consider adding arguments to your type definition, e\.g\. 'type X\(args\) = \.\.\.'\. type Point as otherThisPtr = diff --git a/tests/service/data/SyntaxTree/Type/As 01.fs b/tests/service/data/SyntaxTree/Type/As 01.fs new file mode 100644 index 00000000000..fd99b59e220 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 01.fs @@ -0,0 +1,3 @@ +module Module + +type T() as this = class end diff --git a/tests/service/data/SyntaxTree/Type/As 01.fs.bsl b/tests/service/data/SyntaxTree/Type/As 01.fs.bsl new file mode 100644 index 00000000000..84f8bb3c3a7 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 01.fs.bsl @@ -0,0 +1,30 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/As 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, + [ImplicitCtor + (None, [], SimplePats ([], [], (3,6--3,8)), Some this, + PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = Some (3,9--3,11) })], + (3,19--3,28)), [], + Some + (ImplicitCtor + (None, [], SimplePats ([], [], (3,6--3,8)), Some this, + PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = Some (3,9--3,11) })), + (3,5--3,28), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,17--3,18) + WithKeyword = None })], (3,0--3,28))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,28), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/As 02.fs b/tests/service/data/SyntaxTree/Type/As 02.fs new file mode 100644 index 00000000000..57b7d8e70f1 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 02.fs @@ -0,0 +1,3 @@ +module Module + +type T() as = class end diff --git a/tests/service/data/SyntaxTree/Type/As 02.fs.bsl b/tests/service/data/SyntaxTree/Type/As 02.fs.bsl new file mode 100644 index 00000000000..b1a6a433c9c --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 02.fs.bsl @@ -0,0 +1,32 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/As 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, + [ImplicitCtor + (None, [], SimplePats ([], [], (3,6--3,8)), None, + PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = Some (3,9--3,11) })], + (3,14--3,23)), [], + Some + (ImplicitCtor + (None, [], SimplePats ([], [], (3,6--3,8)), None, + PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = Some (3,9--3,11) })), + (3,5--3,23), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,12--3,13) + WithKeyword = None })], (3,0--3,23))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,23), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,12)-(3,13) parse error Unexpected symbol '=' in type definition. Expected identifier or other token. diff --git a/tests/service/data/SyntaxTree/Type/As 03.fs b/tests/service/data/SyntaxTree/Type/As 03.fs new file mode 100644 index 00000000000..f88b58749b2 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 03.fs @@ -0,0 +1,3 @@ +module Module + +type T as this = class end diff --git a/tests/service/data/SyntaxTree/Type/As 03.fs.bsl b/tests/service/data/SyntaxTree/Type/As 03.fs.bsl new file mode 100644 index 00000000000..42c054e0dbf --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 03.fs.bsl @@ -0,0 +1,21 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/As 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, [], (3,17--3,26)), [], None, (3,5--3,26), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,15--3,16) + WithKeyword = None })], (3,0--3,26))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,26), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,7)-(3,14) parse error This definition may only be used in a type with a primary constructor. Consider adding arguments to your type definition, e.g. 'type X(args) = ...'. diff --git a/tests/service/data/SyntaxTree/Type/As 04.fs b/tests/service/data/SyntaxTree/Type/As 04.fs new file mode 100644 index 00000000000..635b04df646 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 04.fs @@ -0,0 +1,3 @@ +module Module + +type T as = class end diff --git a/tests/service/data/SyntaxTree/Type/As 04.fs.bsl b/tests/service/data/SyntaxTree/Type/As 04.fs.bsl new file mode 100644 index 00000000000..82bef8fffce --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 04.fs.bsl @@ -0,0 +1,21 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/As 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, [], (3,12--3,21)), [], None, (3,5--3,21), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,10--3,11) + WithKeyword = None })], (3,0--3,21))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,21), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,10)-(3,11) parse error Unexpected symbol '=' in type definition. Expected identifier or other token. diff --git a/tests/service/data/SyntaxTree/Type/As 05.fs b/tests/service/data/SyntaxTree/Type/As 05.fs new file mode 100644 index 00000000000..7540c26d39a --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 05.fs @@ -0,0 +1,3 @@ +module Module + +type T() as this diff --git a/tests/service/data/SyntaxTree/Type/As 05.fs.bsl b/tests/service/data/SyntaxTree/Type/As 05.fs.bsl new file mode 100644 index 00000000000..8c216721fbb --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 05.fs.bsl @@ -0,0 +1,25 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/As 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)), + Simple (None (3,5--3,6), (3,5--3,6)), + [ImplicitCtor + (None, [], SimplePats ([], [], (3,6--3,8)), Some this, + PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = Some (3,9--3,11) })], 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 [])) + +(4,0)-(4,0) parse error Incomplete structured construct at or before this point in type definition. Expected '=' or other token. diff --git a/tests/service/data/SyntaxTree/Type/As 06.fs b/tests/service/data/SyntaxTree/Type/As 06.fs new file mode 100644 index 00000000000..0c1b5a3f083 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 06.fs @@ -0,0 +1,3 @@ +module Module + +type T() as diff --git a/tests/service/data/SyntaxTree/Type/As 06.fs.bsl b/tests/service/data/SyntaxTree/Type/As 06.fs.bsl new file mode 100644 index 00000000000..f7f827efbb1 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 06.fs.bsl @@ -0,0 +1,25 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/As 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)), + Simple (None (3,5--3,6), (3,5--3,6)), + [ImplicitCtor + (None, [], SimplePats ([], [], (3,6--3,8)), None, + PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = Some (3,9--3,11) })], 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 [])) + +(4,0)-(4,0) parse error Incomplete structured construct at or before this point in type definition. Expected identifier or other token. diff --git a/tests/service/data/SyntaxTree/Type/As 07.fs b/tests/service/data/SyntaxTree/Type/As 07.fs new file mode 100644 index 00000000000..3d31e235717 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 07.fs @@ -0,0 +1,5 @@ +module Module + +type T() as this + +() diff --git a/tests/service/data/SyntaxTree/Type/As 07.fs.bsl b/tests/service/data/SyntaxTree/Type/As 07.fs.bsl new file mode 100644 index 00000000000..59cc29788eb --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 07.fs.bsl @@ -0,0 +1,26 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/As 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)), + Simple (None (3,5--3,6), (3,5--3,6)), + [ImplicitCtor + (None, [], SimplePats ([], [], (3,6--3,8)), Some this, + PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = Some (3,9--3,11) })], None, + (3,5--3,6), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = None + WithKeyword = None })], (3,0--3,6)); + 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,17)-(5,0) parse error Incomplete structured construct at or before this point in type definition. Expected '=' or other token. diff --git a/tests/service/data/SyntaxTree/Type/As 08.fs b/tests/service/data/SyntaxTree/Type/As 08.fs new file mode 100644 index 00000000000..98c109124af --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 08.fs @@ -0,0 +1,5 @@ +module Module + +type T() as + +() diff --git a/tests/service/data/SyntaxTree/Type/As 08.fs.bsl b/tests/service/data/SyntaxTree/Type/As 08.fs.bsl new file mode 100644 index 00000000000..3894e1a4c18 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/As 08.fs.bsl @@ -0,0 +1,25 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/As 08.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 (None (3,5--3,6), (3,5--3,6)), + [ImplicitCtor + (None, [], SimplePats ([], [], (3,6--3,8)), None, + PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = Some (3,9--3,11) })], 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,12)-(5,0) parse error Incomplete structured construct at or before this point in type definition. Expected identifier or other token. diff --git a/tests/service/data/SyntaxTree/Type/Primary ctor 01.fs b/tests/service/data/SyntaxTree/Type/Primary ctor 01.fs new file mode 100644 index 00000000000..9006749b675 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Primary ctor 01.fs @@ -0,0 +1,3 @@ +module Module + +type T() = class end diff --git a/tests/service/data/SyntaxTree/Type/Primary ctor 01.fs.bsl b/tests/service/data/SyntaxTree/Type/Primary ctor 01.fs.bsl new file mode 100644 index 00000000000..24fbd4e7c8f --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Primary ctor 01.fs.bsl @@ -0,0 +1,29 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Primary ctor 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, + [ImplicitCtor + (None, [], SimplePats ([], [], (3,6--3,8)), None, + PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = None })], (3,11--3,20)), [], + 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,20), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,9--3,10) + WithKeyword = None })], (3,0--3,20))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,20), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs b/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs new file mode 100644 index 00000000000..f640106b52d --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs @@ -0,0 +1,5 @@ +module Module + +type T() = + +() diff --git a/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs.bsl b/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs.bsl new file mode 100644 index 00000000000..821925690b1 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs.bsl @@ -0,0 +1,32 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Primary ctor 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 + (Unspecified, + [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)), [], + 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), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,9--3,10) + WithKeyword = None })], (3,0--5,0)); + 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/Primary ctor 03.fs b/tests/service/data/SyntaxTree/Type/Primary ctor 03.fs new file mode 100644 index 00000000000..ca3da376735 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Primary ctor 03.fs @@ -0,0 +1,5 @@ +module Module + +type T() + +() diff --git a/tests/service/data/SyntaxTree/Type/Primary ctor 03.fs.bsl b/tests/service/data/SyntaxTree/Type/Primary ctor 03.fs.bsl new file mode 100644 index 00000000000..882320fe29f --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Primary ctor 03.fs.bsl @@ -0,0 +1,26 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Primary ctor 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 (None (3,5--3,6), (3,5--3,6)), + [ImplicitCtor + (None, [], SimplePats ([], [], (3,6--3,8)), None, + PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = None })], None, (3,5--3,6), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = None + WithKeyword = None })], (3,0--3,6)); + 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,9)-(5,0) parse error Incomplete structured construct at or before this point in type definition. Expected '=' or other token. diff --git a/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs b/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs new file mode 100644 index 00000000000..6ee90e65f32 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs @@ -0,0 +1,3 @@ +module Module + +type T() = diff --git a/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs.bsl b/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs.bsl new file mode 100644 index 00000000000..8affb14690e --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs.bsl @@ -0,0 +1,32 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Primary ctor 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, + [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)), [], + 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), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,9--3,10) + WithKeyword = None })], (3,0--3,9))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,9), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(4,0)-(4,0) parse error Possible incorrect indentation: this token is offside of context started at position (3:1). Try indenting this token further or using standard formatting conventions. +(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/Primary ctor 05.fs b/tests/service/data/SyntaxTree/Type/Primary ctor 05.fs new file mode 100644 index 00000000000..ec04dfb9635 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Primary ctor 05.fs @@ -0,0 +1,3 @@ +module Module + +type T() diff --git a/tests/service/data/SyntaxTree/Type/Primary ctor 05.fs.bsl b/tests/service/data/SyntaxTree/Type/Primary ctor 05.fs.bsl new file mode 100644 index 00000000000..352346a2396 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Primary ctor 05.fs.bsl @@ -0,0 +1,25 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Primary ctor 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)), + Simple (None (3,5--3,6), (3,5--3,6)), + [ImplicitCtor + (None, [], SimplePats ([], [], (3,6--3,8)), None, + PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,6), { AsKeyword = None })], 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 [])) + +(4,0)-(4,0) parse error Incomplete structured construct at or before this point in type definition. Expected '=' or other token. diff --git a/tests/service/data/SyntaxTree/Type/Type 08.fs b/tests/service/data/SyntaxTree/Type/Type 08.fs new file mode 100644 index 00000000000..2484086ca11 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 08.fs @@ -0,0 +1,6 @@ +module Module + +type U = +| A + +2 diff --git a/tests/service/data/SyntaxTree/Type/Type 08.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 08.fs.bsl new file mode 100644 index 00000000000..fea4942c9fa --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 08.fs.bsl @@ -0,0 +1,27 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Type 08.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [U], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + Simple + (Union + (None, + [SynUnionCase + ([], SynIdent (A, None), Fields [], + PreXmlDoc ((4,0), FSharp.Compiler.Xml.XmlDocCollector), + None, (4,2--4,3), { BarRange = Some (4,0--4,1) })], + (4,0--4,3)), (4,0--4,3)), [], None, (3,5--4,3), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--4,3)); + Expr (Const (Int32 2, (6,0--6,1)), (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 [])) diff --git a/tests/service/data/SyntaxTree/Type/Type 09.fs b/tests/service/data/SyntaxTree/Type/Type 09.fs new file mode 100644 index 00000000000..d5a48d7a513 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 09.fs @@ -0,0 +1,6 @@ +module Module + +type U = +| + +2 diff --git a/tests/service/data/SyntaxTree/Type/Type 09.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 09.fs.bsl new file mode 100644 index 00000000000..c4361033429 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 09.fs.bsl @@ -0,0 +1,29 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Type 09.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [U], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + Simple + (Union + (None, + [SynUnionCase + ([], SynIdent (, None), Fields [], + PreXmlDoc ((4,0), FSharp.Compiler.Xml.XmlDocCollector), + None, (4,0--4,1), { BarRange = Some (4,0--4,1) })], + (4,0--4,1)), (4,0--4,1)), [], None, (3,5--4,1), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--4,1)); + Expr (Const (Int32 2, (6,0--6,1)), (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 [])) + +(6,0)-(6,1) parse error Incomplete structured construct at or before this point in union case diff --git a/tests/service/data/SyntaxTree/Type/Type 10.fs b/tests/service/data/SyntaxTree/Type/Type 10.fs new file mode 100644 index 00000000000..b7b29bc728e --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 10.fs @@ -0,0 +1,9 @@ +// #NoMT #CompilerOptions +#light + +namespace N + +module M = + type � = class + static member M() = 11 + end diff --git a/tests/service/data/SyntaxTree/Type/Type 10.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 10.fs.bsl new file mode 100644 index 00000000000..979759d4dbf --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 10.fs.bsl @@ -0,0 +1,56 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Type 10.fs", false, QualifiedNameOfFile Type 10, [], [], + [SynModuleOrNamespace + ([N], false, DeclaredNamespace, + [NestedModule + (SynComponentInfo + ([], None, [], [M], + PreXmlDoc ((6,0), FSharp.Compiler.Xml.XmlDocCollector), false, + None, (6,0--6,8)), false, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [], + PreXmlDoc ((7,4), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (7,9--7,10)), + ObjectModel + (Class, + [Member + (SynBinding + (None, Normal, false, false, [], + PreXmlDoc ((8,15), FSharp.Compiler.Xml.XmlDocCollector), + SynValData + (Some + { IsInstance = false + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = Member }, + SynValInfo + ([[]], SynArgInfo ([], false, None)), None), + LongIdent + (SynLongIdent ([M], [], [None]), None, None, + Pats + [Paren + (Const (Unit, (8,30--8,32)), + (8,30--8,32))], None, (8,29--8,32)), + None, Const (Int32 11, (8,35--8,37)), + (8,29--8,32), NoneAtInvisible, + { LeadingKeyword = + StaticMember ((8,15--8,21), (8,22--8,28)) + InlineKeyword = None + EqualsRange = Some (8,33--8,34) }), + (8,15--8,37))], (7,13--9,16)), [], None, + (7,9--9,16), { LeadingKeyword = Type (7,4--7,8) + EqualsRange = Some (7,11--7,12) + WithKeyword = None })], (7,4--9,16))], + false, (6,0--9,16), { ModuleKeyword = Some (6,0--6,6) + EqualsRange = Some (6,9--6,10) })], + PreXmlDocEmpty, [], None, (4,0--9,16), + { LeadingKeyword = Namespace (4,0--4,9) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [LineComment (1,0--1,25)] }, set [])) + +(7,9)-(7,10) parse error Unexpected character '�' in type name From 02b9e83060dbe465c11e11ab7995d2d0f8c27a28 Mon Sep 17 00:00:00 2001 From: Florian Verdonck Date: Mon, 26 Jun 2023 16:48:39 +0200 Subject: [PATCH 5/7] Add recovery rules for SynField. (#15475) --- src/Compiler/SyntaxTree/ParseHelpers.fs | 4 ++ src/Compiler/SyntaxTree/ParseHelpers.fsi | 12 +++++ src/Compiler/pars.fsy | 11 +++-- .../service/data/SyntaxTree/Type/Record 01.fs | 9 ++++ .../data/SyntaxTree/Type/Record 01.fs.bsl | 45 ++++++++++++++++++ .../service/data/SyntaxTree/Type/Record 02.fs | 9 ++++ .../data/SyntaxTree/Type/Record 02.fs.bsl | 46 +++++++++++++++++++ 7 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 tests/service/data/SyntaxTree/Type/Record 01.fs create mode 100644 tests/service/data/SyntaxTree/Type/Record 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Record 02.fs create mode 100644 tests/service/data/SyntaxTree/Type/Record 02.fs.bsl diff --git a/src/Compiler/SyntaxTree/ParseHelpers.fs b/src/Compiler/SyntaxTree/ParseHelpers.fs index 5ba4d87f795..0af284534ae 100644 --- a/src/Compiler/SyntaxTree/ParseHelpers.fs +++ b/src/Compiler/SyntaxTree/ParseHelpers.fs @@ -1145,3 +1145,7 @@ let mkValField mVal mRhs mut access ident (typ: SynType) xmlDoc rangeStart attri SynField(attribs, isStatic, Some ident, typ, mut, xmlDoc, access, mRhs, { LeadingKeyword = Some leadingKeyword }) SynMemberDefn.ValField(fld, mValDecl) + +let mkSynField parseState idOpt t isMutable vis attributes isStatic mWhole leadingKeyword = + let xmlDoc = grabXmlDocAtRangeStart (parseState, attributes, mWhole) + SynField(attributes, isStatic, idOpt, t, isMutable, xmlDoc, vis, mWhole, { LeadingKeyword = leadingKeyword }) diff --git a/src/Compiler/SyntaxTree/ParseHelpers.fsi b/src/Compiler/SyntaxTree/ParseHelpers.fsi index 5bcff5f26fa..1ec98ddabb0 100644 --- a/src/Compiler/SyntaxTree/ParseHelpers.fsi +++ b/src/Compiler/SyntaxTree/ParseHelpers.fsi @@ -274,3 +274,15 @@ val mkValField: SynAttributes -> range option -> SynMemberDefn + +val mkSynField: + parseState: IParseState -> + idOpt: Ident option -> + t: SynType -> + isMutable: bool -> + vis: SynAccess option -> + attributes: SynAttributeList list -> + isStatic: bool -> + mWhole: range -> + leadingKeyword: SynLeadingKeyword option -> + SynField diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index ce2727e7a89..46436e5c71b 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -2791,9 +2791,14 @@ recdFieldDecl: /* Part of a field or val declaration in a record type or object type */ fieldDecl: | opt_mutable opt_access ident COLON typ - { fun attrs stat mWhole leadingKeyword -> - let xmlDoc = grabXmlDocAtRangeStart(parseState, attrs, mWhole) - SynField(attrs, stat, Some $3, $5, $1, xmlDoc, $2, mWhole, { LeadingKeyword = leadingKeyword }) } + { mkSynField parseState (Some $3) $5 $1 $2 } + | opt_mutable opt_access ident COLON recover + { let mColon = rhs parseState 4 + let t = SynType.FromParseError(mColon.EndRange) + mkSynField parseState (Some $3) t $1 $2 } + | opt_mutable opt_access ident recover + { let t = SynType.FromParseError($3.idRange.EndRange) + mkSynField parseState (Some $3) t $1 $2 } /* An exception definition */ exconDefn: diff --git a/tests/service/data/SyntaxTree/Type/Record 01.fs b/tests/service/data/SyntaxTree/Type/Record 01.fs new file mode 100644 index 00000000000..417a2790467 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Record 01.fs @@ -0,0 +1,9 @@ +module Foo + +type AU = + { + Invest: int + T + } + +let meh = () diff --git a/tests/service/data/SyntaxTree/Type/Record 01.fs.bsl b/tests/service/data/SyntaxTree/Type/Record 01.fs.bsl new file mode 100644 index 00000000000..91d5f58ca56 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Record 01.fs.bsl @@ -0,0 +1,45 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Record 01.fs", false, QualifiedNameOfFile Foo, [], [], + [SynModuleOrNamespace + ([Foo], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [AU], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,7)), + Simple + (Record + (None, + [SynField + ([], false, Some Invest, + LongIdent (SynLongIdent ([int], [], [None])), false, + PreXmlDoc ((5,8), FSharp.Compiler.Xml.XmlDocCollector), + None, (5,8--5,19), { LeadingKeyword = None }); + SynField + ([], false, Some T, FromParseError (6,9--6,9), false, + PreXmlDoc ((6,8), FSharp.Compiler.Xml.XmlDocCollector), + None, (6,8--7,5), { LeadingKeyword = None })], + (4,4--7,5)), (4,4--7,5)), [], None, (3,5--7,5), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,8--3,9) + WithKeyword = None })], (3,0--7,5)); + Let + (false, + [SynBinding + (None, Normal, false, false, [], + PreXmlDoc ((9,0), FSharp.Compiler.Xml.XmlDocCollector), + SynValData + (None, SynValInfo ([], SynArgInfo ([], false, None)), None), + Named (SynIdent (meh, None), false, None, (9,4--9,7)), None, + Const (Unit, (9,10--9,12)), (9,4--9,7), Yes (9,0--9,12), + { LeadingKeyword = Let (9,0--9,3) + InlineKeyword = None + EqualsRange = Some (9,8--9,9) })], (9,0--9,12))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--9,12), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(7,4)-(7,5) parse error Unexpected symbol '}' in field declaration. Expected ':' or other token. diff --git a/tests/service/data/SyntaxTree/Type/Record 02.fs b/tests/service/data/SyntaxTree/Type/Record 02.fs new file mode 100644 index 00000000000..d42ab66e1f5 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Record 02.fs @@ -0,0 +1,9 @@ +module Foo + +type AU = + { + Invest: int + T : + } + +let meh = () diff --git a/tests/service/data/SyntaxTree/Type/Record 02.fs.bsl b/tests/service/data/SyntaxTree/Type/Record 02.fs.bsl new file mode 100644 index 00000000000..3ebdfe18ae4 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Record 02.fs.bsl @@ -0,0 +1,46 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Record 02.fs", false, QualifiedNameOfFile Foo, [], [], + [SynModuleOrNamespace + ([Foo], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [AU], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,7)), + Simple + (Record + (None, + [SynField + ([], false, Some Invest, + LongIdent (SynLongIdent ([int], [], [None])), false, + PreXmlDoc ((5,8), FSharp.Compiler.Xml.XmlDocCollector), + None, (5,8--5,19), { LeadingKeyword = None }); + SynField + ([], false, Some T, FromParseError (6,11--6,11), + false, + PreXmlDoc ((6,8), FSharp.Compiler.Xml.XmlDocCollector), + None, (6,8--7,5), { LeadingKeyword = None })], + (4,4--7,5)), (4,4--7,5)), [], None, (3,5--7,5), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,8--3,9) + WithKeyword = None })], (3,0--7,5)); + Let + (false, + [SynBinding + (None, Normal, false, false, [], + PreXmlDoc ((9,0), FSharp.Compiler.Xml.XmlDocCollector), + SynValData + (None, SynValInfo ([], SynArgInfo ([], false, None)), None), + Named (SynIdent (meh, None), false, None, (9,4--9,7)), None, + Const (Unit, (9,10--9,12)), (9,4--9,7), Yes (9,0--9,12), + { LeadingKeyword = Let (9,0--9,3) + InlineKeyword = None + EqualsRange = Some (9,8--9,9) })], (9,0--9,12))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--9,12), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(7,4)-(7,5) parse error Unexpected symbol '}' in field declaration From ae918f23ef321f1bf6f28de56941225f293ebc95 Mon Sep 17 00:00:00 2001 From: Florian Verdonck Date: Tue, 27 Jun 2023 12:15:15 +0200 Subject: [PATCH 6/7] Remove FSharp.Compiler.AbstractIL.IL opens. (#15493) --- src/Compiler/SyntaxTree/PrettyNaming.fs | 1 - src/Compiler/SyntaxTree/XmlDoc.fs | 1 - src/Compiler/SyntaxTree/XmlDoc.fsi | 1 - 3 files changed, 3 deletions(-) diff --git a/src/Compiler/SyntaxTree/PrettyNaming.fs b/src/Compiler/SyntaxTree/PrettyNaming.fs index f78f742a03f..55721ae6222 100755 --- a/src/Compiler/SyntaxTree/PrettyNaming.fs +++ b/src/Compiler/SyntaxTree/PrettyNaming.fs @@ -10,7 +10,6 @@ open System.Collections.Concurrent open System.Globalization open System.Text -open FSharp.Compiler.AbstractIL open Internal.Utilities.Library open FSharp.Compiler.Text open FSharp.Compiler.Text.Layout diff --git a/src/Compiler/SyntaxTree/XmlDoc.fs b/src/Compiler/SyntaxTree/XmlDoc.fs index e5aa1b70d00..ee92eae9a02 100644 --- a/src/Compiler/SyntaxTree/XmlDoc.fs +++ b/src/Compiler/SyntaxTree/XmlDoc.fs @@ -13,7 +13,6 @@ open FSharp.Compiler.DiagnosticsLogger open FSharp.Compiler.IO open FSharp.Compiler.Text open FSharp.Compiler.Text.Range -open FSharp.Compiler.AbstractIL.IL /// Represents collected XmlDoc lines [] diff --git a/src/Compiler/SyntaxTree/XmlDoc.fsi b/src/Compiler/SyntaxTree/XmlDoc.fsi index 939a1b238e5..33b168786cc 100644 --- a/src/Compiler/SyntaxTree/XmlDoc.fsi +++ b/src/Compiler/SyntaxTree/XmlDoc.fsi @@ -3,7 +3,6 @@ namespace FSharp.Compiler.Xml open FSharp.Compiler.Text -open FSharp.Compiler.AbstractIL.IL /// Represents collected XmlDoc lines [] From 124db19c11ac940ab2e3b33d50194b5c7e0ffc7e Mon Sep 17 00:00:00 2001 From: Chaojie <42886212+v-chayan@users.noreply.github.com> Date: Tue, 27 Jun 2023 18:17:44 +0800 Subject: [PATCH 7/7] Remove redundant SourceBuildTrimNetFrameworkTargets property (#15487) --- eng/SourceBuild.props | 1 - 1 file changed, 1 deletion(-) diff --git a/eng/SourceBuild.props b/eng/SourceBuild.props index a5c32ede700..3ac9370d1a5 100644 --- a/eng/SourceBuild.props +++ b/eng/SourceBuild.props @@ -5,7 +5,6 @@ fsharp true - true