From 7a95c98f55b2f32f2cd35779efbdfd38442ecc06 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Mon, 19 Jun 2023 21:27:38 +0200 Subject: [PATCH 1/6] Parser: recover on unfinished `type` declarations (#15410) * Parser: recover on unfinished 'type' declarations * Fantomas * Recover * Revert error text change * Update baseline * Update test/baseline * Update surface area * Fix checker * Convert test to syntax tree * Update baseline * More test updates --- src/Compiler/Checking/CheckDeclarations.fs | 8 +-- src/Compiler/SyntaxTree/LexFilter.fs | 5 +- src/Compiler/SyntaxTree/SyntaxTrivia.fs | 7 +++ src/Compiler/SyntaxTree/SyntaxTrivia.fsi | 8 ++- src/Compiler/pars.fsy | 9 +++- .../CompilerOptions/fsc/codepage/codepage.fs | 3 +- .../OffsideExceptions/RelaxWhitespace2.fs | 2 +- ...ervice.SurfaceArea.netstandard20.debug.bsl | 2 + ...vice.SurfaceArea.netstandard20.release.bsl | 2 + .../Language/OpenTypeDeclarationTests.fs | 4 +- tests/fsharp/typecheck/sigs/neg29.bsl | 4 ++ .../data/SyntaxTree/Member/Interface 06.fs | 6 +++ .../SyntaxTree/Member/Interface 06.fs.bsl | 39 +++++++++++++++ .../data/SyntaxTree/Member/Interface 07.fs | 6 +++ .../SyntaxTree/Member/Interface 07.fs.bsl | 47 +++++++++++++++++ ...ShouldContainsTheRangeOfTheWithKeyword.fsi | 5 -- .../data/SyntaxTree/SignatureType/With 01.fsi | 4 ++ ...TheWithKeyword.fsi.bsl => With 01.fsi.bsl} | 30 ++++++----- tests/service/data/SyntaxTree/Type/And 01.fs | 7 +++ .../data/SyntaxTree/Type/And 01.fs.bsl | 45 +++++++++++++++++ tests/service/data/SyntaxTree/Type/And 02.fs | 7 +++ .../data/SyntaxTree/Type/And 02.fs.bsl | 43 ++++++++++++++++ tests/service/data/SyntaxTree/Type/And 03.fs | 7 +++ .../data/SyntaxTree/Type/And 03.fs.bsl | 45 +++++++++++++++++ tests/service/data/SyntaxTree/Type/And 04.fs | 5 ++ .../data/SyntaxTree/Type/And 04.fs.bsl | 33 ++++++++++++ tests/service/data/SyntaxTree/Type/And 05.fs | 5 ++ .../data/SyntaxTree/Type/And 05.fs.bsl | 31 ++++++++++++ tests/service/data/SyntaxTree/Type/And 06.fs | 5 ++ .../data/SyntaxTree/Type/And 06.fs.bsl | 34 +++++++++++++ tests/service/data/SyntaxTree/Type/Type 01.fs | 5 ++ .../data/SyntaxTree/Type/Type 01.fs.bsl | 22 ++++++++ tests/service/data/SyntaxTree/Type/Type 02.fs | 5 ++ .../data/SyntaxTree/Type/Type 02.fs.bsl | 20 ++++++++ tests/service/data/SyntaxTree/Type/Type 03.fs | 5 ++ .../data/SyntaxTree/Type/Type 03.fs.bsl | 22 ++++++++ tests/service/data/SyntaxTree/Type/Type 04.fs | 5 ++ .../data/SyntaxTree/Type/Type 04.fs.bsl | 34 +++++++++++++ tests/service/data/SyntaxTree/Type/Type 05.fs | 5 ++ .../data/SyntaxTree/Type/Type 05.fs.bsl | 33 ++++++++++++ tests/service/data/SyntaxTree/Type/Type 06.fs | 3 ++ .../data/SyntaxTree/Type/Type 06.fs.bsl | 23 +++++++++ tests/service/data/SyntaxTree/Type/Type 07.fs | 4 ++ .../data/SyntaxTree/Type/Type 07.fs.bsl | 46 +++++++++++++++++ tests/service/data/SyntaxTree/Type/With 01.fs | 6 +++ .../data/SyntaxTree/Type/With 01.fs.bsl | 43 ++++++++++++++++ tests/service/data/SyntaxTree/Type/With 02.fs | 6 +++ .../data/SyntaxTree/Type/With 02.fs.bsl | 22 ++++++++ tests/service/data/SyntaxTree/Type/With 03.fs | 5 ++ .../data/SyntaxTree/Type/With 03.fs.bsl | 22 ++++++++ tests/service/data/SyntaxTree/Type/With 04.fs | 8 +++ .../data/SyntaxTree/Type/With 04.fs.bsl | 50 +++++++++++++++++++ tests/service/data/SyntaxTree/Type/With 05.fs | 8 +++ .../data/SyntaxTree/Type/With 05.fs.bsl | 29 +++++++++++ .../DocumentDiagnosticAnalyzerTests.fs | 10 ---- 55 files changed, 857 insertions(+), 42 deletions(-) create mode 100644 tests/service/data/SyntaxTree/Member/Interface 06.fs create mode 100644 tests/service/data/SyntaxTree/Member/Interface 06.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Member/Interface 07.fs create mode 100644 tests/service/data/SyntaxTree/Member/Interface 07.fs.bsl delete mode 100644 tests/service/data/SyntaxTree/SignatureType/SynTypeDefnSigShouldContainsTheRangeOfTheWithKeyword.fsi create mode 100644 tests/service/data/SyntaxTree/SignatureType/With 01.fsi rename tests/service/data/SyntaxTree/SignatureType/{SynTypeDefnSigShouldContainsTheRangeOfTheWithKeyword.fsi.bsl => With 01.fsi.bsl} (56%) create mode 100644 tests/service/data/SyntaxTree/Type/And 01.fs create mode 100644 tests/service/data/SyntaxTree/Type/And 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/And 02.fs create mode 100644 tests/service/data/SyntaxTree/Type/And 02.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/And 03.fs create mode 100644 tests/service/data/SyntaxTree/Type/And 03.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/And 04.fs create mode 100644 tests/service/data/SyntaxTree/Type/And 04.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/And 05.fs create mode 100644 tests/service/data/SyntaxTree/Type/And 05.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/And 06.fs create mode 100644 tests/service/data/SyntaxTree/Type/And 06.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Type 01.fs create mode 100644 tests/service/data/SyntaxTree/Type/Type 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Type 02.fs create mode 100644 tests/service/data/SyntaxTree/Type/Type 02.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Type 03.fs create mode 100644 tests/service/data/SyntaxTree/Type/Type 03.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Type 04.fs create mode 100644 tests/service/data/SyntaxTree/Type/Type 04.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Type 05.fs create mode 100644 tests/service/data/SyntaxTree/Type/Type 05.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Type 06.fs create mode 100644 tests/service/data/SyntaxTree/Type/Type 06.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/Type 07.fs create mode 100644 tests/service/data/SyntaxTree/Type/Type 07.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/With 01.fs create mode 100644 tests/service/data/SyntaxTree/Type/With 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/With 02.fs create mode 100644 tests/service/data/SyntaxTree/Type/With 02.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/With 03.fs create mode 100644 tests/service/data/SyntaxTree/Type/With 03.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/With 04.fs create mode 100644 tests/service/data/SyntaxTree/Type/With 04.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Type/With 05.fs create mode 100644 tests/service/data/SyntaxTree/Type/With 05.fs.bsl diff --git a/src/Compiler/Checking/CheckDeclarations.fs b/src/Compiler/Checking/CheckDeclarations.fs index d4c15029ff0..a37c39a7d43 100644 --- a/src/Compiler/Checking/CheckDeclarations.fs +++ b/src/Compiler/Checking/CheckDeclarations.fs @@ -2556,8 +2556,9 @@ module EstablishTypeDefinitionCores = | SynModuleDecl.Types (typeSpecs, _) -> for SynTypeDefn(typeInfo=SynComponentInfo(typeParams=synTypars; longId=ids); typeRepr=trepr) in typeSpecs do if TyparsAllHaveMeasureDeclEarlyCheck cenv env synTypars then - match trepr with - | SynTypeDefnRepr.ObjectModel(kind=SynTypeDefnKind.Augmentation _) -> () + match trepr, ids with + | SynTypeDefnRepr.ObjectModel(kind=SynTypeDefnKind.Augmentation _), _ -> () + | _, [] -> () | _ -> yield (List.last ids).idText | _ -> () ] |> set @@ -4831,7 +4832,8 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem let defn = TMDefRec(true, [], [decl], binds |> List.map ModuleOrNamespaceBinding.Binding, m) return ([defn], [], []), env, env - | SynModuleDecl.Types (typeDefs, m) -> + | SynModuleDecl.Types (typeDefs, m) -> + let typeDefs = typeDefs |> List.filter (function (SynTypeDefn(typeInfo = SynComponentInfo(longId = []))) -> false | _ -> true) let scopem = unionRanges m scopem let mutRecDefns = typeDefs |> List.map MutRecShape.Tycon let mutRecDefnsChecked, envAfter = TcDeclarations.TcMutRecDefinitions cenv env parent typeNames tpenv m scopem None mutRecDefns false diff --git a/src/Compiler/SyntaxTree/LexFilter.fs b/src/Compiler/SyntaxTree/LexFilter.fs index 1c5b635498d..09bc37e0c5f 100644 --- a/src/Compiler/SyntaxTree/LexFilter.fs +++ b/src/Compiler/SyntaxTree/LexFilter.fs @@ -751,6 +751,9 @@ type LexFilterImpl ( | CtxtSeqBlock(FirstInSeqBlock, _, _), (CtxtDo _ as limitCtxt) :: CtxtSeqBlock _ :: (CtxtTypeDefns _ | CtxtModuleBody _) :: _ -> PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol + 1) + | CtxtSeqBlock(FirstInSeqBlock, _, _), CtxtWithAsAugment _ :: (CtxtTypeDefns _ as limitCtxt) :: _ -> + PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol + 1) + | _, CtxtSeqBlock _ :: rest when not strict -> undentationLimit strict rest | _, CtxtParen _ :: rest when not strict -> undentationLimit strict rest @@ -2308,7 +2311,7 @@ type LexFilterImpl ( if debug then dprintf "WITH\n" if debug then dprintf "WITH --> NO MATCH, pushing CtxtWithAsAugment (type augmentation), stack = %A" stack pushCtxt tokenTup (CtxtWithAsAugment tokenStartPos) - pushCtxtSeqBlock tokenTup AddBlockEnd + tryPushCtxtSeqBlock tokenTup AddBlockEnd returnToken tokenLexbufState token | FUNCTION, _ -> diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fs b/src/Compiler/SyntaxTree/SyntaxTrivia.fs index d5c459b33f5..497c666f1d6 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fs +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fs @@ -135,6 +135,13 @@ type SynTypeDefnLeadingKeyword = | StaticType of staticRange: range * typeRange: range | Synthetic + member this.Range = + match this with + | SynTypeDefnLeadingKeyword.Type range + | SynTypeDefnLeadingKeyword.And range -> range + | SynTypeDefnLeadingKeyword.StaticType (staticRange, typeRange) -> Range.unionRanges staticRange typeRange + | SynTypeDefnLeadingKeyword.Synthetic -> failwith "Getting range from synthetic keyword" + [] type SynTypeDefnTrivia = { diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi index 1f2d001cfd7..fc28dc889b9 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi @@ -219,11 +219,17 @@ type SynPatListConsTrivia = [] type SynTypeDefnLeadingKeyword = | Type of range + | And of range - // Can happen in SynMemberDefn.NestedType or SynMemberSig.NestedType + + /// Can happen in SynMemberDefn.NestedType or SynMemberSig.NestedType | StaticType of staticRange: range * typeRange: range + + /// Produced during type checking, should not be used in actual parsed trees. | Synthetic + member Range: range + /// Represents additional information for SynTypeDefn [] type SynTypeDefnTrivia = diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 0509f867c73..46f9a1e7c74 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -1540,7 +1540,8 @@ typeNameInfo: | opt_attributes tyconNameAndTyparDecls opt_typeConstraints { let typars, lid, fixity, vis = $2 let xmlDoc = grabXmlDoc(parseState, $1, 1) - SynComponentInfo ($1, typars, $3, lid, xmlDoc, fixity, vis, rangeOfLid lid) } + let m = match lid with [] -> rhs parseState 2 | _ -> rangeOfLid lid + SynComponentInfo ($1, typars, $3, lid, xmlDoc, fixity, vis, m) } /* Part of a set of type definitions */ tyconDefnList: @@ -1604,7 +1605,8 @@ tyconDefn: let mEquals = rhs parseState 7 // Gets the XML doc comments prior to the implicit constructor let xmlDoc = grabXmlDoc(parseState, $2, 2) - let memberCtorPattern = SynMemberDefn.ImplicitCtor(vis, $2, spats, Option.map snd az, xmlDoc, rangeOfLid lid, { AsKeyword = Option.map fst az }) + let m = match lid with [] -> rhs parseState 1 | _ -> rangeOfLid lid + let memberCtorPattern = SynMemberDefn.ImplicitCtor(vis, $2, spats, Option.map snd az, xmlDoc, m, { AsKeyword = Option.map fst az }) let tcDefRepr = match tcDefRepr with | SynTypeDefnRepr.ObjectModel (k, cspec, m) -> SynTypeDefnRepr.ObjectModel(k, memberCtorPattern :: cspec, m) @@ -2317,6 +2319,9 @@ tyconNameAndTyparDecls: | opt_access path postfixTyparDecls { Some $3, $2.LongIdent, true, $1 } + | opt_access recover + { None, [], false, $1 } + prefixTyparDecls: | typar { SynTyparDecls.SinglePrefix(SynTyparDecl([], $1), rhs parseState 1) } diff --git a/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/codepage/codepage.fs b/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/codepage/codepage.fs index 1ad955c4b90..c62bb9958ab 100644 --- a/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/codepage/codepage.fs +++ b/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/codepage/codepage.fs @@ -202,5 +202,6 @@ Parameter name: codepage") |> shouldFail |> withDiagnostics [ (Error 10, Line 7, Col 10, Line 7, Col 11, "Unexpected character '�' in type name") - (Error 10, Line 9, Col 14, Line 9, Col 17, "Unexpected keyword 'end' in implementation file") + (Error 552, Line 7, Col 10, Line 8, Col 33, "Only class types may take value arguments") + (Error 10, Line 9, Col 14, Line 9, Col 17, "Unexpected keyword 'end' in implementation file. Expected incomplete structured construct at or before this point or other token.") ] diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/RelaxWhitespace2.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/RelaxWhitespace2.fs index 97f97e8331e..c51548b18e4 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/RelaxWhitespace2.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/RelaxWhitespace2.fs @@ -3568,7 +3568,7 @@ and ^a > () = member inline __.X = () with - static member inline Y = () + static member inline Y = () type TypeWithALongName< ^a when ^a:(static member(+):'a * 'a -> 'a ) diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl index a9c06dc1612..5ba81eb678d 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl @@ -9814,6 +9814,8 @@ FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTr FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+StaticType FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+Tags FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+Type +FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.Text.Range Range +FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.Text.Range get_Range() FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: Int32 Tag FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: Int32 get_Tag() FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: System.String ToString() diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl index 1736be3d13e..d464f63b50f 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl @@ -9814,6 +9814,8 @@ FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTr FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+StaticType FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+Tags FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword+Type +FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.Text.Range Range +FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: FSharp.Compiler.Text.Range get_Range() FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: Int32 Tag FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: Int32 get_Tag() FSharp.Compiler.SyntaxTrivia.SynTypeDefnLeadingKeyword: System.String ToString() diff --git a/tests/fsharp/Compiler/Language/OpenTypeDeclarationTests.fs b/tests/fsharp/Compiler/Language/OpenTypeDeclarationTests.fs index a222d190dcb..162b75d94a5 100644 --- a/tests/fsharp/Compiler/Language/OpenTypeDeclarationTests.fs +++ b/tests/fsharp/Compiler/Language/OpenTypeDeclarationTests.fs @@ -978,7 +978,7 @@ module Test = | UCase1 | UCase2 with - static member M() = () + static member M() = () open type Test.TestUnion @@ -1004,7 +1004,7 @@ module Test = | UCase1 of 'T | UCase2 with - static member M() = () + static member M() = () open type Test.TestUnion diff --git a/tests/fsharp/typecheck/sigs/neg29.bsl b/tests/fsharp/typecheck/sigs/neg29.bsl index 435b7203554..dd2d49ffda1 100644 --- a/tests/fsharp/typecheck/sigs/neg29.bsl +++ b/tests/fsharp/typecheck/sigs/neg29.bsl @@ -2,3 +2,7 @@ neg29.fs(5,19,6,16): parse error FS0010: Incomplete structured construct at or before this point in type name. Expected '>' or other token. neg29.fs(9,1,9,1): parse error FS0010: Incomplete structured construct at or before this point in implementation file + +neg29.fs(6,19,6,20): parse error FS0010: Unexpected symbol '(' in expression + +neg29.fs(6,18,6,19): parse error FS3156: Unexpected token '>' or incomplete expression diff --git a/tests/service/data/SyntaxTree/Member/Interface 06.fs b/tests/service/data/SyntaxTree/Member/Interface 06.fs new file mode 100644 index 00000000000..4ce4520f6df --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Interface 06.fs @@ -0,0 +1,6 @@ +module Module + +type T = + interface I with + + let _ = () diff --git a/tests/service/data/SyntaxTree/Member/Interface 06.fs.bsl b/tests/service/data/SyntaxTree/Member/Interface 06.fs.bsl new file mode 100644 index 00000000000..4c320397604 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Interface 06.fs.bsl @@ -0,0 +1,39 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Interface 06.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [T], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + ObjectModel + (Unspecified, + [Interface + (LongIdent (SynLongIdent ([I], [], [None])), + Some (4,16--4,20), Some [], (4,4--4,20)); + LetBindings + ([SynBinding + (None, Normal, false, false, [], + PreXmlDoc ((6,4), FSharp.Compiler.Xml.XmlDocCollector), + SynValData + (None, + SynValInfo ([], SynArgInfo ([], false, None)), + None), Wild (6,8--6,9), None, + Const (Unit, (6,12--6,14)), (6,8--6,9), + Yes (6,4--6,14), + { LeadingKeyword = Let (6,4--6,7) + InlineKeyword = None + EqualsRange = Some (6,10--6,11) })], false, false, + (6,4--6,14))], (4,4--6,14)), [], None, (3,5--6,14), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--6,14))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,14), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(6,4)-(6,14) parse error Possible incorrect indentation: this token is offside of context started at position (4:5). Try indenting this token further or using standard formatting conventions. diff --git a/tests/service/data/SyntaxTree/Member/Interface 07.fs b/tests/service/data/SyntaxTree/Member/Interface 07.fs new file mode 100644 index 00000000000..c2b45184246 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Interface 07.fs @@ -0,0 +1,6 @@ +module Module + +type T = + interface I + + member this.P = 1 diff --git a/tests/service/data/SyntaxTree/Member/Interface 07.fs.bsl b/tests/service/data/SyntaxTree/Member/Interface 07.fs.bsl new file mode 100644 index 00000000000..66c618d8e44 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/Interface 07.fs.bsl @@ -0,0 +1,47 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/Interface 07.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [T], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + ObjectModel + (Unspecified, + [Interface + (LongIdent (SynLongIdent ([I], [], [None])), None, None, + (4,4--4,15)); + Member + (SynBinding + (None, Normal, false, false, [], + PreXmlDoc ((6,4), FSharp.Compiler.Xml.XmlDocCollector), + SynValData + (Some { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = Member }, + SynValInfo + ([[SynArgInfo ([], false, None)]; []], + SynArgInfo ([], false, None)), None), + LongIdent + (SynLongIdent + ([this; P], [(6,15--6,16)], [None; None]), None, + None, Pats [], None, (6,11--6,17)), None, + Const (Int32 1, (6,20--6,21)), (6,11--6,17), + NoneAtInvisible, + { LeadingKeyword = Member (6,4--6,10) + InlineKeyword = None + EqualsRange = Some (6,18--6,19) }), (6,4--6,21))], + (4,4--6,21)), [], None, (3,5--6,21), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--6,21))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,21), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/SignatureType/SynTypeDefnSigShouldContainsTheRangeOfTheWithKeyword.fsi b/tests/service/data/SyntaxTree/SignatureType/SynTypeDefnSigShouldContainsTheRangeOfTheWithKeyword.fsi deleted file mode 100644 index 3cc5bebeac2..00000000000 --- a/tests/service/data/SyntaxTree/SignatureType/SynTypeDefnSigShouldContainsTheRangeOfTheWithKeyword.fsi +++ /dev/null @@ -1,5 +0,0 @@ - -namespace X - -type Foo with -member Meh : unit -> unit diff --git a/tests/service/data/SyntaxTree/SignatureType/With 01.fsi b/tests/service/data/SyntaxTree/SignatureType/With 01.fsi new file mode 100644 index 00000000000..53dbfa020fa --- /dev/null +++ b/tests/service/data/SyntaxTree/SignatureType/With 01.fsi @@ -0,0 +1,4 @@ +namespace X + +type Foo with + member Meh: unit -> unit diff --git a/tests/service/data/SyntaxTree/SignatureType/SynTypeDefnSigShouldContainsTheRangeOfTheWithKeyword.fsi.bsl b/tests/service/data/SyntaxTree/SignatureType/With 01.fsi.bsl similarity index 56% rename from tests/service/data/SyntaxTree/SignatureType/SynTypeDefnSigShouldContainsTheRangeOfTheWithKeyword.fsi.bsl rename to tests/service/data/SyntaxTree/SignatureType/With 01.fsi.bsl index 6dca2c06d15..07be5d42776 100644 --- a/tests/service/data/SyntaxTree/SignatureType/SynTypeDefnSigShouldContainsTheRangeOfTheWithKeyword.fsi.bsl +++ b/tests/service/data/SyntaxTree/SignatureType/With 01.fsi.bsl @@ -1,30 +1,28 @@ SigFile (ParsedSigFileInput - ("/root/SignatureType/SynTypeDefnSigShouldContainsTheRangeOfTheWithKeyword.fsi", - QualifiedNameOfFile SynTypeDefnSigShouldContainsTheRangeOfTheWithKeyword, - [], [], + ("/root/SignatureType/With 01.fsi", QualifiedNameOfFile With 01, [], [], [SynModuleOrNamespaceSig ([X], false, DeclaredNamespace, [Types ([SynTypeDefnSig (SynComponentInfo ([], None, [], [Foo], - PreXmlDoc ((4,0), FSharp.Compiler.Xml.XmlDocCollector), - false, None, (4,5--4,8)), - Simple (None (4,5--5,25), (4,5--5,25)), + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,8)), + Simple (None (3,5--4,28), (3,5--4,28)), [Member (SynValSig ([], SynIdent (Meh, None), SynValTyparDecls (None, true), Fun (LongIdent (SynLongIdent ([unit], [], [None])), LongIdent (SynLongIdent ([unit], [], [None])), - (5,13--5,25), { ArrowRange = (5,18--5,20) }), + (4,16--4,28), { ArrowRange = (4,21--4,23) }), SynValInfo ([[SynArgInfo ([], false, None)]], SynArgInfo ([], false, None)), false, false, - PreXmlDoc ((5,0), FSharp.Compiler.Xml.XmlDocCollector), - None, None, (5,0--5,25), - { LeadingKeyword = Member (5,0--5,6) + PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), + None, None, (4,4--4,28), + { LeadingKeyword = Member (4,4--4,10) InlineKeyword = None WithKeyword = None EqualsRange = None }), @@ -33,12 +31,12 @@ SigFile IsOverrideOrExplicitImpl = false IsFinal = false GetterOrSetterIsCompilerGenerated = false - MemberKind = Member }, (5,0--5,25), - { GetSetKeywords = None })], (4,5--5,25), - { LeadingKeyword = Type (4,0--4,4) + MemberKind = Member }, (4,4--4,28), + { GetSetKeywords = None })], (3,5--4,28), + { LeadingKeyword = Type (3,0--3,4) EqualsRange = None - WithKeyword = Some (4,9--4,13) })], (4,0--5,25))], - PreXmlDocEmpty, [], None, (2,0--5,25), - { LeadingKeyword = Namespace (2,0--2,9) })], + WithKeyword = Some (3,9--3,13) })], (3,0--4,28))], + PreXmlDocEmpty, [], None, (1,0--4,28), + { LeadingKeyword = Namespace (1,0--1,9) })], { ConditionalDirectives = [] CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/And 01.fs b/tests/service/data/SyntaxTree/Type/And 01.fs new file mode 100644 index 00000000000..326a7086877 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/And 01.fs @@ -0,0 +1,7 @@ +module Module + +type A = int + +and + +and C = int diff --git a/tests/service/data/SyntaxTree/Type/And 01.fs.bsl b/tests/service/data/SyntaxTree/Type/And 01.fs.bsl new file mode 100644 index 00000000000..a9d16c93758 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/And 01.fs.bsl @@ -0,0 +1,45 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/And 01.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [A], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (3,9--3,12)), (3,9--3,12)), [], None, (3,5--3,12), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None }); + SynTypeDefn + (SynComponentInfo + ([], None, [], [], + PreXmlDoc ((7,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (7,0--7,3)), + Simple (None (7,0--7,3), (7,0--7,3)), [], None, (7,0--7,3), + { LeadingKeyword = And (5,0--5,3) + EqualsRange = None + WithKeyword = None }); + SynTypeDefn + (SynComponentInfo + ([], None, [], [C], + PreXmlDoc ((7,4), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (7,4--7,5)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (7,8--7,11)), (7,8--7,11)), [], None, (7,4--7,11), + { LeadingKeyword = And (7,0--7,3) + EqualsRange = Some (7,6--7,7) + WithKeyword = None })], (3,0--7,11))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--7,11), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(7,0)-(7,3) parse error Unexpected keyword 'and' in type name diff --git a/tests/service/data/SyntaxTree/Type/And 02.fs b/tests/service/data/SyntaxTree/Type/And 02.fs new file mode 100644 index 00000000000..8dc02b2e122 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/And 02.fs @@ -0,0 +1,7 @@ +module Module + +type A = int + +and B + +and C = int diff --git a/tests/service/data/SyntaxTree/Type/And 02.fs.bsl b/tests/service/data/SyntaxTree/Type/And 02.fs.bsl new file mode 100644 index 00000000000..9c68fa0b125 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/And 02.fs.bsl @@ -0,0 +1,43 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/And 02.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [A], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (3,9--3,12)), (3,9--3,12)), [], None, (3,5--3,12), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None }); + SynTypeDefn + (SynComponentInfo + ([], None, [], [B], + PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (5,4--5,5)), + Simple (None (5,4--5,5), (5,4--5,5)), [], None, (5,4--5,5), + { LeadingKeyword = And (5,0--5,3) + EqualsRange = None + WithKeyword = None }); + SynTypeDefn + (SynComponentInfo + ([], None, [], [C], + PreXmlDoc ((7,4), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (7,4--7,5)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (7,8--7,11)), (7,8--7,11)), [], None, (7,4--7,11), + { LeadingKeyword = And (7,0--7,3) + EqualsRange = Some (7,6--7,7) + WithKeyword = None })], (3,0--7,11))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--7,11), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/And 03.fs b/tests/service/data/SyntaxTree/Type/And 03.fs new file mode 100644 index 00000000000..f84250d9995 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/And 03.fs @@ -0,0 +1,7 @@ +module Module + +type A = int + +and B = + +and C = int diff --git a/tests/service/data/SyntaxTree/Type/And 03.fs.bsl b/tests/service/data/SyntaxTree/Type/And 03.fs.bsl new file mode 100644 index 00000000000..bf2b92aa99d --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/And 03.fs.bsl @@ -0,0 +1,45 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/And 03.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [A], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (3,9--3,12)), (3,9--3,12)), [], None, (3,5--3,12), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None }); + SynTypeDefn + (SynComponentInfo + ([], None, [], [B], + PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (5,4--5,5)), + ObjectModel (Unspecified, [], (7,0--7,0)), [], None, + (5,4--7,0), { LeadingKeyword = And (5,0--5,3) + EqualsRange = Some (5,6--5,7) + WithKeyword = None }); + SynTypeDefn + (SynComponentInfo + ([], None, [], [C], + PreXmlDoc ((7,4), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (7,4--7,5)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (7,8--7,11)), (7,8--7,11)), [], None, (7,4--7,11), + { LeadingKeyword = And (7,0--7,3) + EqualsRange = Some (7,6--7,7) + WithKeyword = None })], (3,0--7,11))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--7,11), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(5,4)-(5,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/And 04.fs b/tests/service/data/SyntaxTree/Type/And 04.fs new file mode 100644 index 00000000000..043b7c9cfb5 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/And 04.fs @@ -0,0 +1,5 @@ +module Module + +type A = int + +and diff --git a/tests/service/data/SyntaxTree/Type/And 04.fs.bsl b/tests/service/data/SyntaxTree/Type/And 04.fs.bsl new file mode 100644 index 00000000000..05c052ddda5 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/And 04.fs.bsl @@ -0,0 +1,33 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/And 04.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [A], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (3,9--3,12)), (3,9--3,12)), [], None, (3,5--3,12), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None }); + SynTypeDefn + (SynComponentInfo + ([], None, [], [], + PreXmlDoc ((6,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (6,0--6,0)), + Simple (None (6,0--6,0), (6,0--6,0)), [], None, (6,0--6,0), + { LeadingKeyword = And (5,0--5,3) + EqualsRange = None + WithKeyword = None })], (3,0--6,0))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,0), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(6,0)-(6,0) parse error Incomplete structured construct at or before this point in type name diff --git a/tests/service/data/SyntaxTree/Type/And 05.fs b/tests/service/data/SyntaxTree/Type/And 05.fs new file mode 100644 index 00000000000..15482fe1d59 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/And 05.fs @@ -0,0 +1,5 @@ +module Module + +type A = int + +and B diff --git a/tests/service/data/SyntaxTree/Type/And 05.fs.bsl b/tests/service/data/SyntaxTree/Type/And 05.fs.bsl new file mode 100644 index 00000000000..60a23a89c19 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/And 05.fs.bsl @@ -0,0 +1,31 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/And 05.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [A], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (3,9--3,12)), (3,9--3,12)), [], None, (3,5--3,12), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None }); + SynTypeDefn + (SynComponentInfo + ([], None, [], [B], + PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (5,4--5,5)), + Simple (None (5,4--5,5), (5,4--5,5)), [], None, (5,4--5,5), + { LeadingKeyword = And (5,0--5,3) + EqualsRange = None + WithKeyword = None })], (3,0--5,5))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--5,5), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/And 06.fs b/tests/service/data/SyntaxTree/Type/And 06.fs new file mode 100644 index 00000000000..da0ed364da1 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/And 06.fs @@ -0,0 +1,5 @@ +module Module + +type A = int + +and B = diff --git a/tests/service/data/SyntaxTree/Type/And 06.fs.bsl b/tests/service/data/SyntaxTree/Type/And 06.fs.bsl new file mode 100644 index 00000000000..6e0ad8564e5 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/And 06.fs.bsl @@ -0,0 +1,34 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/And 06.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [A], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (3,9--3,12)), (3,9--3,12)), [], None, (3,5--3,12), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None }); + SynTypeDefn + (SynComponentInfo + ([], None, [], [B], + PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (5,4--5,5)), + ObjectModel (Unspecified, [], (5,6--5,6)), [], None, + (5,4--5,7), { LeadingKeyword = And (5,0--5,3) + EqualsRange = Some (5,6--5,7) + WithKeyword = None })], (3,0--5,7))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--5,7), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(6,0)-(6,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. +(5,4)-(5,7) parse error A type definition requires one or more members or other declarations. If you intend to define an empty class, struct or interface, then use 'type ... = class end', 'interface end' or 'struct end'. diff --git a/tests/service/data/SyntaxTree/Type/Type 01.fs b/tests/service/data/SyntaxTree/Type/Type 01.fs new file mode 100644 index 00000000000..a690e4f1fc8 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 01.fs @@ -0,0 +1,5 @@ +module Module + +type + +() diff --git a/tests/service/data/SyntaxTree/Type/Type 01.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 01.fs.bsl new file mode 100644 index 00000000000..f34d5eb126b --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 01.fs.bsl @@ -0,0 +1,22 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Type 01.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--5,0)), + Simple (None (3,5--5,0), (3,5--5,0)), [], None, (3,5--5,0), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = None + 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)-(5,0) parse error Incomplete structured construct at or before this point in type name diff --git a/tests/service/data/SyntaxTree/Type/Type 02.fs b/tests/service/data/SyntaxTree/Type/Type 02.fs new file mode 100644 index 00000000000..0a97d601ac8 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 02.fs @@ -0,0 +1,5 @@ +module Module + +type T + +() diff --git a/tests/service/data/SyntaxTree/Type/Type 02.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 02.fs.bsl new file mode 100644 index 00000000000..a670186b978 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 02.fs.bsl @@ -0,0 +1,20 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Type 02.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [T], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + Simple (None (3,5--3,6), (3,5--3,6)), [], None, (3,5--3,6), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = None + WithKeyword = None })], (3,0--3,6)); + Expr (Const (Unit, (5,0--5,2)), (5,0--5,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--5,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/Type 03.fs b/tests/service/data/SyntaxTree/Type/Type 03.fs new file mode 100644 index 00000000000..55459fd3bd2 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 03.fs @@ -0,0 +1,5 @@ +module Module + +type T = + +() diff --git a/tests/service/data/SyntaxTree/Type/Type 03.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 03.fs.bsl new file mode 100644 index 00000000000..47258d8b728 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 03.fs.bsl @@ -0,0 +1,22 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Type 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, [], (5,0--5,0)), [], None, + (3,5--5,0), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--5,0)); + 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,8) parse error A type definition requires one or more members or other declarations. If you intend to define an empty class, struct or interface, then use 'type ... = class end', 'interface end' or 'struct end'. diff --git a/tests/service/data/SyntaxTree/Type/Type 04.fs b/tests/service/data/SyntaxTree/Type/Type 04.fs new file mode 100644 index 00000000000..bc8c7e735a2 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 04.fs @@ -0,0 +1,5 @@ +module Module + +type T1 = + +type T2 = int diff --git a/tests/service/data/SyntaxTree/Type/Type 04.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 04.fs.bsl new file mode 100644 index 00000000000..65fc3926189 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 04.fs.bsl @@ -0,0 +1,34 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Type 04.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, [], (5,0--5,0)), [], None, + (3,5--5,0), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,8--3,9) + WithKeyword = None })], (3,0--5,0)); + Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [T2], + PreXmlDoc ((5,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (5,5--5,7)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (5,10--5,13)), (5,10--5,13)), [], None, (5,5--5,13), + { LeadingKeyword = Type (5,0--5,4) + EqualsRange = Some (5,8--5,9) + WithKeyword = None })], (5,0--5,13))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--5,13), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,5)-(3,9) parse error A type definition requires one or more members or other declarations. If you intend to define an empty class, struct or interface, then use 'type ... = class end', 'interface end' or 'struct end'. diff --git a/tests/service/data/SyntaxTree/Type/Type 05.fs b/tests/service/data/SyntaxTree/Type/Type 05.fs new file mode 100644 index 00000000000..4452d73a2d6 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 05.fs @@ -0,0 +1,5 @@ +module Module + +type T1 = + +and T2 = int diff --git a/tests/service/data/SyntaxTree/Type/Type 05.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 05.fs.bsl new file mode 100644 index 00000000000..d5de1801c1c --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 05.fs.bsl @@ -0,0 +1,33 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Type 05.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, [], (5,0--5,0)), [], None, + (3,5--5,0), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,8--3,9) + WithKeyword = None }); + SynTypeDefn + (SynComponentInfo + ([], None, [], [T2], + PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (5,4--5,6)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (5,9--5,12)), (5,9--5,12)), [], None, (5,4--5,12), + { LeadingKeyword = And (5,0--5,3) + EqualsRange = Some (5,7--5,8) + WithKeyword = None })], (3,0--5,12))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--5,12), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,5)-(3,9) parse error A type definition requires one or more members or other declarations. If you intend to define an empty class, struct or interface, then use 'type ... = class end', 'interface end' or 'struct end'. diff --git a/tests/service/data/SyntaxTree/Type/Type 06.fs b/tests/service/data/SyntaxTree/Type/Type 06.fs new file mode 100644 index 00000000000..b407fcafca3 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 06.fs @@ -0,0 +1,3 @@ +module Module + +type = diff --git a/tests/service/data/SyntaxTree/Type/Type 06.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 06.fs.bsl new file mode 100644 index 00000000000..c113ea3c208 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 06.fs.bsl @@ -0,0 +1,23 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Type 06.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + ObjectModel (Unspecified, [], (3,5--3,5)), [], None, + (3,5--3,6), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,5--3,6) + WithKeyword = None })], (3,0--3,6))], + 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 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,6) parse error Unexpected symbol '=' in type name +(3,5)-(3,6) parse error A type definition requires one or more members or other declarations. If you intend to define an empty class, struct or interface, then use 'type ... = class end', 'interface end' or 'struct end'. diff --git a/tests/service/data/SyntaxTree/Type/Type 07.fs b/tests/service/data/SyntaxTree/Type/Type 07.fs new file mode 100644 index 00000000000..eec4f4c7d5e --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 07.fs @@ -0,0 +1,4 @@ +module Module + +type = + member this.P = 1 diff --git a/tests/service/data/SyntaxTree/Type/Type 07.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 07.fs.bsl new file mode 100644 index 00000000000..0eb812102a6 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Type 07.fs.bsl @@ -0,0 +1,46 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Type 07.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + ObjectModel + (Unspecified, + [Member + (SynBinding + (None, Normal, false, false, [], + PreXmlDoc ((4,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], [(4,15--4,16)], [None; None]), None, + None, Pats [], None, (4,11--4,17)), None, + Const (Int32 1, (4,20--4,21)), (4,11--4,17), + NoneAtInvisible, + { LeadingKeyword = Member (4,4--4,10) + InlineKeyword = None + EqualsRange = Some (4,18--4,19) }), (4,4--4,21))], + (4,4--4,21)), [], None, (3,5--4,21), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,5--3,6) + 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 [])) + +(3,5)-(3,6) parse error Unexpected symbol '=' in type name diff --git a/tests/service/data/SyntaxTree/Type/With 01.fs b/tests/service/data/SyntaxTree/Type/With 01.fs new file mode 100644 index 00000000000..e373a897335 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/With 01.fs @@ -0,0 +1,6 @@ +module Module + +type T with + member this.P = 1 + +2 diff --git a/tests/service/data/SyntaxTree/Type/With 01.fs.bsl b/tests/service/data/SyntaxTree/Type/With 01.fs.bsl new file mode 100644 index 00000000000..7fd1e7479f6 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/With 01.fs.bsl @@ -0,0 +1,43 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/With 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 (Augmentation (3,7--3,11), [], (3,5--4,21)), + [Member + (SynBinding + (None, Normal, false, false, [], + PreXmlDoc ((4,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], [(4,15--4,16)], [None; None]), None, + None, Pats [], None, (4,11--4,17)), None, + Const (Int32 1, (4,20--4,21)), (4,11--4,17), + NoneAtInvisible, { LeadingKeyword = Member (4,4--4,10) + InlineKeyword = None + EqualsRange = Some (4,18--4,19) }), + (4,4--4,21))], None, (3,5--4,21), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = None + WithKeyword = None })], (3,0--4,21)); + 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/With 02.fs b/tests/service/data/SyntaxTree/Type/With 02.fs new file mode 100644 index 00000000000..4e9672ca0d0 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/With 02.fs @@ -0,0 +1,6 @@ +module Module + +type T with +member this.P = 1 + +2 diff --git a/tests/service/data/SyntaxTree/Type/With 02.fs.bsl b/tests/service/data/SyntaxTree/Type/With 02.fs.bsl new file mode 100644 index 00000000000..c7dc64c6ac3 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/With 02.fs.bsl @@ -0,0 +1,22 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/With 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 (Augmentation (3,7--3,11), [], (3,5--3,11)), [], + None, (3,5--3,11), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = None + WithKeyword = None })], (3,0--3,11))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,11), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(4,0)-(4,6) 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. +(4,0)-(4,6) parse error Unexpected keyword 'member' in definition. Expected incomplete structured construct at or before this point or other token. diff --git a/tests/service/data/SyntaxTree/Type/With 03.fs b/tests/service/data/SyntaxTree/Type/With 03.fs new file mode 100644 index 00000000000..bff4bc46b20 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/With 03.fs @@ -0,0 +1,5 @@ +module Module + +type T with + +2 diff --git a/tests/service/data/SyntaxTree/Type/With 03.fs.bsl b/tests/service/data/SyntaxTree/Type/With 03.fs.bsl new file mode 100644 index 00000000000..aad1b365c10 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/With 03.fs.bsl @@ -0,0 +1,22 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/With 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 (Augmentation (3,7--3,11), [], (3,5--3,11)), [], + None, (3,5--3,11), { LeadingKeyword = Type (3,0--3,4) + EqualsRange = None + WithKeyword = None })], (3,0--3,11)); + Expr (Const (Int32 2, (5,0--5,1)), (5,0--5,1))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--5,1), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(5,0)-(5,1) 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. diff --git a/tests/service/data/SyntaxTree/Type/With 04.fs b/tests/service/data/SyntaxTree/Type/With 04.fs new file mode 100644 index 00000000000..11ef5686459 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/With 04.fs @@ -0,0 +1,8 @@ +module Module + +type U = + | A with + + member this.P = 1 + +2 diff --git a/tests/service/data/SyntaxTree/Type/With 04.fs.bsl b/tests/service/data/SyntaxTree/Type/With 04.fs.bsl new file mode 100644 index 00000000000..99ddf674425 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/With 04.fs.bsl @@ -0,0 +1,50 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/With 04.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,4), FSharp.Compiler.Xml.XmlDocCollector), + None, (4,6--4,7), { BarRange = Some (4,4--4,5) })], + (4,4--4,7)), (4,4--4,7)), + [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))], None, (3,5--6,21), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = Some (4,8--4,12) })], (3,0--6,21)); + Expr (Const (Int32 2, (8,0--8,1)), (8,0--8,1))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--8,1), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Type/With 05.fs b/tests/service/data/SyntaxTree/Type/With 05.fs new file mode 100644 index 00000000000..584f973625e --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/With 05.fs @@ -0,0 +1,8 @@ +module Module + +type U = + | A with + +member this.P = 1 + +2 diff --git a/tests/service/data/SyntaxTree/Type/With 05.fs.bsl b/tests/service/data/SyntaxTree/Type/With 05.fs.bsl new file mode 100644 index 00000000000..fd2c9b7ae7f --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/With 05.fs.bsl @@ -0,0 +1,29 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/With 05.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,4), FSharp.Compiler.Xml.XmlDocCollector), + None, (4,6--4,7), { BarRange = Some (4,4--4,5) })], + (4,4--4,7)), (4,4--4,7)), [], None, (3,5--4,7), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = Some (4,8--4,12) })], (3,0--4,7))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--4,7), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(6,0)-(6,6) 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. +(6,0)-(6,6) parse error Unexpected keyword 'member' in definition. Expected incomplete structured construct at or before this point or other token. diff --git a/vsintegration/tests/FSharp.Editor.Tests/DocumentDiagnosticAnalyzerTests.fs b/vsintegration/tests/FSharp.Editor.Tests/DocumentDiagnosticAnalyzerTests.fs index ed6b6091e7c..8f8dbd37189 100644 --- a/vsintegration/tests/FSharp.Editor.Tests/DocumentDiagnosticAnalyzerTests.fs +++ b/vsintegration/tests/FSharp.Editor.Tests/DocumentDiagnosticAnalyzerTests.fs @@ -129,16 +129,6 @@ let b = expectedMessage = "Incomplete structured construct at or before this point in binding" ) - [] - member public this.Error_Type_WithoutName() = - this.VerifyErrorBetweenMarkers( - fileContents = - """ -type (*start*)=(*end*) - """, - expectedMessage = "Unexpected symbol '=' in type name" - ) - [] member public this.AbstractClasses_Constructors_PositiveTests_1() = this.VerifyNoErrors( From ab0e704431b9a800703af71dee17a8e2ddcb0672 Mon Sep 17 00:00:00 2001 From: njlr Date: Mon, 19 Jun 2023 21:39:16 +0000 Subject: [PATCH 2/6] Fix suggested overload from "MergeSource" to "MergeSources" (#15306) * Fix suggested overload from "MergeSource" to "MergeSources" The current error message for when `and!` is used, but an appropriate builder overload is not defined, is incorrect. It suggests adding a `MergeSource` method but it should be called `MergeSources`. * Update ComputationExpressions.fs * Refresh xlf --- DEVGUIDE.md | 6 ++++++ src/Compiler/FSComp.txt | 2 +- src/Compiler/xlf/FSComp.txt.cs.xlf | 4 ++-- src/Compiler/xlf/FSComp.txt.de.xlf | 4 ++-- src/Compiler/xlf/FSComp.txt.es.xlf | 4 ++-- src/Compiler/xlf/FSComp.txt.fr.xlf | 4 ++-- src/Compiler/xlf/FSComp.txt.it.xlf | 4 ++-- src/Compiler/xlf/FSComp.txt.ja.xlf | 4 ++-- src/Compiler/xlf/FSComp.txt.ko.xlf | 4 ++-- src/Compiler/xlf/FSComp.txt.pl.xlf | 4 ++-- src/Compiler/xlf/FSComp.txt.pt-BR.xlf | 4 ++-- src/Compiler/xlf/FSComp.txt.ru.xlf | 4 ++-- src/Compiler/xlf/FSComp.txt.tr.xlf | 4 ++-- src/Compiler/xlf/FSComp.txt.zh-Hans.xlf | 4 ++-- src/Compiler/xlf/FSComp.txt.zh-Hant.xlf | 4 ++-- .../Conformance/DataExpressions/ComputationExpressions.fs | 2 +- 16 files changed, 34 insertions(+), 28 deletions(-) diff --git a/DEVGUIDE.md b/DEVGUIDE.md index 49e04803ec4..1511ef391e6 100644 --- a/DEVGUIDE.md +++ b/DEVGUIDE.md @@ -147,6 +147,12 @@ If you are on a Mac, you can run this command from the root of the repository: sh build.sh -c Release ``` +Or if you are on Linux: + +```shell +./build.sh -c Release +``` + ## Updating baselines in tests Some tests use "baseline" (.bsl) files. There is sometimes a way to update these baselines en-masse in your local build, diff --git a/src/Compiler/FSComp.txt b/src/Compiler/FSComp.txt index 6aa808c45aa..ea9dd8db5f4 100644 --- a/src/Compiler/FSComp.txt +++ b/src/Compiler/FSComp.txt @@ -1519,7 +1519,7 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl 3302,packageManagementRequiresVFive,"The 'package management' feature requires language version 5.0 or above" 3303,fromEndSlicingRequiresVFive,"The 'from the end slicing' feature requires language version 'preview'." 3304,poundiNotSupportedByRegisteredDependencyManagers,"#i is not supported by the registered PackageManagers" -3343,tcRequireMergeSourcesOrBindN,"The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '%s' method or appropriate 'MergeSource' and 'Bind' methods" +3343,tcRequireMergeSourcesOrBindN,"The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '%s' method or appropriate 'MergeSources' and 'Bind' methods" 3344,tcAndBangNotSupported,"This feature is not supported in this version of F#. You may need to add /langversion:preview to use this feature." 3345,tcInvalidUseBangBindingNoAndBangs,"use! may not be combined with and!" 3350,chkFeatureNotLanguageSupported,"Feature '%s' is not available in F# %s. Please use language version %s or greater." diff --git a/src/Compiler/xlf/FSComp.txt.cs.xlf b/src/Compiler/xlf/FSComp.txt.cs.xlf index 6e2ca9b5231..29ad3dc4133 100644 --- a/src/Compiler/xlf/FSComp.txt.cs.xlf +++ b/src/Compiler/xlf/FSComp.txt.cs.xlf @@ -1153,8 +1153,8 @@ - The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods - Konstrukt let! ... and! ... se dá použít jen v případě, že tvůrce výpočetních výrazů definuje buď metodu {0}, nebo vhodné metody MergeSource a Bind. + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods + Konstrukt let! ... and! ... se dá použít jen v případě, že tvůrce výpočetních výrazů definuje buď metodu {0}, nebo vhodné metody MergeSource a Bind. diff --git a/src/Compiler/xlf/FSComp.txt.de.xlf b/src/Compiler/xlf/FSComp.txt.de.xlf index c7a067332b5..085d23674b9 100644 --- a/src/Compiler/xlf/FSComp.txt.de.xlf +++ b/src/Compiler/xlf/FSComp.txt.de.xlf @@ -1153,8 +1153,8 @@ - The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods - Das Konstrukt "let! ... and! ..." kann nur verwendet werden, wenn der Berechnungsausdrucks-Generator entweder eine {0}-Methode oder geeignete MergeSource- und Bind-Methoden definiert. + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods + Das Konstrukt "let! ... and! ..." kann nur verwendet werden, wenn der Berechnungsausdrucks-Generator entweder eine {0}-Methode oder geeignete MergeSource- und Bind-Methoden definiert. diff --git a/src/Compiler/xlf/FSComp.txt.es.xlf b/src/Compiler/xlf/FSComp.txt.es.xlf index 6cdfce98c03..2bbd1384420 100644 --- a/src/Compiler/xlf/FSComp.txt.es.xlf +++ b/src/Compiler/xlf/FSComp.txt.es.xlf @@ -1153,8 +1153,8 @@ - The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods - La construcción "let! ... and! ..." solo se puede usar si el generador de expresiones de cálculo define un método "{0}" o bien los métodos "MergeSource" y "Bind" adecuados. + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods + La construcción "let! ... and! ..." solo se puede usar si el generador de expresiones de cálculo define un método "{0}" o bien los métodos "MergeSource" y "Bind" adecuados. diff --git a/src/Compiler/xlf/FSComp.txt.fr.xlf b/src/Compiler/xlf/FSComp.txt.fr.xlf index f5cc4b1a8fe..acba8d9e9cb 100644 --- a/src/Compiler/xlf/FSComp.txt.fr.xlf +++ b/src/Compiler/xlf/FSComp.txt.fr.xlf @@ -1153,8 +1153,8 @@ - The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods - La construction 'let! ... and! ...' peut uniquement être utilisée si le générateur d'expressions de calcul définit une méthode '{0}' ou les méthodes 'MergeSource' et 'Bind' appropriées + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods + La construction 'let! ... and! ...' peut uniquement être utilisée si le générateur d'expressions de calcul définit une méthode '{0}' ou les méthodes 'MergeSource' et 'Bind' appropriées diff --git a/src/Compiler/xlf/FSComp.txt.it.xlf b/src/Compiler/xlf/FSComp.txt.it.xlf index e4a1a9a2d44..6e03e4d2668 100644 --- a/src/Compiler/xlf/FSComp.txt.it.xlf +++ b/src/Compiler/xlf/FSComp.txt.it.xlf @@ -1153,8 +1153,8 @@ - The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods - È possibile usare il costrutto 'let! ... and! ...' solo se il generatore di espressioni di calcolo definisce un metodo '{0}' o metodi 'MergeSource' e 'Bind' appropriati + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods + È possibile usare il costrutto 'let! ... and! ...' solo se il generatore di espressioni di calcolo definisce un metodo '{0}' o metodi 'MergeSource' e 'Bind' appropriati diff --git a/src/Compiler/xlf/FSComp.txt.ja.xlf b/src/Compiler/xlf/FSComp.txt.ja.xlf index 0508471758d..20f49a8a710 100644 --- a/src/Compiler/xlf/FSComp.txt.ja.xlf +++ b/src/Compiler/xlf/FSComp.txt.ja.xlf @@ -1153,8 +1153,8 @@ - The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods - 'let! ... and! ...' コンストラクトは、コンピュテーション式ビルダーが '{0}' メソッドまたは適切な 'MergeSource' および 'Bind' メソッドのいずれかを定義している場合にのみ使用できます + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods + 'let! ... and! ...' コンストラクトは、コンピュテーション式ビルダーが '{0}' メソッドまたは適切な 'MergeSource' および 'Bind' メソッドのいずれかを定義している場合にのみ使用できます diff --git a/src/Compiler/xlf/FSComp.txt.ko.xlf b/src/Compiler/xlf/FSComp.txt.ko.xlf index e98bb588acc..181956f1483 100644 --- a/src/Compiler/xlf/FSComp.txt.ko.xlf +++ b/src/Compiler/xlf/FSComp.txt.ko.xlf @@ -1153,8 +1153,8 @@ - The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods - 'let! ... and! ...' 구문은 계산 식 작성기에서 '{0}' 메서드 또는 적절한 'MergeSource' 및 'Bind' 메서드를 정의한 경우에만 사용할 수 있습니다. + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods + 'let! ... and! ...' 구문은 계산 식 작성기에서 '{0}' 메서드 또는 적절한 'MergeSource' 및 'Bind' 메서드를 정의한 경우에만 사용할 수 있습니다. diff --git a/src/Compiler/xlf/FSComp.txt.pl.xlf b/src/Compiler/xlf/FSComp.txt.pl.xlf index bf8459b7db8..8875b97406b 100644 --- a/src/Compiler/xlf/FSComp.txt.pl.xlf +++ b/src/Compiler/xlf/FSComp.txt.pl.xlf @@ -1153,8 +1153,8 @@ - The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods - Konstrukcji „let! ... and! ...” można użyć tylko wtedy, gdy konstruktor wyrażeń obliczeniowych definiuje metodę „{0}” lub odpowiednie metody „MergeSource” i „Bind” + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods + Konstrukcji „let! ... and! ...” można użyć tylko wtedy, gdy konstruktor wyrażeń obliczeniowych definiuje metodę „{0}” lub odpowiednie metody „MergeSource” i „Bind” diff --git a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf index 0deccc83bdd..c189da58d6f 100644 --- a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf +++ b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf @@ -1153,8 +1153,8 @@ - The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods - O constructo 'let! ... and! ...' só pode ser usado se o construtor de expressões de computação definir um método '{0}' ou um método 'MergeSource' ou 'Bind' apropriado + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods + O constructo 'let! ... and! ...' só pode ser usado se o construtor de expressões de computação definir um método '{0}' ou um método 'MergeSource' ou 'Bind' apropriado diff --git a/src/Compiler/xlf/FSComp.txt.ru.xlf b/src/Compiler/xlf/FSComp.txt.ru.xlf index 82806d6d1b9..3f6494c7bae 100644 --- a/src/Compiler/xlf/FSComp.txt.ru.xlf +++ b/src/Compiler/xlf/FSComp.txt.ru.xlf @@ -1153,8 +1153,8 @@ - The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods - Конструкцию "let! ... and! ..." можно использовать только в том случае, если построитель выражений с вычислениями определяет либо метод "{0}", либо соответствующие методы "MergeSource" и "Bind" + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods + Конструкцию "let! ... and! ..." можно использовать только в том случае, если построитель выражений с вычислениями определяет либо метод "{0}", либо соответствующие методы "MergeSource" и "Bind" diff --git a/src/Compiler/xlf/FSComp.txt.tr.xlf b/src/Compiler/xlf/FSComp.txt.tr.xlf index c106b39622a..1e15ee5ed02 100644 --- a/src/Compiler/xlf/FSComp.txt.tr.xlf +++ b/src/Compiler/xlf/FSComp.txt.tr.xlf @@ -1153,8 +1153,8 @@ - The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods - 'let! ... and! ...' yapısı, yalnızca hesaplama ifadesi oluşturucu bir '{0}' metodunu ya da uygun 'MergeSource' ve 'Bind' metotlarını tanımlarsa kullanılabilir + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods + 'let! ... and! ...' yapısı, yalnızca hesaplama ifadesi oluşturucu bir '{0}' metodunu ya da uygun 'MergeSource' ve 'Bind' metotlarını tanımlarsa kullanılabilir diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf index c2911c4696d..ff5d2bd0db1 100644 --- a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf @@ -1153,8 +1153,8 @@ - The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods - 仅当计算表达式生成器定义了 "{0}" 方法或适当的 "MergeSource" 和 "Bind" 方法时,才可以使用 "let! ... and! ..." 构造 + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods + 仅当计算表达式生成器定义了 "{0}" 方法或适当的 "MergeSource" 和 "Bind" 方法时,才可以使用 "let! ... and! ..." 构造 diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf index a495354d5b2..1d505290f73 100644 --- a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf @@ -1153,8 +1153,8 @@ - The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods - 只有在計算運算式產生器定義 '{0}' 方法或正確的 'MergeSource' 和 'Bind' 方法時,才可使用 'let! ... and! ...' 建構 + The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods + 只有在計算運算式產生器定義 '{0}' 方法或正確的 'MergeSource' 和 'Bind' 方法時,才可使用 'let! ... and! ...' 建構 diff --git a/tests/fsharp/Compiler/Conformance/DataExpressions/ComputationExpressions.fs b/tests/fsharp/Compiler/Conformance/DataExpressions/ComputationExpressions.fs index c398a4f3293..09b64c6cb70 100644 --- a/tests/fsharp/Compiler/Conformance/DataExpressions/ComputationExpressions.fs +++ b/tests/fsharp/Compiler/Conformance/DataExpressions/ComputationExpressions.fs @@ -583,7 +583,7 @@ let _ = return x + y } """ - [|(FSharpDiagnosticSeverity.Error, 3343, (6, 9, 6, 25), "The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a 'Bind2' method or appropriate 'MergeSource' and 'Bind' methods")|] + [|(FSharpDiagnosticSeverity.Error, 3343, (6, 9, 6, 25), "The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a 'Bind2' method or appropriate 'MergeSources' and 'Bind' methods")|] [] let ``AndBang Negative TraceApplicative missing Bind and BindReturn`` () = From 325d6f463173aea5e55a167db12f694814d08f1f Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Tue, 20 Jun 2023 12:13:56 +0200 Subject: [PATCH 3/6] Parser: recover on unfinished namespaces and top level modules (#15439) Co-authored-by: Tomas Grosup --- src/Compiler/pars.fsy | 13 ++++++++-- .../ModuleOrNamespace/Anon module 01.fs | 1 + .../ModuleOrNamespace/Anon module 01.fs.bsl | 12 ++++++++++ .../ModuleOrNamespace/Anon module 02.fsx | 1 + .../ModuleOrNamespace/Anon module 02.fsx.bsl | 10 ++++++++ .../SyntaxTree/ModuleOrNamespace/Module 05.fs | 3 +++ .../ModuleOrNamespace/Module 05.fs.bsl | 12 ++++++++++ .../SyntaxTree/ModuleOrNamespace/Module 06.fs | 3 +++ .../ModuleOrNamespace/Module 06.fs.bsl | 12 ++++++++++ .../SyntaxTree/ModuleOrNamespace/Module 07.fs | 3 +++ .../ModuleOrNamespace/Module 07.fs.bsl | 12 ++++++++++ .../ModuleOrNamespace/Namespace 01.fs | 7 ++++++ .../ModuleOrNamespace/Namespace 01.fs.bsl | 14 +++++++++++ .../ModuleOrNamespace/Namespace 02.fs | 7 ++++++ .../ModuleOrNamespace/Namespace 02.fs.bsl | 16 +++++++++++++ .../ModuleOrNamespace/Namespace 03.fs | 7 ++++++ .../ModuleOrNamespace/Namespace 03.fs.bsl | 16 +++++++++++++ .../ModuleOrNamespace/Namespace 04.fs | 7 ++++++ .../ModuleOrNamespace/Namespace 04.fs.bsl | 16 +++++++++++++ .../ModuleOrNamespace/Namespace 05.fs | 1 + .../ModuleOrNamespace/Namespace 05.fs.bsl | 9 +++++++ .../ModuleOrNamespace/Namespace 06.fs | 3 +++ .../ModuleOrNamespace/Namespace 06.fs.bsl | 12 ++++++++++ .../ModuleOrNamespace/Namespace 07.fs | 3 +++ .../ModuleOrNamespace/Namespace 07.fs.bsl | 24 +++++++++++++++++++ .../ModuleOrNamespace/Namespace 08.fs | 1 + .../ModuleOrNamespace/Namespace 08.fs.bsl | 9 +++++++ .../ModuleOrNamespace/Namespace 09.fs | 7 ++++++ .../ModuleOrNamespace/Namespace 09.fs.bsl | 16 +++++++++++++ 29 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx.bsl create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs.bsl create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs.bsl create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs.bsl create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs.bsl create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs.bsl create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs.bsl create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs.bsl create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs.bsl create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs.bsl create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs.bsl create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs create mode 100644 tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs.bsl diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 46f9a1e7c74..da62e142c25 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -527,6 +527,11 @@ moduleIntro: let mModule = rhs parseState 1 mModule, $4, [], $3, $2 } + | moduleKeyword opt_attributes opt_access opt_rec recover + { if not (isNil $2) then + parseState.LexBuffer.CheckLanguageFeatureAndRecover LanguageFeature.AttributesToRightOfModuleKeyword (rhs parseState 4) + let mModule = rhs parseState 1 + mModule, $4, [], $3, $2 } /* The start of a namespace declaration */ namespaceIntro: @@ -534,6 +539,10 @@ namespaceIntro: { let mNamespace = rhs parseState 1 mNamespace, $2, $3.LongIdent, grabXmlDoc(parseState, [], 1) } + | NAMESPACE opt_rec recover + { let mNamespace = rhs parseState 1 + mNamespace, $2, [], grabXmlDoc(parseState, [], 1) } + /* The contents of a signature file */ fileNamespaceSpecs: @@ -1138,8 +1147,8 @@ fileModuleImpl: | moduleDefnsOrExprPossiblyEmptyOrBlock { let m = (rhs parseState 1) (fun (mNamespaceOpt, isRec, path, xml) -> - match path with - | [] -> ParsedImplFileFragment.AnonModule($1, m) + match path, mNamespaceOpt with + | [], None -> ParsedImplFileFragment.AnonModule($1, m) | _ -> let lastDeclRange = List.tryLast $1 |> Option.map (fun decl -> decl.Range) |> Option.defaultValue (rhs parseState 1) let m = mkRange lastDeclRange.FileName (lhs parseState).Start lastDeclRange.End diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs new file mode 100644 index 00000000000..6a452c185a8 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs @@ -0,0 +1 @@ +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs.bsl new file mode 100644 index 00000000000..11fc84ec748 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs.bsl @@ -0,0 +1,12 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Anon module 01.fs", false, + QualifiedNameOfFile Anon module 01, [], [], + [SynModuleOrNamespace + ([Anon module 01], false, AnonModule, + [Expr (Const (Unit, (1,0--1,2)), (1,0--1,2))], PreXmlDocEmpty, [], + None, (1,0--1,2), { LeadingKeyword = None })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(1,0)-(1,2) parse warning The declarations in this file will be placed in an implicit module 'Anon module 01' based on the file name 'Anon module 01.fs'. However this is not a valid F# identifier, so the contents will not be accessible from other files. Consider renaming the file or adding a 'module' or 'namespace' declaration at the top of the file. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx new file mode 100644 index 00000000000..6a452c185a8 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx @@ -0,0 +1 @@ +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx.bsl new file mode 100644 index 00000000000..448d9bae968 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx.bsl @@ -0,0 +1,10 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Anon module 02.fsx", true, + QualifiedNameOfFile Anon module 02$fsx, [], [], + [SynModuleOrNamespace + ([Anon module 02], false, AnonModule, + [Expr (Const (Unit, (1,0--1,2)), (1,0--1,2))], PreXmlDocEmpty, [], + None, (1,0--1,2), { LeadingKeyword = None })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs new file mode 100644 index 00000000000..9053e9990a6 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs @@ -0,0 +1,3 @@ +module A. + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs.bsl new file mode 100644 index 00000000000..6f4c8c701d5 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs.bsl @@ -0,0 +1,12 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Module 05.fs", false, QualifiedNameOfFile A, [], + [], + [SynModuleOrNamespace + ([A], false, NamedModule, [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,0)-(3,1) parse error Unexpected start of structured construct in definition diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs new file mode 100644 index 00000000000..1fd0e50bfe2 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs @@ -0,0 +1,3 @@ +module + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs.bsl new file mode 100644 index 00000000000..ec0cd02e4ce --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs.bsl @@ -0,0 +1,12 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Module 06.fs", false, QualifiedNameOfFile , [], + [], + [SynModuleOrNamespace + ([], false, NamedModule, [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,0)-(3,1) parse error Unexpected start of structured construct in definition. Expected identifier, 'global' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs new file mode 100644 index 00000000000..2b59158a738 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs @@ -0,0 +1,3 @@ +module rec + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs.bsl new file mode 100644 index 00000000000..b52a7bcdbf4 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs.bsl @@ -0,0 +1,12 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Module 07.fs", false, QualifiedNameOfFile , [], + [], + [SynModuleOrNamespace + ([], true, NamedModule, [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,0)-(3,1) parse error Unexpected start of structured construct in definition. Expected identifier, 'global' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs new file mode 100644 index 00000000000..ec0afe0579f --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs @@ -0,0 +1,7 @@ +namespace Ns1 + +() + +namespace Ns2.Nested + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs.bsl new file mode 100644 index 00000000000..d4bb61b979b --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs.bsl @@ -0,0 +1,14 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 01.fs", false, + QualifiedNameOfFile Namespace 01, [], [], + [SynModuleOrNamespace + ([Ns1], false, DeclaredNamespace, + [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], PreXmlDocEmpty, [], + None, (1,0--3,2), { LeadingKeyword = Namespace (1,0--1,9) }); + SynModuleOrNamespace + ([Ns2; Nested], false, DeclaredNamespace, + [Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))], PreXmlDocEmpty, [], + None, (5,0--7,2), { LeadingKeyword = Namespace (5,0--5,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs new file mode 100644 index 00000000000..8bd14088ef7 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs @@ -0,0 +1,7 @@ +namespace Ns1 + +() + +namespace + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs.bsl new file mode 100644 index 00000000000..1e5985485f2 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs.bsl @@ -0,0 +1,16 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 02.fs", false, + QualifiedNameOfFile Namespace 02, [], [], + [SynModuleOrNamespace + ([Ns1], false, DeclaredNamespace, + [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], PreXmlDocEmpty, [], + None, (1,0--3,2), { LeadingKeyword = Namespace (1,0--1,9) }); + SynModuleOrNamespace + ([], false, DeclaredNamespace, + [Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))], PreXmlDocEmpty, [], + None, (5,0--7,2), { LeadingKeyword = Namespace (5,0--5,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(7,0)-(7,1) parse error Unexpected start of structured construct in implementation file. Expected identifier, 'global' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs new file mode 100644 index 00000000000..a0296f7213f --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs @@ -0,0 +1,7 @@ +namespace Ns1 + +() + +namespace Ns2. + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs.bsl new file mode 100644 index 00000000000..c822d41e48f --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs.bsl @@ -0,0 +1,16 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 03.fs", false, + QualifiedNameOfFile Namespace 03, [], [], + [SynModuleOrNamespace + ([Ns1], false, DeclaredNamespace, + [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], PreXmlDocEmpty, [], + None, (1,0--3,2), { LeadingKeyword = Namespace (1,0--1,9) }); + SynModuleOrNamespace + ([Ns2], false, DeclaredNamespace, + [Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))], PreXmlDocEmpty, [], + None, (5,0--7,2), { LeadingKeyword = Namespace (5,0--5,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(7,0)-(7,1) parse error Unexpected start of structured construct in implementation file diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs new file mode 100644 index 00000000000..e530ec3a65f --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs @@ -0,0 +1,7 @@ +namespace Ns1 + +() + +namespace rec + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs.bsl new file mode 100644 index 00000000000..e012c095c25 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs.bsl @@ -0,0 +1,16 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 04.fs", false, + QualifiedNameOfFile Namespace 04, [], [], + [SynModuleOrNamespace + ([Ns1], false, DeclaredNamespace, + [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], PreXmlDocEmpty, [], + None, (1,0--3,2), { LeadingKeyword = Namespace (1,0--1,9) }); + SynModuleOrNamespace + ([], true, DeclaredNamespace, + [Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))], PreXmlDocEmpty, [], + None, (5,0--7,2), { LeadingKeyword = Namespace (5,0--5,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(7,0)-(7,1) parse error Unexpected start of structured construct in implementation file. Expected identifier, 'global' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs new file mode 100644 index 00000000000..f6907897f6d --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs @@ -0,0 +1 @@ +namespace diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs.bsl new file mode 100644 index 00000000000..a41e32b6583 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs.bsl @@ -0,0 +1,9 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 05.fs", false, + QualifiedNameOfFile Namespace 05, [], [], + [SynModuleOrNamespace + ([], false, DeclaredNamespace, [], PreXmlDocEmpty, [], None, (1,0--2,0), + { LeadingKeyword = Namespace (1,0--1,9) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs new file mode 100644 index 00000000000..e46c3d5e0ee --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs @@ -0,0 +1,3 @@ +namespace + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs.bsl new file mode 100644 index 00000000000..06fd6804862 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs.bsl @@ -0,0 +1,12 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 06.fs", false, + QualifiedNameOfFile Namespace 06, [], [], + [SynModuleOrNamespace + ([], false, DeclaredNamespace, + [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], PreXmlDocEmpty, [], + None, (1,0--3,2), { LeadingKeyword = Namespace (1,0--1,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,0)-(3,1) parse error Unexpected start of structured construct in implementation file. Expected identifier, 'global' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs new file mode 100644 index 00000000000..deec48716dc --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs @@ -0,0 +1,3 @@ +namespace + +type T = int diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs.bsl new file mode 100644 index 00000000000..904371c96d7 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs.bsl @@ -0,0 +1,24 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 07.fs", false, + QualifiedNameOfFile Namespace 07, [], [], + [SynModuleOrNamespace + ([], false, DeclaredNamespace, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [T], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (3,9--3,12)), (3,9--3,12)), [], None, (3,5--3,12), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--3,12))], PreXmlDocEmpty, [], + None, (1,0--3,12), { LeadingKeyword = Namespace (1,0--1,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,0)-(3,4) parse error Unexpected start of structured construct in implementation file. Expected identifier, 'global' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs new file mode 100644 index 00000000000..f01fc466bef --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs @@ -0,0 +1 @@ +namespace rec diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs.bsl new file mode 100644 index 00000000000..35984038851 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs.bsl @@ -0,0 +1,9 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 08.fs", false, + QualifiedNameOfFile Namespace 08, [], [], + [SynModuleOrNamespace + ([], true, DeclaredNamespace, [], PreXmlDocEmpty, [], None, (1,0--2,0), + { LeadingKeyword = Namespace (1,0--1,9) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs new file mode 100644 index 00000000000..fd6ffe6cf53 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs @@ -0,0 +1,7 @@ +namespace + +() + +namespace Ns2 + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs.bsl new file mode 100644 index 00000000000..c6f1e667ff6 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs.bsl @@ -0,0 +1,16 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 09.fs", false, + QualifiedNameOfFile Namespace 09, [], [], + [SynModuleOrNamespace + ([], false, DeclaredNamespace, + [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], PreXmlDocEmpty, [], + None, (1,0--3,2), { LeadingKeyword = Namespace (1,0--1,9) }); + SynModuleOrNamespace + ([Ns2], false, DeclaredNamespace, + [Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))], PreXmlDocEmpty, [], + None, (5,0--7,2), { LeadingKeyword = Namespace (5,0--5,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,0)-(3,1) parse error Unexpected start of structured construct in implementation file. Expected identifier, 'global' or other token. From f9e66b494f98560493e537b4498c7a9dd8ffed4f Mon Sep 17 00:00:00 2001 From: Florian Verdonck Date: Tue, 20 Jun 2023 14:32:57 +0200 Subject: [PATCH 4/6] Update FCS NuGet preview feeds (#15446) --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f9f4bbcd7b3..be1f103e9ef 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,21 @@ Even if you find a single-character typo, we're happy to take the change! Althou ## Per-build NuGet packages -Per-build [versions](https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-tools&view=versions&package=FSharp.Compiler.Service&protocolType=NuGet) of our NuGet packages are available via this URL: `https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json` +### 7.0.40x series + +[FSharp.Compiler.Service 43.7.400-preview](https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet7/NuGet/FSharp.Compiler.Service/versions/) + +```xml + +``` + +### 8.0.10x series + +[FSharp.Compiler.Service 43.8.100-preview](https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet8/NuGet/FSharp.Compiler.Service/versions/) + +```xml + +``` ## Branches From 84d5c0357fbd029f23072ccf32ca6a29c0124693 Mon Sep 17 00:00:00 2001 From: Florian Verdonck Date: Tue, 20 Jun 2023 18:24:39 +0200 Subject: [PATCH 5/6] Included existing NoWarn value (#15444) --- src/FSharp.Build/FSharp.Build.fsproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FSharp.Build/FSharp.Build.fsproj b/src/FSharp.Build/FSharp.Build.fsproj index 0b477a0c387..f8fbc7138ef 100644 --- a/src/FSharp.Build/FSharp.Build.fsproj +++ b/src/FSharp.Build/FSharp.Build.fsproj @@ -10,7 +10,7 @@ $(NoWarn);75 true $(DefineConstants);LOCALIZATION_FSBUILD - NU1701;FS0075 + $(NoWarn);NU1701;FS0075 true 7.0 Debug;Release;Proto;ReleaseCompressed From a22ab7c969f384c436648d3de8be71e868673e38 Mon Sep 17 00:00:00 2001 From: Florian Verdonck Date: Tue, 20 Jun 2023 19:16:42 +0200 Subject: [PATCH 6/6] Update error message of parsMultipleAccessibilitiesForGetSet (#15424) Co-authored-by: Kevin Ransom (msft) --- src/Compiler/FSComp.txt | 2 +- src/Compiler/xlf/FSComp.txt.cs.xlf | 4 +- src/Compiler/xlf/FSComp.txt.de.xlf | 4 +- src/Compiler/xlf/FSComp.txt.es.xlf | 4 +- src/Compiler/xlf/FSComp.txt.fr.xlf | 4 +- src/Compiler/xlf/FSComp.txt.it.xlf | 4 +- src/Compiler/xlf/FSComp.txt.ja.xlf | 4 +- src/Compiler/xlf/FSComp.txt.ko.xlf | 4 +- src/Compiler/xlf/FSComp.txt.pl.xlf | 4 +- src/Compiler/xlf/FSComp.txt.pt-BR.xlf | 4 +- src/Compiler/xlf/FSComp.txt.ru.xlf | 4 +- src/Compiler/xlf/FSComp.txt.tr.xlf | 4 +- src/Compiler/xlf/FSComp.txt.zh-Hans.xlf | 4 +- src/Compiler/xlf/FSComp.txt.zh-Hant.xlf | 4 +- .../OnTypeMembers/OnTypeMembers.fs | 4 +- .../data/SyntaxTree/Member/GetSetMember 01.fs | 5 + .../SyntaxTree/Member/GetSetMember 01.fs.bsl | 208 ++++++++++++++++++ 17 files changed, 242 insertions(+), 29 deletions(-) create mode 100644 tests/service/data/SyntaxTree/Member/GetSetMember 01.fs create mode 100644 tests/service/data/SyntaxTree/Member/GetSetMember 01.fs.bsl diff --git a/src/Compiler/FSComp.txt b/src/Compiler/FSComp.txt index ea9dd8db5f4..6bcea07ddc1 100644 --- a/src/Compiler/FSComp.txt +++ b/src/Compiler/FSComp.txt @@ -421,7 +421,7 @@ parsAttributesMustComeBeforeVal,"Attributes should be placed before 'val'" 555,parsGetAndOrSetRequired,"'get' and/or 'set' required" 556,parsTypeAnnotationsOnGetSet,"Type annotations on property getters and setters must be given after the 'get()' or 'set(v)', e.g. 'with get() : string = ...'" 557,parsGetterMustHaveAtLeastOneArgument,"A getter property is expected to be a function, e.g. 'get() = ...' or 'get(index) = ...'" -558,parsMultipleAccessibilitiesForGetSet,"Multiple accessibilities given for property getter or setter" +558,parsMultipleAccessibilitiesForGetSet,"When the visibility for a property is specified, setting the visibility of the set or get method is not allowed." 559,parsSetSyntax,"Property setters must be defined using 'set value = ', 'set idx value = ' or 'set (idx1,...,idxN) value = ... '" 560,parsInterfacesHaveSameVisibilityAsEnclosingType,"Interfaces always have the same visibility as the enclosing type" 561,parsAccessibilityModsIllegalForAbstract,"Accessibility modifiers are not allowed on this member. Abstract slots always have the same visibility as the enclosing type." diff --git a/src/Compiler/xlf/FSComp.txt.cs.xlf b/src/Compiler/xlf/FSComp.txt.cs.xlf index 29ad3dc4133..e2ada2aeefc 100644 --- a/src/Compiler/xlf/FSComp.txt.cs.xlf +++ b/src/Compiler/xlf/FSComp.txt.cs.xlf @@ -3283,8 +3283,8 @@ - Multiple accessibilities given for property getter or setter - Zadali jste víc dostupností pro metodu getter nebo setter vlastnosti. + When the visibility for a property is specified, setting the visibility of the set or get method is not allowed. + Zadali jste víc dostupností pro metodu getter nebo setter vlastnosti. diff --git a/src/Compiler/xlf/FSComp.txt.de.xlf b/src/Compiler/xlf/FSComp.txt.de.xlf index 085d23674b9..df2b1f967f0 100644 --- a/src/Compiler/xlf/FSComp.txt.de.xlf +++ b/src/Compiler/xlf/FSComp.txt.de.xlf @@ -3283,8 +3283,8 @@ - Multiple accessibilities given for property getter or setter - Für den Getter oder Setter der Eigenschaft wurden mehrere Zugriffsebenen angegeben. + When the visibility for a property is specified, setting the visibility of the set or get method is not allowed. + Für den Getter oder Setter der Eigenschaft wurden mehrere Zugriffsebenen angegeben. diff --git a/src/Compiler/xlf/FSComp.txt.es.xlf b/src/Compiler/xlf/FSComp.txt.es.xlf index 2bbd1384420..0c480da0223 100644 --- a/src/Compiler/xlf/FSComp.txt.es.xlf +++ b/src/Compiler/xlf/FSComp.txt.es.xlf @@ -3283,8 +3283,8 @@ - Multiple accessibilities given for property getter or setter - Se proporcionaron varias accesibilidades para un captador o establecedor de propiedad. + When the visibility for a property is specified, setting the visibility of the set or get method is not allowed. + Se proporcionaron varias accesibilidades para un captador o establecedor de propiedad. diff --git a/src/Compiler/xlf/FSComp.txt.fr.xlf b/src/Compiler/xlf/FSComp.txt.fr.xlf index acba8d9e9cb..fb6f9624aa8 100644 --- a/src/Compiler/xlf/FSComp.txt.fr.xlf +++ b/src/Compiler/xlf/FSComp.txt.fr.xlf @@ -3283,8 +3283,8 @@ - Multiple accessibilities given for property getter or setter - Plusieurs accessibilités fournies pour la méthode getter ou setter de la propriété + When the visibility for a property is specified, setting the visibility of the set or get method is not allowed. + Plusieurs accessibilités fournies pour la méthode getter ou setter de la propriété diff --git a/src/Compiler/xlf/FSComp.txt.it.xlf b/src/Compiler/xlf/FSComp.txt.it.xlf index 6e03e4d2668..2854baa4e04 100644 --- a/src/Compiler/xlf/FSComp.txt.it.xlf +++ b/src/Compiler/xlf/FSComp.txt.it.xlf @@ -3283,8 +3283,8 @@ - Multiple accessibilities given for property getter or setter - Sono state assegnate più accessibilità per il getter o il setter della proprietà + When the visibility for a property is specified, setting the visibility of the set or get method is not allowed. + Sono state assegnate più accessibilità per il getter o il setter della proprietà diff --git a/src/Compiler/xlf/FSComp.txt.ja.xlf b/src/Compiler/xlf/FSComp.txt.ja.xlf index 20f49a8a710..ea67c6bdb2b 100644 --- a/src/Compiler/xlf/FSComp.txt.ja.xlf +++ b/src/Compiler/xlf/FSComp.txt.ja.xlf @@ -3283,8 +3283,8 @@ - Multiple accessibilities given for property getter or setter - プロパティのゲッターまたはセッターに指定されたアクセシビリティが複数あります + When the visibility for a property is specified, setting the visibility of the set or get method is not allowed. + プロパティのゲッターまたはセッターに指定されたアクセシビリティが複数あります diff --git a/src/Compiler/xlf/FSComp.txt.ko.xlf b/src/Compiler/xlf/FSComp.txt.ko.xlf index 181956f1483..1a159133203 100644 --- a/src/Compiler/xlf/FSComp.txt.ko.xlf +++ b/src/Compiler/xlf/FSComp.txt.ko.xlf @@ -3283,8 +3283,8 @@ - Multiple accessibilities given for property getter or setter - 속성 getter 또는 setter에 대해 여러 액세스 가능성이 지정되었습니다. + When the visibility for a property is specified, setting the visibility of the set or get method is not allowed. + 속성 getter 또는 setter에 대해 여러 액세스 가능성이 지정되었습니다. diff --git a/src/Compiler/xlf/FSComp.txt.pl.xlf b/src/Compiler/xlf/FSComp.txt.pl.xlf index 8875b97406b..0000778b463 100644 --- a/src/Compiler/xlf/FSComp.txt.pl.xlf +++ b/src/Compiler/xlf/FSComp.txt.pl.xlf @@ -3283,8 +3283,8 @@ - Multiple accessibilities given for property getter or setter - Podano wiele dostępności dla metody ustawiającej lub metody pobierającej właściwość + When the visibility for a property is specified, setting the visibility of the set or get method is not allowed. + Podano wiele dostępności dla metody ustawiającej lub metody pobierającej właściwość diff --git a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf index c189da58d6f..6fd3039fa99 100644 --- a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf +++ b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf @@ -3283,8 +3283,8 @@ - Multiple accessibilities given for property getter or setter - Acessibilidades múltiplas fornecidas para getter ou setter de propriedade + When the visibility for a property is specified, setting the visibility of the set or get method is not allowed. + Acessibilidades múltiplas fornecidas para getter ou setter de propriedade diff --git a/src/Compiler/xlf/FSComp.txt.ru.xlf b/src/Compiler/xlf/FSComp.txt.ru.xlf index 3f6494c7bae..7fb971a92b9 100644 --- a/src/Compiler/xlf/FSComp.txt.ru.xlf +++ b/src/Compiler/xlf/FSComp.txt.ru.xlf @@ -3283,8 +3283,8 @@ - Multiple accessibilities given for property getter or setter - Задано несколько модификаторов доступности для метода получения или задания свойства + When the visibility for a property is specified, setting the visibility of the set or get method is not allowed. + Задано несколько модификаторов доступности для метода получения или задания свойства diff --git a/src/Compiler/xlf/FSComp.txt.tr.xlf b/src/Compiler/xlf/FSComp.txt.tr.xlf index 1e15ee5ed02..cbb50b53421 100644 --- a/src/Compiler/xlf/FSComp.txt.tr.xlf +++ b/src/Compiler/xlf/FSComp.txt.tr.xlf @@ -3283,8 +3283,8 @@ - Multiple accessibilities given for property getter or setter - Özellik alıcı veya ayarlayıcı için birden çok erişilebilirlik verildi + When the visibility for a property is specified, setting the visibility of the set or get method is not allowed. + Özellik alıcı veya ayarlayıcı için birden çok erişilebilirlik verildi diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf index ff5d2bd0db1..0d7b753c8b1 100644 --- a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf @@ -3283,8 +3283,8 @@ - Multiple accessibilities given for property getter or setter - 为属性 Getter 或 Setter 给定了多个可访问性 + When the visibility for a property is specified, setting the visibility of the set or get method is not allowed. + 为属性 Getter 或 Setter 给定了多个可访问性 diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf index 1d505290f73..ce97b003aac 100644 --- a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf @@ -3283,8 +3283,8 @@ - Multiple accessibilities given for property getter or setter - 為屬性 getter 或 setter 指定了多個存取範圍 + When the visibility for a property is specified, setting the visibility of the set or get method is not allowed. + 為屬性 getter 或 setter 指定了多個存取範圍 diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/AccessibilityAnnotations/OnTypeMembers/OnTypeMembers.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/AccessibilityAnnotations/OnTypeMembers/OnTypeMembers.fs index b59132ae142..0fbbe44a903 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/AccessibilityAnnotations/OnTypeMembers/OnTypeMembers.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/AccessibilityAnnotations/OnTypeMembers/OnTypeMembers.fs @@ -85,8 +85,8 @@ module AccessibilityAnnotations_OnTypeMembers = |> withDiagnostics [ (Error 10, Line 15, Col 49, Line 15, Col 50, "Unexpected symbol ')' in pattern") (Error 1244, Line 15, Col 48, Line 15, Col 50, "Attempted to parse this as an operator name, but failed") - (Error 558, Line 16, Col 36, Line 16, Col 50, "Multiple accessibilities given for property getter or setter") - (Error 558, Line 19, Col 35, Line 19, Col 56, "Multiple accessibilities given for property getter or setter") + (Error 558, Line 16, Col 36, Line 16, Col 50, "When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.") + (Error 558, Line 19, Col 35, Line 19, Col 56, "When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.") (Error 10, Line 20, Col 49, Line 20, Col 50, "Unexpected identifier in pattern") (Error 1244, Line 20, Col 48, Line 20, Col 57, "Attempted to parse this as an operator name, but failed") (Error 10, Line 23, Col 36, Line 23, Col 42, "Unexpected keyword 'public' in member definition") diff --git a/tests/service/data/SyntaxTree/Member/GetSetMember 01.fs b/tests/service/data/SyntaxTree/Member/GetSetMember 01.fs new file mode 100644 index 00000000000..9e8c571bc42 --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/GetSetMember 01.fs @@ -0,0 +1,5 @@ +module Foo + +type Foo() = + member f.X with internal get (key1, key2) = true and private set (key1, key2) value = () + member internal f.Y with get (key1, key2) = true and private set (key1, key2) value = () diff --git a/tests/service/data/SyntaxTree/Member/GetSetMember 01.fs.bsl b/tests/service/data/SyntaxTree/Member/GetSetMember 01.fs.bsl new file mode 100644 index 00000000000..3d88c0ff50d --- /dev/null +++ b/tests/service/data/SyntaxTree/Member/GetSetMember 01.fs.bsl @@ -0,0 +1,208 @@ +ImplFile + (ParsedImplFileInput + ("/root/Member/GetSetMember 01.fs", false, QualifiedNameOfFile Foo, [], [], + [SynModuleOrNamespace + ([Foo], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [Foo], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,8)), + ObjectModel + (Unspecified, + [ImplicitCtor + (None, [], SimplePats ([], [], (3,8--3,10)), None, + PreXmlDoc ((3,8), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,8), { AsKeyword = None }); + GetSetMember + (Some + (SynBinding + (None, Normal, false, false, [], + PreXmlMerge + (PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), PreXmlDocEmpty), + SynValData + (Some + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertyGet }, + SynValInfo + ([[SynArgInfo ([], false, None)]; + [SynArgInfo ([], false, Some key1); + SynArgInfo ([], false, Some key2)]], + SynArgInfo ([], false, None)), None), + LongIdent + (SynLongIdent + ([f; X], [(4,12--4,13)], [None; None]), + Some get, None, + Pats + [Paren + (Tuple + (false, + [Named + (SynIdent (key1, None), false, + None, (4,34--4,38)); + Named + (SynIdent (key2, None), false, + None, (4,40--4,44))], + [(4,38--4,39)], (4,34--4,44)), + (4,33--4,45))], + Some (Internal (4,20--4,28)), (4,20--4,45)), + None, Const (Bool true, (4,48--4,52)), + (4,20--4,45), NoneAtInvisible, + { LeadingKeyword = Member (4,4--4,10) + InlineKeyword = None + EqualsRange = Some (4,46--4,47) })), + Some + (SynBinding + (None, Normal, false, false, [], + PreXmlMerge + (PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector), PreXmlDocEmpty), + SynValData + (Some + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertySet }, + SynValInfo + ([[SynArgInfo ([], false, None)]; + [SynArgInfo ([], false, Some key1); + SynArgInfo ([], false, Some key2); + SynArgInfo ([], false, Some value)]], + SynArgInfo ([], false, None)), None), + LongIdent + (SynLongIdent + ([f; X], [(4,12--4,13)], [None; None]), + Some set, None, + Pats + [Tuple + (false, + [Named + (SynIdent (key1, None), false, None, + (4,70--4,74)); + Named + (SynIdent (key2, None), false, None, + (4,76--4,80)); + Named + (SynIdent (value, None), false, None, + (4,82--4,87))], [(4,74--4,75)], + (4,69--4,87))], + Some (Private (4,57--4,64)), (4,57--4,87)), + None, Const (Unit, (4,90--4,92)), (4,57--4,87), + NoneAtInvisible, + { LeadingKeyword = Member (4,4--4,10) + InlineKeyword = None + EqualsRange = Some (4,88--4,89) })), + (4,4--4,92), { InlineKeyword = None + WithKeyword = (4,15--4,19) + GetKeyword = Some (4,29--4,32) + AndKeyword = Some (4,53--4,56) + SetKeyword = Some (4,65--4,68) }); + GetSetMember + (Some + (SynBinding + (None, Normal, false, false, [], + PreXmlMerge + (PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), PreXmlDocEmpty), + SynValData + (Some + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertyGet }, + SynValInfo + ([[SynArgInfo ([], false, None)]; + [SynArgInfo ([], false, Some key1); + SynArgInfo ([], false, Some key2)]], + SynArgInfo ([], false, None)), None), + LongIdent + (SynLongIdent + ([f; Y], [(5,21--5,22)], [None; None]), + Some get, None, + Pats + [Paren + (Tuple + (false, + [Named + (SynIdent (key1, None), false, + None, (5,34--5,38)); + Named + (SynIdent (key2, None), false, + None, (5,40--5,44))], + [(5,38--5,39)], (5,34--5,44)), + (5,33--5,45))], + Some (Internal (5,11--5,19)), (5,29--5,45)), + None, Const (Bool true, (5,48--5,52)), + (5,29--5,45), NoneAtInvisible, + { LeadingKeyword = Member (5,4--5,10) + InlineKeyword = None + EqualsRange = Some (5,46--5,47) })), + Some + (SynBinding + (None, Normal, false, false, [], + PreXmlMerge + (PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), PreXmlDocEmpty), + SynValData + (Some + { IsInstance = true + IsDispatchSlot = false + IsOverrideOrExplicitImpl = false + IsFinal = false + GetterOrSetterIsCompilerGenerated = false + MemberKind = PropertySet }, + SynValInfo + ([[SynArgInfo ([], false, None)]; + [SynArgInfo ([], false, Some key1); + SynArgInfo ([], false, Some key2); + SynArgInfo ([], false, Some value)]], + SynArgInfo ([], false, None)), None), + LongIdent + (SynLongIdent + ([f; Y], [(5,21--5,22)], [None; None]), + Some set, None, + Pats + [Tuple + (false, + [Named + (SynIdent (key1, None), false, None, + (5,70--5,74)); + Named + (SynIdent (key2, None), false, None, + (5,76--5,80)); + Named + (SynIdent (value, None), false, None, + (5,82--5,87))], [(5,74--5,75)], + (5,69--5,87))], + Some (Private (5,57--5,64)), (5,57--5,87)), + None, Const (Unit, (5,90--5,92)), (5,57--5,87), + NoneAtInvisible, + { LeadingKeyword = Member (5,4--5,10) + InlineKeyword = None + EqualsRange = Some (5,88--5,89) })), + (5,4--5,92), { InlineKeyword = None + WithKeyword = (5,24--5,28) + GetKeyword = Some (5,29--5,32) + AndKeyword = Some (5,53--5,56) + SetKeyword = Some (5,65--5,68) })], + (4,4--5,92)), [], + Some + (ImplicitCtor + (None, [], SimplePats ([], [], (3,8--3,10)), None, + PreXmlDoc ((3,8), FSharp.Compiler.Xml.XmlDocCollector), + (3,5--3,8), { AsKeyword = None })), (3,5--5,92), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,11--3,12) + WithKeyword = None })], (3,0--5,92))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--5,92), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(5,57)-(5,87) parse error When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.