diff --git a/src/Compiler/Checking/CheckExpressions.fs b/src/Compiler/Checking/CheckExpressions.fs index 332cea0987..316245c700 100644 --- a/src/Compiler/Checking/CheckExpressions.fs +++ b/src/Compiler/Checking/CheckExpressions.fs @@ -5520,7 +5520,7 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE TcNonControlFlowExpr env <| fun env -> TcExprTuple cenv overallTy env tpenv (isExplicitStruct, args, m) - | SynExpr.AnonRecd (isStruct, withExprOpt, unsortedFieldExprs, mWholeExpr) -> + | SynExpr.AnonRecd (isStruct, withExprOpt, unsortedFieldExprs, mWholeExpr, _) -> TcNonControlFlowExpr env <| fun env -> TcPossiblyPropagatingExprLeafThenConvert (fun ty -> isAnonRecdTy g ty || isTyparTy g ty) cenv overallTy env mWholeExpr (fun overallTy -> TcAnonRecdExpr cenv overallTy env tpenv (isStruct, withExprOpt, unsortedFieldExprs, mWholeExpr) diff --git a/src/Compiler/Service/FSharpParseFileResults.fs b/src/Compiler/Service/FSharpParseFileResults.fs index 000320352a..51a26c48fd 100644 --- a/src/Compiler/Service/FSharpParseFileResults.fs +++ b/src/Compiler/Service/FSharpParseFileResults.fs @@ -715,7 +715,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, yield! walkExprs (fs |> List.choose (fun (SynExprRecordField (expr = e)) -> e)) - | SynExpr.AnonRecd (_isStruct, copyExprOpt, fs, _) -> + | SynExpr.AnonRecd (copyInfo = copyExprOpt; recordFields = fs) -> match copyExprOpt with | Some (e, _) -> yield! walkExpr true e | None -> () diff --git a/src/Compiler/Service/ServiceParseTreeWalk.fs b/src/Compiler/Service/ServiceParseTreeWalk.fs index 7e932bdb83..574fef8de0 100644 --- a/src/Compiler/Service/ServiceParseTreeWalk.fs +++ b/src/Compiler/Service/ServiceParseTreeWalk.fs @@ -351,7 +351,7 @@ module SyntaxTraversal = | SynExpr.ArrayOrList (_, synExprList, _range) -> synExprList |> List.map (fun x -> dive x x.Range traverseSynExpr) |> pick expr - | SynExpr.AnonRecd (_isStruct, copyOpt, synExprList, _range) -> + | SynExpr.AnonRecd (copyInfo = copyOpt; recordFields = synExprList) -> [ match copyOpt with | Some (expr, (withRange, _)) -> diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fs b/src/Compiler/SyntaxTree/SyntaxTree.fs index 1acd2eae68..d8b28e0c4c 100644 --- a/src/Compiler/SyntaxTree/SyntaxTree.fs +++ b/src/Compiler/SyntaxTree/SyntaxTree.fs @@ -483,7 +483,8 @@ type SynExpr = isStruct: bool * copyInfo: (SynExpr * BlockSeparator) option * recordFields: (Ident * range option * SynExpr) list * - range: range + range: range * + trivia: SynExprAnonRecdTrivia | ArrayOrList of isArray: bool * exprs: SynExpr list * range: range diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fsi b/src/Compiler/SyntaxTree/SyntaxTree.fsi index 73040c5324..1684ec8a37 100644 --- a/src/Compiler/SyntaxTree/SyntaxTree.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTree.fsi @@ -555,7 +555,8 @@ type SynExpr = isStruct: bool * copyInfo: (SynExpr * BlockSeparator) option * recordFields: (Ident * range option * SynExpr) list * - range: range + range: range * + trivia: SynExprAnonRecdTrivia /// F# syntax: [ e1; ...; en ], [| e1; ...; en |] | ArrayOrList of isArray: bool * exprs: SynExpr list * range: range diff --git a/src/Compiler/SyntaxTree/SyntaxTreeOps.fs b/src/Compiler/SyntaxTree/SyntaxTreeOps.fs index 72cfa23034..9aa688e8e9 100644 --- a/src/Compiler/SyntaxTree/SyntaxTreeOps.fs +++ b/src/Compiler/SyntaxTree/SyntaxTreeOps.fs @@ -841,7 +841,7 @@ let rec synExprContainsError inpExpr = | SynExpr.ArrayOrList (_, es, _) | SynExpr.Tuple (_, es, _, _) -> walkExprs es - | SynExpr.AnonRecd (_, origExpr, flds, _) -> + | SynExpr.AnonRecd (copyInfo = origExpr; recordFields = flds) -> (match origExpr with | Some (e, _) -> walkExpr e | None -> false) diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fs b/src/Compiler/SyntaxTree/SyntaxTrivia.fs index 18a5c30d50..84b431093a 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fs +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fs @@ -100,6 +100,9 @@ type SynExprMatchBangTrivia = WithKeyword: range } +[] +type SynExprAnonRecdTrivia = { OpeningBraceRange: range } + [] type SynMatchClauseTrivia = { diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi index b57db229ee..4119d06fca 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi @@ -159,6 +159,14 @@ type SynExprMatchBangTrivia = WithKeyword: range } +/// Represents additional information for SynExpr.AnonRecd +[] +type SynExprAnonRecdTrivia = + { + /// The syntax range of the `{|` token. + OpeningBraceRange: range + } + /// Represents additional information for SynMatchClause [] type SynMatchClauseTrivia = diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 15f45e7af9..7e515b0ac6 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -4917,11 +4917,12 @@ braceBarExprCore: flds |> List.choose (function | SynExprRecordField((SynLongIdent([id], _, _), _), mEquals, Some e, _) -> Some (id, mEquals, e) | SynExprRecordField((SynLongIdent([id], _, _), _), mEquals, None, _) -> Some (id, mEquals, arbExpr("anonField", id.idRange)) - | _ -> reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsInvalidAnonRecdType()); None) - let m = rhs2 parseState 1 3 + | _ -> reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsInvalidAnonRecdType()); None) + let mLeftBrace = rhs parseState 1 + let mRightBrace = rhs parseState 3 (fun (mStruct: range option) -> - let m = match mStruct with | None -> m | Some mStruct -> unionRanges mStruct m - SynExpr.AnonRecd (mStruct.IsSome, orig, flds, m)) } + let m = match mStruct with | None -> unionRanges mLeftBrace mRightBrace | Some mStruct -> unionRanges mStruct mRightBrace + SynExpr.AnonRecd (mStruct.IsSome, orig, flds, m, { OpeningBraceRange = mLeftBrace })) } | LBRACE_BAR recdExprCore recover { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBraceBar()) @@ -4931,30 +4932,33 @@ braceBarExprCore: | SynExprRecordField((SynLongIdent([id], _, _), _), mEquals, Some e, _) -> Some (id, mEquals, e) | SynExprRecordField((SynLongIdent([id], _, _), _), mEquals, None, _) -> Some (id, mEquals, arbExpr("anonField", id.idRange)) | _ -> reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsInvalidAnonRecdType()); None) - let m = rhs2 parseState 1 2 + let mLeftBrace = rhs parseState 1 + let mExpr = rhs parseState 2 (fun (mStruct: range option) -> - let m = match mStruct with | None -> m | Some mStruct -> unionRanges mStruct m - SynExpr.AnonRecd (mStruct.IsSome, orig, flds, m)) } + let m = match mStruct with | None -> unionRanges mLeftBrace mExpr | Some mStruct -> unionRanges mStruct mExpr + SynExpr.AnonRecd (mStruct.IsSome, orig, flds, m, { OpeningBraceRange = mLeftBrace })) } | LBRACE_BAR error bar_rbrace { // silent recovery - let m = rhs2 parseState 1 3 + let mLeftBrace = rhs parseState 1 + let mRightBrace = rhs parseState 3 (fun (mStruct: range option) -> - let m = match mStruct with | None -> m | Some mStruct -> unionRanges mStruct m + let m = match mStruct with | None -> unionRanges mLeftBrace mRightBrace | Some mStruct -> unionRanges mStruct mRightBrace arbExpr("braceBarExpr", m)) } | LBRACE_BAR recover { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBraceBar()) - let m = rhs2 parseState 1 1 + let mLeftBrace = rhs parseState 1 (fun (mStruct: range option) -> - let m = match mStruct with | None -> m | Some mStruct -> unionRanges mStruct m - SynExpr.AnonRecd (mStruct.IsSome, None, [], m)) } + let m = match mStruct with | None -> mLeftBrace | Some mStruct -> unionRanges mStruct mLeftBrace + SynExpr.AnonRecd (mStruct.IsSome, None, [], m, { OpeningBraceRange = mLeftBrace })) } | LBRACE_BAR bar_rbrace - { let m = rhs2 parseState 1 2 + { let mLeftBrace = rhs parseState 1 + let mRightBrace = rhs parseState 2 (fun (mStruct: range option) -> - let m = match mStruct with | None -> m | Some mStruct -> unionRanges mStruct m - SynExpr.AnonRecd (mStruct.IsSome, None, [], m)) } + let m = match mStruct with | None -> unionRanges mLeftBrace mRightBrace | Some mStruct -> unionRanges mStruct mRightBrace + SynExpr.AnonRecd (mStruct.IsSome, None, [], m, { OpeningBraceRange = mLeftBrace })) } anonLambdaExpr: | FUN atomicPatterns RARROW typedSequentialExprBlock 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 1bce6c61d8..2ee5904dad 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 @@ -6160,6 +6160,8 @@ FSharp.Compiler.Syntax.SynExpr+AddressOf: FSharp.Compiler.Text.Range opRange FSharp.Compiler.Syntax.SynExpr+AddressOf: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynExpr+AnonRecd: Boolean get_isStruct() FSharp.Compiler.Syntax.SynExpr+AnonRecd: Boolean isStruct +FSharp.Compiler.Syntax.SynExpr+AnonRecd: FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia get_trivia() +FSharp.Compiler.Syntax.SynExpr+AnonRecd: FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia trivia FSharp.Compiler.Syntax.SynExpr+AnonRecd: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynExpr+AnonRecd: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynExpr+AnonRecd: Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[FSharp.Compiler.Syntax.Ident,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range],FSharp.Compiler.Syntax.SynExpr]] get_recordFields() @@ -6899,7 +6901,7 @@ FSharp.Compiler.Syntax.SynExpr: Boolean get_IsWhile() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsYieldOrReturn() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsYieldOrReturnFrom() FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewAddressOf(Boolean, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewAnonRecd(Boolean, Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[FSharp.Compiler.Syntax.SynExpr,System.Tuple`2[FSharp.Compiler.Text.Range,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Position]]]], Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[FSharp.Compiler.Syntax.Ident,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range],FSharp.Compiler.Syntax.SynExpr]], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewAnonRecd(Boolean, Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[FSharp.Compiler.Syntax.SynExpr,System.Tuple`2[FSharp.Compiler.Text.Range,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Position]]]], Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[FSharp.Compiler.Syntax.Ident,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range],FSharp.Compiler.Syntax.SynExpr]], FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewApp(FSharp.Compiler.Syntax.ExprAtomicFlag, Boolean, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewArbitraryAfterError(System.String, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewArrayOrList(Boolean, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynExpr], FSharp.Compiler.Text.Range) @@ -9327,6 +9329,10 @@ FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: Microsoft.FSharp.Core.FSharpO FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_InKeyword() FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: System.String ToString() FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: Void .ctor(FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) +FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia: FSharp.Compiler.Text.Range OpeningBraceRange +FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia: FSharp.Compiler.Text.Range get_OpeningBraceRange() +FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia: Void .ctor(FSharp.Compiler.Text.Range) FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: Boolean IsElif FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: Boolean get_IsElif() FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: FSharp.Compiler.Text.Range IfKeyword 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 1bce6c61d8..2ee5904dad 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 @@ -6160,6 +6160,8 @@ FSharp.Compiler.Syntax.SynExpr+AddressOf: FSharp.Compiler.Text.Range opRange FSharp.Compiler.Syntax.SynExpr+AddressOf: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynExpr+AnonRecd: Boolean get_isStruct() FSharp.Compiler.Syntax.SynExpr+AnonRecd: Boolean isStruct +FSharp.Compiler.Syntax.SynExpr+AnonRecd: FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia get_trivia() +FSharp.Compiler.Syntax.SynExpr+AnonRecd: FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia trivia FSharp.Compiler.Syntax.SynExpr+AnonRecd: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynExpr+AnonRecd: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynExpr+AnonRecd: Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[FSharp.Compiler.Syntax.Ident,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range],FSharp.Compiler.Syntax.SynExpr]] get_recordFields() @@ -6899,7 +6901,7 @@ FSharp.Compiler.Syntax.SynExpr: Boolean get_IsWhile() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsYieldOrReturn() FSharp.Compiler.Syntax.SynExpr: Boolean get_IsYieldOrReturnFrom() FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewAddressOf(Boolean, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewAnonRecd(Boolean, Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[FSharp.Compiler.Syntax.SynExpr,System.Tuple`2[FSharp.Compiler.Text.Range,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Position]]]], Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[FSharp.Compiler.Syntax.Ident,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range],FSharp.Compiler.Syntax.SynExpr]], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewAnonRecd(Boolean, Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[FSharp.Compiler.Syntax.SynExpr,System.Tuple`2[FSharp.Compiler.Text.Range,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Position]]]], Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`3[FSharp.Compiler.Syntax.Ident,Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range],FSharp.Compiler.Syntax.SynExpr]], FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewApp(FSharp.Compiler.Syntax.ExprAtomicFlag, Boolean, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewArbitraryAfterError(System.String, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewArrayOrList(Boolean, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynExpr], FSharp.Compiler.Text.Range) @@ -9327,6 +9329,10 @@ FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: Microsoft.FSharp.Core.FSharpO FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_InKeyword() FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: System.String ToString() FSharp.Compiler.SyntaxTrivia.SynExprAndBangTrivia: Void .ctor(FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) +FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia: FSharp.Compiler.Text.Range OpeningBraceRange +FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia: FSharp.Compiler.Text.Range get_OpeningBraceRange() +FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynExprAnonRecdTrivia: Void .ctor(FSharp.Compiler.Text.Range) FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: Boolean IsElif FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: Boolean get_IsElif() FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: FSharp.Compiler.Text.Range IfKeyword diff --git a/tests/service/data/SyntaxTree/Expression/AnonymousRecords-01.fs b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-01.fs new file mode 100644 index 0000000000..b2900539f6 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-01.fs @@ -0,0 +1,6 @@ +{| X = 1 |} +struct {| Y = 2 |} +{| |} +struct {| |} +{| null |} +struct {| null |} diff --git a/tests/service/data/SyntaxTree/Expression/AnonymousRecords-01.fs.bsl b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-01.fs.bsl new file mode 100644 index 0000000000..25f6ecfe5e --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-01.fs.bsl @@ -0,0 +1,57 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/AnonymousRecords-01.fs", false, + QualifiedNameOfFile AnonymousRecords-01, [], [], + [SynModuleOrNamespace + ([AnonymousRecords-01], false, AnonModule, + [Expr + (AnonRecd + (false, None, + [(X, Some /root/Expression/AnonymousRecords-01.fs (1,5--1,6), + Const + (Int32 1, + /root/Expression/AnonymousRecords-01.fs (1,7--1,8)))], + /root/Expression/AnonymousRecords-01.fs (1,0--1,11), + { OpeningBraceRange = + /root/Expression/AnonymousRecords-01.fs (1,0--1,2) }), + /root/Expression/AnonymousRecords-01.fs (1,0--1,11)); + Expr + (AnonRecd + (true, None, + [(Y, Some /root/Expression/AnonymousRecords-01.fs (2,12--2,13), + Const + (Int32 2, + /root/Expression/AnonymousRecords-01.fs (2,14--2,15)))], + /root/Expression/AnonymousRecords-01.fs (2,0--2,18), + { OpeningBraceRange = + /root/Expression/AnonymousRecords-01.fs (2,7--2,9) }), + /root/Expression/AnonymousRecords-01.fs (2,0--2,18)); + Expr + (AnonRecd + (false, None, [], + /root/Expression/AnonymousRecords-01.fs (3,0--3,5), + { OpeningBraceRange = + /root/Expression/AnonymousRecords-01.fs (3,0--3,2) }), + /root/Expression/AnonymousRecords-01.fs (3,0--3,5)); + Expr + (AnonRecd + (true, None, [], + /root/Expression/AnonymousRecords-01.fs (4,0--4,12), + { OpeningBraceRange = + /root/Expression/AnonymousRecords-01.fs (4,7--4,9) }), + /root/Expression/AnonymousRecords-01.fs (4,0--4,12)); + Expr + (ArbitraryAfterError + ("braceBarExpr", + /root/Expression/AnonymousRecords-01.fs (5,0--5,10)), + /root/Expression/AnonymousRecords-01.fs (5,0--5,10)); + Expr + (ArbitraryAfterError + ("braceBarExpr", + /root/Expression/AnonymousRecords-01.fs (6,0--6,17)), + /root/Expression/AnonymousRecords-01.fs (6,0--6,17))], + PreXmlDocEmpty, [], None, + /root/Expression/AnonymousRecords-01.fs (1,0--6,17), + { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/AnonymousRecords-02.fs b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-02.fs new file mode 100644 index 0000000000..95e8188ef3 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-02.fs @@ -0,0 +1 @@ +{| X = 0 diff --git a/tests/service/data/SyntaxTree/Expression/AnonymousRecords-02.fs.bsl b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-02.fs.bsl new file mode 100644 index 0000000000..0c64c0814f --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-02.fs.bsl @@ -0,0 +1,22 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/AnonymousRecords-02.fs", false, + QualifiedNameOfFile AnonymousRecords-02, [], [], + [SynModuleOrNamespace + ([AnonymousRecords-02], false, AnonModule, + [Expr + (AnonRecd + (false, None, + [(X, Some /root/Expression/AnonymousRecords-02.fs (1,5--1,6), + Const + (Int32 0, + /root/Expression/AnonymousRecords-02.fs (1,7--1,8)))], + /root/Expression/AnonymousRecords-02.fs (1,0--2,0), + { OpeningBraceRange = + /root/Expression/AnonymousRecords-02.fs (1,0--1,2) }), + /root/Expression/AnonymousRecords-02.fs (1,0--2,0))], + PreXmlDocEmpty, [], None, + /root/Expression/AnonymousRecords-02.fs (1,0--2,0), + { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/AnonymousRecords-03.fs b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-03.fs new file mode 100644 index 0000000000..4e0bf627a8 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-03.fs @@ -0,0 +1 @@ +struct {| X = 0 diff --git a/tests/service/data/SyntaxTree/Expression/AnonymousRecords-03.fs.bsl b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-03.fs.bsl new file mode 100644 index 0000000000..f61b0e2ee5 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-03.fs.bsl @@ -0,0 +1,22 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/AnonymousRecords-03.fs", false, + QualifiedNameOfFile AnonymousRecords-03, [], [], + [SynModuleOrNamespace + ([AnonymousRecords-03], false, AnonModule, + [Expr + (AnonRecd + (true, None, + [(X, Some /root/Expression/AnonymousRecords-03.fs (1,12--1,13), + Const + (Int32 0, + /root/Expression/AnonymousRecords-03.fs (1,14--1,15)))], + /root/Expression/AnonymousRecords-03.fs (1,0--2,0), + { OpeningBraceRange = + /root/Expression/AnonymousRecords-03.fs (1,7--1,9) }), + /root/Expression/AnonymousRecords-03.fs (1,0--2,0))], + PreXmlDocEmpty, [], None, + /root/Expression/AnonymousRecords-03.fs (1,0--2,0), + { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/AnonymousRecords-04.fs b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-04.fs new file mode 100644 index 0000000000..acc5a0adcb --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-04.fs @@ -0,0 +1 @@ +{| diff --git a/tests/service/data/SyntaxTree/Expression/AnonymousRecords-04.fs.bsl b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-04.fs.bsl new file mode 100644 index 0000000000..bb5f0517ac --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-04.fs.bsl @@ -0,0 +1,18 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/AnonymousRecords-04.fs", false, + QualifiedNameOfFile AnonymousRecords-04, [], [], + [SynModuleOrNamespace + ([AnonymousRecords-04], false, AnonModule, + [Expr + (AnonRecd + (false, None, [], + /root/Expression/AnonymousRecords-04.fs (1,0--1,2), + { OpeningBraceRange = + /root/Expression/AnonymousRecords-04.fs (1,0--1,2) }), + /root/Expression/AnonymousRecords-04.fs (1,0--1,2))], + PreXmlDocEmpty, [], None, + /root/Expression/AnonymousRecords-04.fs (1,0--2,0), + { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/AnonymousRecords-05.fs b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-05.fs new file mode 100644 index 0000000000..85af97b858 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-05.fs @@ -0,0 +1 @@ +struct {| diff --git a/tests/service/data/SyntaxTree/Expression/AnonymousRecords-05.fs.bsl b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-05.fs.bsl new file mode 100644 index 0000000000..c6764e2e31 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/AnonymousRecords-05.fs.bsl @@ -0,0 +1,18 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/AnonymousRecords-05.fs", false, + QualifiedNameOfFile AnonymousRecords-05, [], [], + [SynModuleOrNamespace + ([AnonymousRecords-05], false, AnonModule, + [Expr + (AnonRecd + (true, None, [], + /root/Expression/AnonymousRecords-05.fs (1,0--1,9), + { OpeningBraceRange = + /root/Expression/AnonymousRecords-05.fs (1,7--1,9) }), + /root/Expression/AnonymousRecords-05.fs (1,0--1,9))], + PreXmlDocEmpty, [], None, + /root/Expression/AnonymousRecords-05.fs (1,0--2,0), + { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/SynExprAnonRecdWithStructKeyword.fs.bsl b/tests/service/data/SyntaxTree/Expression/SynExprAnonRecdWithStructKeyword.fs.bsl index 980b9bdf6f..82d81c05a2 100644 --- a/tests/service/data/SyntaxTree/Expression/SynExprAnonRecdWithStructKeyword.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/SynExprAnonRecdWithStructKeyword.fs.bsl @@ -11,12 +11,16 @@ ImplFile Some /root/Expression/SynExprAnonRecdWithStructKeyword.fs (3,11--3,12), Ident someValue)], - /root/Expression/SynExprAnonRecdWithStructKeyword.fs (2,0--5,16)), + /root/Expression/SynExprAnonRecdWithStructKeyword.fs (2,0--5,16), + { OpeningBraceRange = + /root/Expression/SynExprAnonRecdWithStructKeyword.fs (3,4--3,6) }), /root/Expression/SynExprAnonRecdWithStructKeyword.fs (2,0--5,16)); Expr (AnonRecd (true, None, [], - /root/Expression/SynExprAnonRecdWithStructKeyword.fs (7,0--7,12)), + /root/Expression/SynExprAnonRecdWithStructKeyword.fs (7,0--7,12), + { OpeningBraceRange = + /root/Expression/SynExprAnonRecdWithStructKeyword.fs (7,7--7,9) }), /root/Expression/SynExprAnonRecdWithStructKeyword.fs (7,0--7,12))], PreXmlDocEmpty, [], None, /root/Expression/SynExprAnonRecdWithStructKeyword.fs (2,0--7,12), diff --git a/tests/service/data/SyntaxTree/Expression/SynExprAnonRecordContainsTheRangeOfTheEqualsSignInTheFields.fs.bsl b/tests/service/data/SyntaxTree/Expression/SynExprAnonRecordContainsTheRangeOfTheEqualsSignInTheFields.fs.bsl index ba1a356678..9633c8033e 100644 --- a/tests/service/data/SyntaxTree/Expression/SynExprAnonRecordContainsTheRangeOfTheEqualsSignInTheFields.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/SynExprAnonRecordContainsTheRangeOfTheEqualsSignInTheFields.fs.bsl @@ -28,7 +28,9 @@ ImplFile Const (Int32 7, /root/Expression/SynExprAnonRecordContainsTheRangeOfTheEqualsSignInTheFields.fs (4,14--4,15)))], - /root/Expression/SynExprAnonRecordContainsTheRangeOfTheEqualsSignInTheFields.fs (2,0--4,18)), + /root/Expression/SynExprAnonRecordContainsTheRangeOfTheEqualsSignInTheFields.fs (2,0--4,18), + { OpeningBraceRange = + /root/Expression/SynExprAnonRecordContainsTheRangeOfTheEqualsSignInTheFields.fs (2,0--2,2) }), /root/Expression/SynExprAnonRecordContainsTheRangeOfTheEqualsSignInTheFields.fs (2,0--4,18))], PreXmlDocEmpty, [], None, /root/Expression/SynExprAnonRecordContainsTheRangeOfTheEqualsSignInTheFields.fs (2,0--4,18),