diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index da62e142c2..1c9e3968ee 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -1606,27 +1606,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 */ @@ -1998,7 +2050,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 @@ -2006,6 +2058,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) @@ -2154,7 +2246,10 @@ optAsSpec: asSpec: | AS ident - { rhs parseState 1, $2 } + { rhs parseState 1, Some $2 } + + | AS recover + { rhs parseState 1, None } optBaseSpec: | baseSpec @@ -3224,6 +3319,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 c62bb9958a..536083be93 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 c032a5bc19..bfd2090301 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 7c5c0a5fec..57f0efa65c 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 c45c452af9..c5eb12289d 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 0000000000..fd99b59e22 --- /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 0000000000..84f8bb3c3a --- /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 0000000000..57b7d8e70f --- /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 0000000000..b1a6a433c9 --- /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 0000000000..f88b58749b --- /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 0000000000..42c054e0db --- /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 0000000000..635b04df64 --- /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 0000000000..82bef8fffc --- /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 0000000000..7540c26d39 --- /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 0000000000..8c216721fb --- /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 0000000000..0c1b5a3f08 --- /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 0000000000..f7f827efbb --- /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 0000000000..3d31e23571 --- /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 0000000000..59cc29788e --- /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 0000000000..98c109124a --- /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 0000000000..3894e1a4c1 --- /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 0000000000..9006749b67 --- /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 0000000000..24fbd4e7c8 --- /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 0000000000..f640106b52 --- /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 0000000000..821925690b --- /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 0000000000..ca3da37673 --- /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 0000000000..882320fe29 --- /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 0000000000..6ee90e65f3 --- /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 0000000000..8affb14690 --- /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 0000000000..ec04dfb963 --- /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 0000000000..352346a239 --- /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 0000000000..2484086ca1 --- /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 0000000000..fea4942c9f --- /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 0000000000..d5a48d7a51 --- /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 0000000000..c436103342 --- /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 0000000000..b7b29bc728 --- /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 0000000000..979759d4db --- /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