diff --git a/src/Compiler/Checking/CheckExpressions.fs b/src/Compiler/Checking/CheckExpressions.fs index ff976365e26..806b516dccd 100644 --- a/src/Compiler/Checking/CheckExpressions.fs +++ b/src/Compiler/Checking/CheckExpressions.fs @@ -4935,9 +4935,9 @@ and ConvSynPatToSynExpr synPat = | SynPat.LongIdent (longDotId=SynLongIdent(longId, dotms, trivia) as synLongId; argPats=args; accessibility=None; range=m) -> let args = match args with SynArgPats.Pats args -> args | _ -> failwith "impossible: active patterns can be used only with SynConstructorArgs.Pats" let e = - if dotms.Length = longId.Length then + if not dotms.IsEmpty && dotms.Length = longId.Length then let e = SynExpr.LongIdent (false, SynLongIdent(longId, List.truncate (dotms.Length - 1) dotms, trivia), None, m) - SynExpr.DiscardAfterMissingQualificationAfterDot (e, unionRanges e.Range (List.last dotms)) + SynExpr.DiscardAfterMissingQualificationAfterDot (e, List.last dotms, unionRanges e.Range (List.last dotms)) else SynExpr.LongIdent (false, synLongId, None, m) List.fold (fun f x -> mkSynApp1 f (ConvSynPatToSynExpr x) m) e args @@ -5231,7 +5231,7 @@ and TcExprThen (cenv: cenv) overallTy env tpenv isArg synExpr delayed = // etc. | SynExpr.DotGet (expr1, _, SynLongIdent(longId, _, _), _) -> TcNonControlFlowExpr env <| fun env -> - TcExprThen cenv overallTy env tpenv false expr1 ((DelayedDotLookup (longId, synExpr.RangeWithoutAnyExtraDot)) :: delayed) + TcExprThen cenv overallTy env tpenv false expr1 ((DelayedDotLookup (longId, synExpr.Range)) :: delayed) // expr1.[expr2] // expr1.[e21, ..., e2n] @@ -5602,7 +5602,7 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE //SolveTypeAsError cenv env.DisplayEnv m overallTy mkDefault(m, overallTy.Commit), tpenv - | SynExpr.DiscardAfterMissingQualificationAfterDot (expr1, m) -> + | SynExpr.DiscardAfterMissingQualificationAfterDot (expr1, _, m) -> let _, _, tpenv = suppressErrorReporting (fun () -> TcExprOfUnknownTypeThen cenv env tpenv expr1 [DelayedDot]) mkDefault(m, overallTy.Commit), tpenv @@ -6007,45 +6007,26 @@ and TcExprStaticOptimization (cenv: cenv) overallTy env tpenv (constraints, synE /// synExpr1.longId <- synExpr2 and TcExprDotSet (cenv: cenv) overallTy env tpenv (synExpr1, synLongId, synExpr2, mStmt) = let (SynLongIdent(longId, _, _)) = synLongId - - if synLongId.ThereIsAnExtraDotAtTheEnd then - // just drop rhs on the floor - let mExprAndDotLookup = unionRanges synExpr1.Range (rangeOfLid longId) - TcExprThen cenv overallTy env tpenv false synExpr1 [DelayedDotLookup(longId, mExprAndDotLookup)] - else - let mExprAndDotLookup = unionRanges synExpr1.Range (rangeOfLid longId) - TcExprThen cenv overallTy env tpenv false synExpr1 [DelayedDotLookup(longId, mExprAndDotLookup); MakeDelayedSet(synExpr2, mStmt)] + let mExprAndDotLookup = unionRanges synExpr1.Range (rangeOfLid longId) + TcExprThen cenv overallTy env tpenv false synExpr1 [DelayedDotLookup(longId, mExprAndDotLookup); MakeDelayedSet(synExpr2, mStmt)] /// synExpr1.longId(synExpr2) <- expr3, very rarely used named property setters and TcExprDotNamedIndexedPropertySet (cenv: cenv) overallTy env tpenv (synExpr1, synLongId, synExpr2, expr3, mStmt) = let (SynLongIdent(longId, _, _)) = synLongId - if synLongId.ThereIsAnExtraDotAtTheEnd then - // just drop rhs on the floor - let mExprAndDotLookup = unionRanges synExpr1.Range (rangeOfLid longId) - TcExprThen cenv overallTy env tpenv false synExpr1 [DelayedDotLookup(longId, mExprAndDotLookup)] - else - let mExprAndDotLookup = unionRanges synExpr1.Range (rangeOfLid longId) - TcExprThen cenv overallTy env tpenv false synExpr1 - [ DelayedDotLookup(longId, mExprAndDotLookup); - DelayedApp(ExprAtomicFlag.Atomic, false, None, synExpr2, mStmt) - MakeDelayedSet(expr3, mStmt)] + let mExprAndDotLookup = unionRanges synExpr1.Range (rangeOfLid longId) + TcExprThen cenv overallTy env tpenv false synExpr1 + [ DelayedDotLookup(longId, mExprAndDotLookup); + DelayedApp(ExprAtomicFlag.Atomic, false, None, synExpr2, mStmt) + MakeDelayedSet(expr3, mStmt)] and TcExprLongIdentSet (cenv: cenv) overallTy env tpenv (synLongId, synExpr2, m) = - if synLongId.ThereIsAnExtraDotAtTheEnd then - // just drop rhs on the floor - TcLongIdentThen cenv overallTy env tpenv synLongId [ ] - else - TcLongIdentThen cenv overallTy env tpenv synLongId [ MakeDelayedSet(synExpr2, m) ] + TcLongIdentThen cenv overallTy env tpenv synLongId [ MakeDelayedSet(synExpr2, m) ] // Type.Items(synExpr1) <- synExpr2 and TcExprNamedIndexPropertySet (cenv: cenv) overallTy env tpenv (synLongId, synExpr1, synExpr2, mStmt) = - if synLongId.ThereIsAnExtraDotAtTheEnd then - // just drop rhs on the floor - TcLongIdentThen cenv overallTy env tpenv synLongId [ ] - else - TcLongIdentThen cenv overallTy env tpenv synLongId - [ DelayedApp(ExprAtomicFlag.Atomic, false, None, synExpr1, mStmt) - MakeDelayedSet(synExpr2, mStmt) ] + TcLongIdentThen cenv overallTy env tpenv synLongId + [ DelayedApp(ExprAtomicFlag.Atomic, false, None, synExpr1, mStmt) + MakeDelayedSet(synExpr2, mStmt) ] and TcExprTraitCall (cenv: cenv) overallTy env tpenv (synTypes, synMemberSig, arg, m) = let g = cenv.g @@ -8018,7 +7999,7 @@ and TcNameOfExpr (cenv: cenv) env tpenv (synArg: SynExpr) = // expr.ID allowed | SynExpr.DotGet (hd, _, SynLongIdent(longId, _, _), _) -> let result = defaultArg resultOpt (List.last longId) - check overallTyOpt (Some result) hd ((DelayedDotLookup (longId, expr.RangeWithoutAnyExtraDot)) :: delayed) + check overallTyOpt (Some result) hd ((DelayedDotLookup (longId, expr.Range)) :: delayed) // "(expr)" allowed with no subsequent qualifications | SynExpr.Paren(expr, _, _, _) when delayed.IsEmpty && overallTyOpt.IsNone -> diff --git a/src/Compiler/Service/FSharpParseFileResults.fs b/src/Compiler/Service/FSharpParseFileResults.fs index 51a26c48fd7..2cb1110b76a 100644 --- a/src/Compiler/Service/FSharpParseFileResults.fs +++ b/src/Compiler/Service/FSharpParseFileResults.fs @@ -622,7 +622,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, | SynExpr.ArrayOrListComputed (_, e, _) | SynExpr.Typed (e, _, _) | SynExpr.FromParseError (e, _) - | SynExpr.DiscardAfterMissingQualificationAfterDot (e, _) + | SynExpr.DiscardAfterMissingQualificationAfterDot (e, _, _) | SynExpr.Do (e, _) | SynExpr.Assert (e, _) | SynExpr.Fixed (e, _) diff --git a/src/Compiler/Service/ServiceInterfaceStubGenerator.fs b/src/Compiler/Service/ServiceInterfaceStubGenerator.fs index dc704d12fd8..e0e31850e33 100644 --- a/src/Compiler/Service/ServiceInterfaceStubGenerator.fs +++ b/src/Compiler/Service/ServiceInterfaceStubGenerator.fs @@ -969,7 +969,7 @@ module InterfaceStubGenerator = | SynExpr.ArbitraryAfterError (_debugStr, _range) -> None | SynExpr.FromParseError (synExpr, _range) - | SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, _range) -> walkExpr synExpr + | SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, _, _range) -> walkExpr synExpr | _ -> None diff --git a/src/Compiler/Service/ServiceParseTreeWalk.fs b/src/Compiler/Service/ServiceParseTreeWalk.fs index b17732f7d3f..cd9c4a6d923 100644 --- a/src/Compiler/Service/ServiceParseTreeWalk.fs +++ b/src/Compiler/Service/ServiceParseTreeWalk.fs @@ -547,8 +547,7 @@ module SyntaxTraversal = let ok = match isPartOfArrayOrList, synExpr with - | false, SynExpr.Ident ident -> visitor.VisitRecordField(path, None, Some(SynLongIdent([ ident ], [], [ None ]))) - | false, SynExpr.LongIdent (false, lidwd, _, _) -> visitor.VisitRecordField(path, None, Some lidwd) + | false, LongOrSingleIdent (_, lid, _, _) -> visitor.VisitRecordField(path, None, Some lid) | _ -> None if ok.IsSome then ok else traverseSynExpr synExpr @@ -783,7 +782,7 @@ module SyntaxTraversal = | SynExpr.FromParseError (synExpr, _range) -> traverseSynExpr synExpr - | SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, _range) -> traverseSynExpr synExpr + | SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, _, _range) -> traverseSynExpr synExpr visitor.VisitExpr(origPath, traverseSynExpr origPath, defaultTraverse, expr) diff --git a/src/Compiler/Service/ServiceParsedInputOps.fs b/src/Compiler/Service/ServiceParsedInputOps.fs index 292686fe6c9..fd75c11f790 100644 --- a/src/Compiler/Service/ServiceParsedInputOps.fs +++ b/src/Compiler/Service/ServiceParsedInputOps.fs @@ -344,7 +344,7 @@ module ParsedInput = Some(unionRanges synExpr.Range r) // get this for e.g. "bar()." - | SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, _) -> + | SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, _, _) -> if SyntaxTraversal.rangeContainsPosLeftEdgeInclusive synExpr.Range pos then traverseSynExpr synExpr else @@ -466,7 +466,7 @@ module ParsedInput = if not (rangeContainsPos expr.Range pos) then match expr with - | SynExpr.DiscardAfterMissingQualificationAfterDot (e, _m) -> + | SynExpr.DiscardAfterMissingQualificationAfterDot (e, _, _m) -> // This happens with e.g. "f(x) . $" when you bring up a completion list a few spaces after a dot. The cursor is not 'in the parse tree', // but the dive algorithm will dive down into this node, and this is the one case where we do want to give a result despite the cursor // not properly being in a node. @@ -540,7 +540,7 @@ module ParsedInput = // the cursor is left of the dot None - | SynExpr.DiscardAfterMissingQualificationAfterDot (e, m) -> + | SynExpr.DiscardAfterMissingQualificationAfterDot (e, _, m) -> match traverseSynExpr e with | None -> if posEq m.End pos then diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fs b/src/Compiler/SyntaxTree/SyntaxTree.fs index d8b28e0c4c4..78d276948ff 100644 --- a/src/Compiler/SyntaxTree/SyntaxTree.fs +++ b/src/Compiler/SyntaxTree/SyntaxTree.fs @@ -701,7 +701,7 @@ type SynExpr = | FromParseError of expr: SynExpr * range: range - | DiscardAfterMissingQualificationAfterDot of expr: SynExpr * range: range + | DiscardAfterMissingQualificationAfterDot of expr: SynExpr * dotRange: range * range: range | Fixed of expr: SynExpr * range: range @@ -787,13 +787,7 @@ type SynExpr = member e.RangeWithoutAnyExtraDot = match e with - | SynExpr.DotGet (expr, _, lidwd, m) -> - if lidwd.ThereIsAnExtraDotAtTheEnd then - unionRanges expr.Range lidwd.RangeWithoutAnyExtraDot - else - m - | SynExpr.LongIdent (_, lidwd, _, _) -> lidwd.RangeWithoutAnyExtraDot - | SynExpr.DiscardAfterMissingQualificationAfterDot (expr, _) -> expr.Range + | SynExpr.DiscardAfterMissingQualificationAfterDot (expr, _, _) -> expr.Range | _ -> e.Range member e.RangeOfFirstPortion = diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fsi b/src/Compiler/SyntaxTree/SyntaxTree.fsi index 1684ec8a370..222c0131088 100644 --- a/src/Compiler/SyntaxTree/SyntaxTree.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTree.fsi @@ -905,7 +905,7 @@ type SynExpr = | FromParseError of expr: SynExpr * range: range /// Inserted for error recovery when there is "expr." and missing tokens or error recovery after the dot - | DiscardAfterMissingQualificationAfterDot of expr: SynExpr * range: range + | DiscardAfterMissingQualificationAfterDot of expr: SynExpr * dotRange: range * range: range /// 'use x = fixed expr' | Fixed of expr: SynExpr * range: range diff --git a/src/Compiler/SyntaxTree/SyntaxTreeOps.fs b/src/Compiler/SyntaxTree/SyntaxTreeOps.fs index 9aa688e8e90..5dc96d5e01b 100644 --- a/src/Compiler/SyntaxTree/SyntaxTreeOps.fs +++ b/src/Compiler/SyntaxTree/SyntaxTreeOps.fs @@ -73,6 +73,14 @@ let (|LongOrSingleIdent|_|) inp = match inp with | SynExpr.LongIdent (isOpt, lidwd, altId, _m) -> Some(isOpt, lidwd, altId, lidwd.RangeWithoutAnyExtraDot) | SynExpr.Ident id -> Some(false, SynLongIdent([ id ], [], [ None ]), None, id.idRange) + + | SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, dotRange, _) -> + match synExpr with + | SynExpr.Ident ident -> Some(false, SynLongIdent([ ident ], [ dotRange ], [ None ]), None, ident.idRange) + | SynExpr.LongIdent (false, SynLongIdent (idents, dotRanges, trivia), _, range) -> + Some(false, SynLongIdent(idents, dotRanges @ [ dotRange ], trivia), None, range) + | _ -> None + | _ -> None let (|SingleIdent|_|) inp = @@ -463,14 +471,8 @@ let mkSynDot mDot m l (SynIdent (r, rTrivia)) = SynExpr.DotGet(e, dm, SynLongIdent(lid @ [ r ], dots @ [ mDot ], trivia @ [ rTrivia ]), m) | expr -> SynExpr.DotGet(expr, mDot, SynLongIdent([ r ], [], [ rTrivia ]), m) -let mkSynDotMissing mDot m l = - match l with - | SynExpr.LongIdent (isOpt, SynLongIdent (lid, dots, trivia), None, _) -> - // REVIEW: MEMORY PERFORMANCE: This list operation is memory intensive (we create a lot of these list nodes) - SynExpr.LongIdent(isOpt, SynLongIdent(lid, dots @ [ mDot ], trivia), None, m) - | SynExpr.Ident id -> SynExpr.LongIdent(false, SynLongIdent([ id ], [ mDot ], [ None ]), None, m) - | SynExpr.DotGet (e, dm, SynLongIdent (lid, dots, trivia), _) -> SynExpr.DotGet(e, dm, SynLongIdent(lid, dots @ [ mDot ], trivia), m) // REVIEW: MEMORY PERFORMANCE: This is memory intensive (we create a lot of these list nodes) - | expr -> SynExpr.DiscardAfterMissingQualificationAfterDot(expr, m) +let mkSynDotMissing (mDot: range) (m: range) (expr: SynExpr) = + SynExpr.DiscardAfterMissingQualificationAfterDot(expr, mDot, unionRanges mDot m) let mkSynFunMatchLambdas synArgNameGenerator isMember wholem ps arrow e = let _, e = PushCurriedPatternsToExpr synArgNameGenerator wholem isMember ps arrow e diff --git a/src/Compiler/SyntaxTree/SyntaxTreeOps.fsi b/src/Compiler/SyntaxTree/SyntaxTreeOps.fsi index 0d8284d7073..d7878897acd 100644 --- a/src/Compiler/SyntaxTree/SyntaxTreeOps.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTreeOps.fsi @@ -155,7 +155,7 @@ val mkSynAssign: l: SynExpr -> r: SynExpr -> SynExpr val mkSynDot: mDot: range -> m: range -> l: SynExpr -> r: SynIdent -> SynExpr -val mkSynDotMissing: mDot: range -> m: range -> l: SynExpr -> SynExpr +val mkSynDotMissing: mDot: range -> m: range -> expr: SynExpr -> SynExpr val mkSynFunMatchLambdas: synArgNameGenerator: SynArgNameGenerator -> diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 7e515b0ac66..683a52419a2 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -4378,12 +4378,12 @@ atomicExprQualification: reportParseErrorAt mDot (FSComp.SR.parsMissingQualificationAfterDot()) let fixedLhsm = mkRange mLhs.FileName mLhs.Start mDot.End // previous mLhs is wrong after 'recover' mkSynDotMissing mDot fixedLhsm e) } - | recover - { (fun e mLhs mDot -> - reportParseErrorAt mDot (FSComp.SR.parsMissingQualificationAfterDot()) + | recover + { (fun e mLhs mDot -> + reportParseErrorAt mDot (FSComp.SR.parsMissingQualificationAfterDot()) let fixedLhsm = mkRange mLhs.FileName mLhs.Start mDot.End // previous mLhs is wrong after 'recover' // Include 'e' in the returned expression but throw it away - SynExpr.DiscardAfterMissingQualificationAfterDot (e, fixedLhsm)) } + mkSynDotMissing mDot fixedLhsm e) } | LPAREN COLON_COLON rparen DOT INT32 { (fun e mLhs mDot -> if parseState.LexBuffer.ReportLibraryOnlyFeatures then libraryOnlyError(lhs parseState) 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 fe96ceca8ca..65c87df026a 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 @@ -6218,6 +6218,8 @@ FSharp.Compiler.Syntax.SynExpr+DebugPoint: FSharp.Compiler.Syntax.SynExpr get_in FSharp.Compiler.Syntax.SynExpr+DebugPoint: FSharp.Compiler.Syntax.SynExpr innerExpr FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Syntax.SynExpr expr FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Syntax.SynExpr get_expr() +FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range dotRange +FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range get_dotRange() FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynExpr+Do: FSharp.Compiler.Syntax.SynExpr expr @@ -6912,7 +6914,7 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewAssert(FSharp. FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewComputationExpr(Boolean, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewConst(FSharp.Compiler.Syntax.SynConst, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDebugPoint(FSharp.Compiler.Syntax.DebugPointAtLeafExpr, Boolean, FSharp.Compiler.Syntax.SynExpr) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDiscardAfterMissingQualificationAfterDot(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDiscardAfterMissingQualificationAfterDot(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDo(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDoBang(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotGet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.SynLongIdent, FSharp.Compiler.Text.Range) 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 fe96ceca8ca..65c87df026a 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 @@ -6218,6 +6218,8 @@ FSharp.Compiler.Syntax.SynExpr+DebugPoint: FSharp.Compiler.Syntax.SynExpr get_in FSharp.Compiler.Syntax.SynExpr+DebugPoint: FSharp.Compiler.Syntax.SynExpr innerExpr FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Syntax.SynExpr expr FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Syntax.SynExpr get_expr() +FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range dotRange +FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range get_dotRange() FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynExpr+Do: FSharp.Compiler.Syntax.SynExpr expr @@ -6912,7 +6914,7 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewAssert(FSharp. FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewComputationExpr(Boolean, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewConst(FSharp.Compiler.Syntax.SynConst, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDebugPoint(FSharp.Compiler.Syntax.DebugPointAtLeafExpr, Boolean, FSharp.Compiler.Syntax.SynExpr) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDiscardAfterMissingQualificationAfterDot(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDiscardAfterMissingQualificationAfterDot(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDo(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDoBang(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotGet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.SynLongIdent, FSharp.Compiler.Text.Range) diff --git a/tests/service/data/SyntaxTree/Expression/Record - Anon - Field 01.fs b/tests/service/data/SyntaxTree/Expression/Record - Anon - Field 01.fs new file mode 100644 index 00000000000..04ed3c360b7 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Anon - Field 01.fs @@ -0,0 +1 @@ +{| A = 1 |} diff --git a/tests/service/data/SyntaxTree/Expression/Record - Anon - Field 01.fs.bsl b/tests/service/data/SyntaxTree/Expression/Record - Anon - Field 01.fs.bsl new file mode 100644 index 00000000000..f8825418def --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Anon - Field 01.fs.bsl @@ -0,0 +1,14 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Record - Anon - Field 01.fs", false, + QualifiedNameOfFile Record - Anon - Field 01, [], [], + [SynModuleOrNamespace + ([Record - Anon - Field 01], false, AnonModule, + [Expr + (AnonRecd + (false, None, + [(A, Some (1,5--1,6), Const (Int32 1, (1,7--1,8)))], + (1,0--1,11), { OpeningBraceRange = (1,0--1,2) }), (1,0--1,11))], + PreXmlDocEmpty, [], None, (1,0--1,11), { LeadingKeyword = None })], + (true, false), { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/Record - Anon - Field 02.fs b/tests/service/data/SyntaxTree/Expression/Record - Anon - Field 02.fs new file mode 100644 index 00000000000..e1fee7275c3 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Anon - Field 02.fs @@ -0,0 +1 @@ +{| A = |} diff --git a/tests/service/data/SyntaxTree/Expression/Record - Anon - Field 02.fs.bsl b/tests/service/data/SyntaxTree/Expression/Record - Anon - Field 02.fs.bsl new file mode 100644 index 00000000000..f58bc8630ff --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Anon - Field 02.fs.bsl @@ -0,0 +1,10 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Record - Anon - Field 02.fs", false, + QualifiedNameOfFile Record - Anon - Field 02, [], [], + [SynModuleOrNamespace + ([Record - Anon - Field 02], false, AnonModule, + [Expr (ArbitraryAfterError ("braceBarExpr", (1,0--1,9)), (1,0--1,9))], + PreXmlDocEmpty, [], None, (1,0--1,9), { LeadingKeyword = None })], + (true, false), { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 01.fs b/tests/service/data/SyntaxTree/Expression/Record - Field 01.fs new file mode 100644 index 00000000000..794e59d0ba6 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 01.fs @@ -0,0 +1 @@ +{ A. } diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 01.fs.bsl b/tests/service/data/SyntaxTree/Expression/Record - Field 01.fs.bsl new file mode 100644 index 00000000000..bcc67763c36 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 01.fs.bsl @@ -0,0 +1,14 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Record - Field 01.fs", false, + QualifiedNameOfFile Record - Field 01, [], [], + [SynModuleOrNamespace + ([Record - Field 01], false, AnonModule, + [Expr + (ComputationExpr + (false, + DiscardAfterMissingQualificationAfterDot + (Ident A, (1,3--1,4), (1,2--1,4)), (1,0--1,6)), (1,0--1,6))], + PreXmlDocEmpty, [], None, (1,0--1,6), { LeadingKeyword = None })], + (true, false), { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 02.fs b/tests/service/data/SyntaxTree/Expression/Record - Field 02.fs new file mode 100644 index 00000000000..dc0e4469a5d --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 02.fs @@ -0,0 +1 @@ +{ A.B. } diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 02.fs.bsl b/tests/service/data/SyntaxTree/Expression/Record - Field 02.fs.bsl new file mode 100644 index 00000000000..f192f2265ee --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 02.fs.bsl @@ -0,0 +1,17 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Record - Field 02.fs", false, + QualifiedNameOfFile Record - Field 02, [], [], + [SynModuleOrNamespace + ([Record - Field 02], false, AnonModule, + [Expr + (ComputationExpr + (false, + DiscardAfterMissingQualificationAfterDot + (LongIdent + (false, SynLongIdent ([A; B], [(1,3--1,4)], [None; None]), + None, (1,2--1,5)), (1,5--1,6), (1,2--1,6)), (1,0--1,8)), + (1,0--1,8))], PreXmlDocEmpty, [], None, (1,0--1,8), + { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 03.fs b/tests/service/data/SyntaxTree/Expression/Record - Field 03.fs new file mode 100644 index 00000000000..09439b376b4 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 03.fs @@ -0,0 +1 @@ +{ A. = 1 } diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 03.fs.bsl b/tests/service/data/SyntaxTree/Expression/Record - Field 03.fs.bsl new file mode 100644 index 00000000000..760058a48f9 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 03.fs.bsl @@ -0,0 +1,16 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Record - Field 03.fs", false, + QualifiedNameOfFile Record - Field 03, [], [], + [SynModuleOrNamespace + ([Record - Field 03], false, AnonModule, + [Expr + (Record + (None, None, + [SynExprRecordField + ((SynLongIdent ([A], [(1,3--1,4)], [None]), true), + Some (1,5--1,6), Some (Const (Int32 1, (1,7--1,8))), None)], + (1,0--1,10)), (1,0--1,10))], PreXmlDocEmpty, [], None, + (1,0--1,10), { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 04.fs b/tests/service/data/SyntaxTree/Expression/Record - Field 04.fs new file mode 100644 index 00000000000..6758e1a54cf --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 04.fs @@ -0,0 +1 @@ +{ A.B. = 1 } diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 04.fs.bsl b/tests/service/data/SyntaxTree/Expression/Record - Field 04.fs.bsl new file mode 100644 index 00000000000..3655e49ac37 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 04.fs.bsl @@ -0,0 +1,17 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Record - Field 04.fs", false, + QualifiedNameOfFile Record - Field 04, [], [], + [SynModuleOrNamespace + ([Record - Field 04], false, AnonModule, + [Expr + (Record + (None, None, + [SynExprRecordField + ((SynLongIdent + ([A; B], [(1,3--1,4); (1,5--1,6)], [None; None]), true), + Some (1,7--1,8), Some (Const (Int32 1, (1,9--1,10))), None)], + (1,0--1,12)), (1,0--1,12))], PreXmlDocEmpty, [], None, + (1,0--1,12), { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 05.fs b/tests/service/data/SyntaxTree/Expression/Record - Field 05.fs new file mode 100644 index 00000000000..c8a3a675a7d --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 05.fs @@ -0,0 +1 @@ +{ A = 1 } diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 05.fs.bsl b/tests/service/data/SyntaxTree/Expression/Record - Field 05.fs.bsl new file mode 100644 index 00000000000..dd0ab33b195 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 05.fs.bsl @@ -0,0 +1,16 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Record - Field 05.fs", false, + QualifiedNameOfFile Record - Field 05, [], [], + [SynModuleOrNamespace + ([Record - Field 05], false, AnonModule, + [Expr + (Record + (None, None, + [SynExprRecordField + ((SynLongIdent ([A], [], [None]), true), Some (1,4--1,5), + Some (Const (Int32 1, (1,6--1,7))), None)], (1,0--1,9)), + (1,0--1,9))], PreXmlDocEmpty, [], None, (1,0--1,9), + { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 06.fs b/tests/service/data/SyntaxTree/Expression/Record - Field 06.fs new file mode 100644 index 00000000000..0ac84b7b918 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 06.fs @@ -0,0 +1 @@ +{ A.B = 1 } diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 06.fs.bsl b/tests/service/data/SyntaxTree/Expression/Record - Field 06.fs.bsl new file mode 100644 index 00000000000..01da283ee66 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 06.fs.bsl @@ -0,0 +1,16 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Record - Field 06.fs", false, + QualifiedNameOfFile Record - Field 06, [], [], + [SynModuleOrNamespace + ([Record - Field 06], false, AnonModule, + [Expr + (Record + (None, None, + [SynExprRecordField + ((SynLongIdent ([A; B], [(1,3--1,4)], [None; None]), true), + Some (1,6--1,7), Some (Const (Int32 1, (1,8--1,9))), None)], + (1,0--1,11)), (1,0--1,11))], PreXmlDocEmpty, [], None, + (1,0--1,11), { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 07.fs b/tests/service/data/SyntaxTree/Expression/Record - Field 07.fs new file mode 100644 index 00000000000..88af6dc4bc8 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 07.fs @@ -0,0 +1,2 @@ +{ A. + B = 1 } diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 07.fs.bsl b/tests/service/data/SyntaxTree/Expression/Record - Field 07.fs.bsl new file mode 100644 index 00000000000..133998ab525 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 07.fs.bsl @@ -0,0 +1,27 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Record - Field 07.fs", false, + QualifiedNameOfFile Record - Field 07, [], [], + [SynModuleOrNamespace + ([Record - Field 07], false, AnonModule, + [Expr + (ComputationExpr + (false, + Sequential + (SuppressNeither, true, + DiscardAfterMissingQualificationAfterDot + (Ident A, (1,3--1,4), (1,2--1,4)), + App + (NonAtomic, false, + App + (NonAtomic, true, + LongIdent + (false, + SynLongIdent + ([op_Equality], [], [Some (OriginalNotation "=")]), + None, (2,4--2,5)), Ident B, (2,2--2,5)), + Const (Int32 1, (2,6--2,7)), (2,2--2,7)), (1,2--2,7)), + (1,0--2,9)), (1,0--2,9))], PreXmlDocEmpty, [], None, (1,0--2,9), + { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 08.fs b/tests/service/data/SyntaxTree/Expression/Record - Field 08.fs new file mode 100644 index 00000000000..6e95c818092 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 08.fs @@ -0,0 +1,2 @@ +{ A = 1 + B. } diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 08.fs.bsl b/tests/service/data/SyntaxTree/Expression/Record - Field 08.fs.bsl new file mode 100644 index 00000000000..33fee72ef93 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 08.fs.bsl @@ -0,0 +1,18 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Record - Field 08.fs", false, + QualifiedNameOfFile Record - Field 08, [], [], + [SynModuleOrNamespace + ([Record - Field 08], false, AnonModule, + [Expr + (Record + (None, None, + [SynExprRecordField + ((SynLongIdent ([A], [], [None]), true), Some (1,4--1,5), + Some (Const (Int32 1, (1,6--1,7))), Some ((1,8--2,2), None)); + SynExprRecordField + ((SynLongIdent ([B], [(2,3--2,4)], [None]), true), None, + None, None)], (1,0--2,6)), (1,0--2,6))], PreXmlDocEmpty, [], + None, (1,0--2,6), { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 09.fs b/tests/service/data/SyntaxTree/Expression/Record - Field 09.fs new file mode 100644 index 00000000000..031952b7707 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 09.fs @@ -0,0 +1,2 @@ +{ A = 1 + B } diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 09.fs.bsl b/tests/service/data/SyntaxTree/Expression/Record - Field 09.fs.bsl new file mode 100644 index 00000000000..978b9b8be22 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 09.fs.bsl @@ -0,0 +1,18 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Record - Field 09.fs", false, + QualifiedNameOfFile Record - Field 09, [], [], + [SynModuleOrNamespace + ([Record - Field 09], false, AnonModule, + [Expr + (Record + (None, None, + [SynExprRecordField + ((SynLongIdent ([A], [], [None]), true), Some (1,4--1,5), + Some (Const (Int32 1, (1,6--1,7))), Some ((1,8--2,2), None)); + SynExprRecordField + ((SynLongIdent ([B], [], [None]), true), None, None, None)], + (1,0--2,5)), (1,0--2,5))], PreXmlDocEmpty, [], None, (1,0--2,5), + { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 10.fs b/tests/service/data/SyntaxTree/Expression/Record - Field 10.fs new file mode 100644 index 00000000000..327c08d3b2e --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 10.fs @@ -0,0 +1,2 @@ +{ A + B = 1 } diff --git a/tests/service/data/SyntaxTree/Expression/Record - Field 10.fs.bsl b/tests/service/data/SyntaxTree/Expression/Record - Field 10.fs.bsl new file mode 100644 index 00000000000..772df3c11ad --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Record - Field 10.fs.bsl @@ -0,0 +1,25 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Record - Field 10.fs", false, + QualifiedNameOfFile Record - Field 10, [], [], + [SynModuleOrNamespace + ([Record - Field 10], false, AnonModule, + [Expr + (ComputationExpr + (false, + Sequential + (SuppressNeither, true, Ident A, + App + (NonAtomic, false, + App + (NonAtomic, true, + LongIdent + (false, + SynLongIdent + ([op_Equality], [], [Some (OriginalNotation "=")]), + None, (2,4--2,5)), Ident B, (2,2--2,5)), + Const (Int32 1, (2,6--2,7)), (2,2--2,7)), (1,2--2,7)), + (1,0--2,9)), (1,0--2,9))], PreXmlDocEmpty, [], None, (1,0--2,9), + { LeadingKeyword = None })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent.fs b/tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent 01.fs similarity index 100% rename from tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent.fs rename to tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent 01.fs diff --git a/tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent.fs.bsl b/tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent 01.fs.bsl similarity index 59% rename from tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent.fs.bsl rename to tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent 01.fs.bsl index fc7e4284b07..1c80bec2e2b 100644 --- a/tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent.fs.bsl +++ b/tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent 01.fs.bsl @@ -1,13 +1,12 @@ ImplFile (ParsedImplFileInput - ("/root/SynIdent/IncompleteLongIdent.fs", false, QualifiedNameOfFile Module, - [], [], + ("/root/SynIdent/IncompleteLongIdent 01.fs", false, + QualifiedNameOfFile Module, [], [], [SynModuleOrNamespace ([Module], false, NamedModule, [Expr - (LongIdent - (false, SynLongIdent ([A], [(4,1--4,2)], [None]), None, - (4,0--4,2)), (4,0--4,2))], + (DiscardAfterMissingQualificationAfterDot + (Ident A, (4,1--4,2), (4,0--4,2)), (4,0--4,2))], PreXmlDoc ((2,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (2,0--4,2), { LeadingKeyword = Module (2,0--2,6) })], (true, false), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent 02.fs b/tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent 02.fs new file mode 100644 index 00000000000..ca45e63353c --- /dev/null +++ b/tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent 02.fs @@ -0,0 +1,4 @@ + +module Module + +A.B. diff --git a/tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent 02.fs.bsl b/tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent 02.fs.bsl new file mode 100644 index 00000000000..ed4df1e6fc6 --- /dev/null +++ b/tests/service/data/SyntaxTree/SynIdent/IncompleteLongIdent 02.fs.bsl @@ -0,0 +1,15 @@ +ImplFile + (ParsedImplFileInput + ("/root/SynIdent/IncompleteLongIdent 02.fs", false, + QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Expr + (DiscardAfterMissingQualificationAfterDot + (LongIdent + (false, SynLongIdent ([A; B], [(4,1--4,2)], [None; None]), + None, (4,0--4,3)), (4,3--4,4), (4,0--4,4)), (4,0--4,4))], + PreXmlDoc ((2,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (2,0--4,4), { LeadingKeyword = Module (2,0--2,6) })], (true, false), + { ConditionalDirectives = [] + CodeComments = [] }, set []))