diff --git a/src/fsharp/CheckComputationExpressions.fs b/src/fsharp/CheckComputationExpressions.fs index 2f23df7172c..27c98d172ad 100644 --- a/src/fsharp/CheckComputationExpressions.fs +++ b/src/fsharp/CheckComputationExpressions.fs @@ -17,6 +17,7 @@ open FSharp.Compiler.NameResolution open FSharp.Compiler.PatternMatchCompilation open FSharp.Compiler.Syntax.PrettyNaming open FSharp.Compiler.Syntax +open FSharp.Compiler.SyntaxTrivia open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.Text open FSharp.Compiler.Text.Range @@ -676,7 +677,7 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter Some (nm, Option.get (tryGetDataForCustomOperation nm), core, core.Range, optIntoInfo) | _ -> None - let mkSynLambda p e m = SynExpr.Lambda (false, false, p, None, e, None, m) + let mkSynLambda p e m = SynExpr.Lambda (false, false, p, e, None, m, SynExprLambdaTrivia.Zero) let mkExprForVarSpace m (patvs: Val list) = match patvs with @@ -708,10 +709,10 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter // NOTE: we should probably suppress these sequence points altogether let rangeForCombine innerComp1 = match innerComp1 with - | SynExpr.IfThenElse (ifToThenRange=mIfToThen) -> mIfToThen + | SynExpr.IfThenElse (trivia={ IfToThenRange = mIfToThen }) -> mIfToThen | SynExpr.Match (matchDebugPoint=DebugPointAtBinding.Yes mMatch) -> mMatch - | SynExpr.TryWith (tryDebugPoint=DebugPointAtTry.Yes mTry) -> mTry - | SynExpr.TryFinally (tryDebugPoint=DebugPointAtTry.Yes mTry) -> mTry + | SynExpr.TryWith (trivia={ TryKeyword = mTry }) -> mTry + | SynExpr.TryFinally (trivia={ TryKeyword = mTry }) -> mTry | SynExpr.For (forDebugPoint=DebugPointAtFor.Yes mBind) -> mBind | SynExpr.ForEach (forDebugPoint=DebugPointAtFor.Yes mBind) -> mBind | SynExpr.While (whileDebugPoint=DebugPointAtWhile.Yes mWhile) -> mWhile @@ -950,7 +951,7 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter Some (trans CompExprTranslationPass.Initial q varSpace innerComp (fun holeFill -> - translatedCtxt (mkSynCall "For" mFor [wrappedSourceExpr; SynExpr.MatchLambda (false, sourceExpr.Range, [SynMatchClause(pat, None, None, holeFill, mPat, DebugPointAtTarget.Yes)], spBind, mFor) ])) ) + translatedCtxt (mkSynCall "For" mFor [wrappedSourceExpr; SynExpr.MatchLambda (false, sourceExpr.Range, [SynMatchClause(pat, None, holeFill, mPat, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero)], spBind, mFor) ])) ) | SynExpr.For (forDebugPoint=spBind; ident=id; identBody=start; direction=dir; toBody=finish; doBody=innerComp; range=m) -> let mFor = match spBind with DebugPointAtFor.Yes m -> m.NoteDebugPoint(RangeDebugPointKind.For) | _ -> m @@ -967,9 +968,9 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter error(Error(FSComp.SR.tcRequireBuilderMethod("Delay"), mWhile)) Some(trans CompExprTranslationPass.Initial q varSpace innerComp (fun holeFill -> translatedCtxt (mkSynCall "While" mWhile [mkSynDelay2 guardExpr; mkSynCall "Delay" mWhile [mkSynDelay innerComp.Range holeFill]])) ) - | SynExpr.TryFinally (innerComp, unwindExpr, mTryToLast, spTry, _spFinally) -> + | SynExpr.TryFinally (innerComp, unwindExpr, _mTryToLast, spTry, _spFinally, trivia) -> - let mTry = match spTry with DebugPointAtTry.Yes m -> m.NoteDebugPoint(RangeDebugPointKind.Try) | _ -> mTryToLast + let mTry = match spTry with DebugPointAtTry.Yes m -> m.NoteDebugPoint(RangeDebugPointKind.Try) | _ -> trivia.TryKeyword if isQuery then error(Error(FSComp.SR.tcNoTryFinallyInQuery(), mTry)) if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mTry ad "TryFinally" builderTy) then error(Error(FSComp.SR.tcRequireBuilderMethod("TryFinally"), mTry)) @@ -1077,17 +1078,17 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter SynExpr.Sequential(sp, true, innerComp1, holeFill, m) translatedCtxt fillExpr)) - | SynExpr.IfThenElse (ifKw, isElif, guardExpr, thenKw, thenComp, elseKw, elseCompOpt, spIfToThen, isRecovery, mIfToThen, mIfToEndOfElseBranch) -> + | SynExpr.IfThenElse (guardExpr, thenComp, elseCompOpt, spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia) -> match elseCompOpt with | Some elseComp -> - if isQuery then error(Error(FSComp.SR.tcIfThenElseMayNotBeUsedWithinQueries(), mIfToThen)) - Some (translatedCtxt (SynExpr.IfThenElse (ifKw, isElif, guardExpr, thenKw, transNoQueryOps thenComp, elseKw, Some(transNoQueryOps elseComp), spIfToThen, isRecovery, mIfToThen, mIfToEndOfElseBranch))) + if isQuery then error(Error(FSComp.SR.tcIfThenElseMayNotBeUsedWithinQueries(), trivia.IfToThenRange)) + Some (translatedCtxt (SynExpr.IfThenElse (guardExpr, transNoQueryOps thenComp, Some(transNoQueryOps elseComp), spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia))) | None -> let elseComp = - if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mIfToThen ad "Zero" builderTy) then - error(Error(FSComp.SR.tcRequireBuilderMethod("Zero"), mIfToThen)) - mkSynCall "Zero" mIfToThen [] - Some (trans CompExprTranslationPass.Initial q varSpace thenComp (fun holeFill -> translatedCtxt (SynExpr.IfThenElse (ifKw, isElif, guardExpr, thenKw, holeFill, None, Some elseComp, spIfToThen, isRecovery, mIfToThen, mIfToEndOfElseBranch)))) + if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env trivia.IfToThenRange ad "Zero" builderTy) then + error(Error(FSComp.SR.tcRequireBuilderMethod("Zero"), trivia.IfToThenRange)) + mkSynCall "Zero" trivia.IfToThenRange [] + Some (trans CompExprTranslationPass.Initial q varSpace thenComp (fun holeFill -> translatedCtxt (SynExpr.IfThenElse (guardExpr, holeFill, Some elseComp, spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia)))) // 'let binds in expr' | SynExpr.LetOrUse (isRec, false, binds, innerComp, m) -> @@ -1124,7 +1125,7 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter let bindRange = match spBind with DebugPointAtBinding.Yes m -> m | _ -> rhsExpr.Range if isQuery then error(Error(FSComp.SR.tcUseMayNotBeUsedInQueries(), bindRange)) let innerCompRange = innerComp.Range - let consumeExpr = SynExpr.MatchLambda(false, innerCompRange, [SynMatchClause(pat, None, None, transNoQueryOps innerComp, innerCompRange, DebugPointAtTarget.Yes)], spBind, innerCompRange) + let consumeExpr = SynExpr.MatchLambda(false, innerCompRange, [SynMatchClause(pat, None, transNoQueryOps innerComp, innerCompRange, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero)], spBind, innerCompRange) if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env bindRange ad "Using" builderTy) then error(Error(FSComp.SR.tcRequireBuilderMethod("Using"), bindRange)) Some (translatedCtxt (mkSynCall "Using" bindRange [rhsExpr; consumeExpr ])) @@ -1160,9 +1161,9 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env bindRange ad "Bind" builderTy) then error(Error(FSComp.SR.tcRequireBuilderMethod("Bind"), bindRange)) - let consumeExpr = SynExpr.MatchLambda(false, bindRange, [SynMatchClause(pat, None, None, transNoQueryOps innerComp, innerComp.Range, DebugPointAtTarget.Yes)], spBind, bindRange) + let consumeExpr = SynExpr.MatchLambda(false, bindRange, [SynMatchClause(pat, None, transNoQueryOps innerComp, innerComp.Range, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero)], spBind, bindRange) let consumeExpr = mkSynCall "Using" bindRange [SynExpr.Ident(id); consumeExpr ] - let consumeExpr = SynExpr.MatchLambda(false, bindRange, [SynMatchClause(pat, None, None, consumeExpr, id.idRange, DebugPointAtTarget.Yes)], spBind, bindRange) + let consumeExpr = SynExpr.MatchLambda(false, bindRange, [SynMatchClause(pat, None, consumeExpr, id.idRange, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero)], spBind, bindRange) let rhsExpr = mkSourceExprConditional isFromSource rhsExpr // TODO: consider allowing translation to BindReturn Some(translatedCtxt (mkSynCall "Bind" bindRange [rhsExpr; consumeExpr])) @@ -1287,7 +1288,7 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter | SynExpr.Match (mMatch, spMatch, expr, mWith, clauses, m) -> if isQuery then error(Error(FSComp.SR.tcMatchMayNotBeUsedWithQuery(), mMatch)) - let clauses = clauses |> List.map (fun (SynMatchClause(pat, cond, arrow, innerComp, patm, sp)) -> SynMatchClause(pat, cond, arrow, transNoQueryOps innerComp, patm, sp)) + let clauses = clauses |> List.map (fun (SynMatchClause(pat, cond, innerComp, patm, sp, trivia)) -> SynMatchClause(pat, cond, transNoQueryOps innerComp, patm, sp, trivia)) Some(translatedCtxt (SynExpr.Match (mMatch, spMatch, expr, mWith, clauses, m))) // 'match! expr with pats ...' --> build.Bind(e1, (function pats ...)) @@ -1298,18 +1299,18 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mMatch ad "Bind" builderTy) then error(Error(FSComp.SR.tcRequireBuilderMethod("Bind"), mMatch)) - let clauses = clauses |> List.map (fun (SynMatchClause(pat, cond, arrow, innerComp, patm, sp)) -> SynMatchClause(pat, cond, arrow, transNoQueryOps innerComp, patm, sp)) + let clauses = clauses |> List.map (fun (SynMatchClause(pat, cond, innerComp, patm, sp, trivia)) -> SynMatchClause(pat, cond, transNoQueryOps innerComp, patm, sp, trivia)) let consumeExpr = SynExpr.MatchLambda (false, mMatch, clauses, spMatch, mMatch) // TODO: consider allowing translation to BindReturn Some(translatedCtxt (mkSynCall "Bind" mMatch [matchExpr; consumeExpr])) - | SynExpr.TryWith (_mTry, innerComp, _mTryToWith, _mWith, clauses, _mWithToLast, mTryToLast, spTry, _spWith) -> - let mTry = match spTry with DebugPointAtTry.Yes m -> m.NoteDebugPoint(RangeDebugPointKind.Try) | _ -> mTryToLast + | SynExpr.TryWith (innerComp, clauses, mTryToLast, spTry, _spWith, trivia) -> + let mTry = match spTry with DebugPointAtTry.Yes _ -> trivia.TryKeyword.NoteDebugPoint(RangeDebugPointKind.Try) | _ -> trivia.TryKeyword if isQuery then error(Error(FSComp.SR.tcTryWithMayNotBeUsedInQueries(), mTry)) - let clauses = clauses |> List.map (fun (SynMatchClause(pat, cond, arrow, clauseComp, patm, sp)) -> SynMatchClause(pat, cond, arrow, transNoQueryOps clauseComp, patm, sp)) + let clauses = clauses |> List.map (fun (SynMatchClause(pat, cond, clauseComp, patm, sp, trivia)) -> SynMatchClause(pat, cond, transNoQueryOps clauseComp, patm, sp, trivia)) let consumeExpr = SynExpr.MatchLambda(true, mTryToLast, clauses, DebugPointAtBinding.NoneAtSticky, mTryToLast) if isNil (TryFindIntrinsicOrExtensionMethInfo ResultCollectionSettings.AtMostOneResult cenv env mTry ad "TryWith" builderTy) then @@ -1395,7 +1396,7 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter // Check for the [] attribute on each argument position let args = args |> List.mapi (fun i arg -> if isCustomOperationProjectionParameter (i+1) nm then - SynExpr.Lambda (false, false, varSpaceSimplePat, None, arg, None, arg.Range.MakeSynthetic()) + SynExpr.Lambda (false, false, varSpaceSimplePat, arg, None, arg.Range.MakeSynthetic(), SynExprLambdaTrivia.Zero) else arg) mkSynCall methInfo.DisplayName mClause (dataCompPrior :: args) else @@ -1514,7 +1515,7 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter // Build the `BindReturn` call let dataCompPriorToOp = - let consumeExpr = SynExpr.MatchLambda(false, consumePat.Range, [SynMatchClause(consumePat, None, None, innerExpr, innerRange, DebugPointAtTarget.Yes)], spBind, innerRange) + let consumeExpr = SynExpr.MatchLambda(false, consumePat.Range, [SynMatchClause(consumePat, None, innerExpr, innerRange, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero)], spBind, innerRange) translatedCtxt (mkSynCall bindName bindRange (bindArgs @ [consumeExpr])) match customOpInfo with @@ -1530,7 +1531,7 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter // Build the `Bind` call trans CompExprTranslationPass.Initial q varSpace innerComp (fun holeFill -> - let consumeExpr = SynExpr.MatchLambda(false, consumePat.Range, [SynMatchClause(consumePat, None, None, holeFill, innerRange, DebugPointAtTarget.Yes)], spBind, innerRange) + let consumeExpr = SynExpr.MatchLambda(false, consumePat.Range, [SynMatchClause(consumePat, None, holeFill, innerRange, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero)], spBind, innerRange) translatedCtxt (mkSynCall bindName bindRange (bindArgs @ [consumeExpr]))) and convertSimpleReturnToExpr varSpace innerComp = @@ -1538,17 +1539,17 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter | SynExpr.YieldOrReturn ((false, _), returnExpr, _) -> Some (returnExpr, None) | SynExpr.Match (mMatch, spMatch, mWith, expr, clauses, m) -> let clauses = - clauses |> List.map (fun (SynMatchClause(pat, cond, arrow, innerComp2, patm, sp)) -> + clauses |> List.map (fun (SynMatchClause(pat, cond, innerComp2, patm, sp, trivia)) -> match convertSimpleReturnToExpr varSpace innerComp2 with | None -> None // failure | Some (_, Some _) -> None // custom op on branch = failure - | Some (innerExpr2, None) -> Some (SynMatchClause(pat, cond, arrow, innerExpr2, patm, sp))) + | Some (innerExpr2, None) -> Some (SynMatchClause(pat, cond, innerExpr2, patm, sp, trivia))) if clauses |> List.forall Option.isSome then Some (SynExpr.Match (mMatch, spMatch, mWith, expr, (clauses |> List.map Option.get), m), None) else None - | SynExpr.IfThenElse (ifKw, isElif, guardExpr, thenKw, thenComp, elseKw, elseCompOpt, spIfToThen, isRecovery, mIfToThen, mIfToEndOfElseBranch) -> + | SynExpr.IfThenElse (guardExpr, thenComp, elseCompOpt, spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia) -> match convertSimpleReturnToExpr varSpace thenComp with | None -> None | Some (_, Some _) -> None @@ -1563,7 +1564,7 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter | Some (elseExpr, None) -> Some (Some elseExpr) match elseExprOptOpt with | None -> None - | Some elseExprOpt -> Some (SynExpr.IfThenElse (ifKw, isElif, guardExpr, thenKw, thenExpr, elseKw, elseExprOpt, spIfToThen, isRecovery, mIfToThen, mIfToEndOfElseBranch), None) + | Some elseExprOpt -> Some (SynExpr.IfThenElse (guardExpr, thenExpr, elseExprOpt, spIfToThen, isRecovery, mIfToEndOfElseBranch, trivia), None) | SynExpr.LetOrUse (isRec, false, binds, innerComp, m) -> match convertSimpleReturnToExpr varSpace innerComp with @@ -1604,7 +1605,7 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter | OptionalSequential (JoinOrGroupJoinOrZipClause _, _) -> false | OptionalSequential (CustomOperationClause _, _) -> false | SynExpr.Sequential (_, _, innerComp1, innerComp2, _) -> isSimpleExpr innerComp1 && isSimpleExpr innerComp2 - | SynExpr.IfThenElse (_, _, _, _, thenComp, _, elseCompOpt, _, _, _, _) -> + | SynExpr.IfThenElse (thenExpr=thenComp; elseExpr=elseCompOpt) -> isSimpleExpr thenComp && (match elseCompOpt with None -> true | Some c -> isSimpleExpr c) | SynExpr.LetOrUse (_, _, _, innerComp, _) -> isSimpleExpr innerComp | SynExpr.LetOrUseBang _ -> false @@ -1639,7 +1640,7 @@ let TcComputationExpression cenv env (overallTy: OverallTy) tpenv (mWhole, inter let lambdaExpr = let mBuilderVal = mBuilderVal.MakeSynthetic() - SynExpr.Lambda (false, false, SynSimplePats.SimplePats ([mkSynSimplePatVar false (mkSynId mBuilderVal builderValName)], mBuilderVal), None, runExpr, None, mBuilderVal) + SynExpr.Lambda (false, false, SynSimplePats.SimplePats ([mkSynSimplePatVar false (mkSynId mBuilderVal builderValName)], mBuilderVal), runExpr, None, mBuilderVal, SynExprLambdaTrivia.Zero) let env = match comp with @@ -1789,7 +1790,7 @@ let TcSequenceExpression (cenv: cenv) env tpenv comp (overallTy: OverallTy) m = let innerExpr = mkDelayedExpr mWhile innerExpr Some(mkSeqGenerated cenv env guardExprMark genOuterTy guardExpr innerExpr, tpenv) - | SynExpr.TryFinally (innerComp, unwindExpr, mTryToLast, spTry, spFinally) -> + | SynExpr.TryFinally (innerComp, unwindExpr, mTryToLast, spTry, spFinally, trivia) -> let innerExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv innerComp let unwindExpr, tpenv = TcExpr cenv (MustEqual cenv.g.unit_ty) env tpenv unwindExpr @@ -1797,12 +1798,12 @@ let TcSequenceExpression (cenv: cenv) env tpenv comp (overallTy: OverallTy) m = let mTry = match spTry with | DebugPointAtTry.Yes m -> m.NoteDebugPoint(RangeDebugPointKind.Try) - | _ -> unwindExpr.Range + | _ -> trivia.TryKeyword let mFinally = match spFinally with | DebugPointAtFinally.Yes m -> m.NoteDebugPoint(RangeDebugPointKind.Finally) - | _ -> unwindExpr.Range + | _ -> trivia.FinallyKeyword let innerExpr = mkDelayedExpr mTry innerExpr let unwindExpr = mkUnitDelayLambda cenv.g mFinally unwindExpr @@ -1831,10 +1832,10 @@ let TcSequenceExpression (cenv: cenv) env tpenv comp (overallTy: OverallTy) m = let innerExpr2, tpenv = tcSequenceExprBody env genOuterTy tpenv innerComp2 Some(Expr.Sequential(stmt1, innerExpr2, NormalSeq, sp, m), tpenv) - | SynExpr.IfThenElse (_, _, guardExpr, _, thenComp, _, elseCompOpt, spIfToThen, _isRecovery, mIfToThen, mIfToEndOfElseBranch) -> + | SynExpr.IfThenElse (guardExpr, thenComp, elseCompOpt, spIfToThen, _isRecovery, mIfToEndOfElseBranch, trivia) -> let guardExpr', tpenv = TcExpr cenv (MustEqual cenv.g.bool_ty) env tpenv guardExpr let thenExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv thenComp - let elseComp = (match elseCompOpt with Some c -> c | None -> SynExpr.ImplicitZero mIfToThen) + let elseComp = (match elseCompOpt with Some c -> c | None -> SynExpr.ImplicitZero trivia.IfToThenRange) let elseExpr, tpenv = tcSequenceExprBody env genOuterTy tpenv elseComp Some(mkCond spIfToThen DebugPointAtTarget.Yes mIfToEndOfElseBranch genOuterTy guardExpr' thenExpr elseExpr, tpenv) @@ -1873,7 +1874,7 @@ let TcSequenceExpression (cenv: cenv) env tpenv comp (overallTy: OverallTy) m = | SynExpr.Match (_mMatch, spMatch, expr, _mWith, clauses, _m) -> let inputExpr, matchty, tpenv = TcExprOfUnknownType cenv env tpenv expr let tclauses, tpenv = - (tpenv, clauses) ||> List.mapFold (fun tpenv (SynMatchClause(pat, cond, _, innerComp, _, sp)) -> + (tpenv, clauses) ||> List.mapFold (fun tpenv (SynMatchClause(pat, cond, innerComp, _, sp, _)) -> let pat', cond', vspecs, envinner, tpenv = TcMatchPattern cenv matchty env tpenv (pat, cond) let innerExpr, tpenv = tcSequenceExprBody envinner genOuterTy tpenv innerComp TClause(pat', cond', TTarget(vspecs, innerExpr, sp, None), pat'.Range), tpenv) @@ -1882,7 +1883,7 @@ let TcSequenceExpression (cenv: cenv) env tpenv comp (overallTy: OverallTy) m = let matchv, matchExpr = CompilePatternForMatchClauses cenv env inputExprMark inputExprMark true ThrowIncompleteMatchException (Some inputExpr) inputExprTy genOuterTy tclauses Some(mkLet spMatch inputExprMark matchv inputExpr matchExpr, tpenv) - | SynExpr.TryWith (tryRange=mTryToWith) -> + | SynExpr.TryWith (trivia={ TryToWithRange = mTryToWith }) -> error(Error(FSComp.SR.tcTryIllegalInSequenceExpression(), mTryToWith)) | SynExpr.YieldOrReturnFrom ((isYield, _), yieldExpr, m) -> diff --git a/src/fsharp/CheckDeclarations.fs b/src/fsharp/CheckDeclarations.fs index b89976d0a97..69e01dad663 100644 --- a/src/fsharp/CheckDeclarations.fs +++ b/src/fsharp/CheckDeclarations.fs @@ -469,7 +469,7 @@ module TcRecdUnionAndEnumDeclarations = | _ -> seen.Add(f.LogicalName, sf)) - let TcUnionCaseDecl cenv env parent thisTy thisTyInst tpenv (SynUnionCase(Attributes synAttrs, id, args, xmldoc, vis, m)) = + let TcUnionCaseDecl cenv env parent thisTy thisTyInst tpenv (SynUnionCase(Attributes synAttrs, id, args, xmldoc, vis, m, _)) = let attrs = TcAttributes cenv env AttributeTargets.UnionCaseDecl synAttrs // the attributes of a union case decl get attached to the generated "static factory" method let vis, _ = ComputeAccessAndCompPath env None m vis None parent let vis = CombineReprAccess parent vis @@ -2911,7 +2911,7 @@ let CheckForDuplicateModule env nm m = /// Check 'exception' declarations in implementations and signatures module TcExceptionDeclarations = - let TcExnDefnCore_Phase1A cenv env parent (SynExceptionDefnRepr(Attributes synAttrs, SynUnionCase(_, id, _, _, _, _), _, doc, vis, m)) = + let TcExnDefnCore_Phase1A cenv env parent (SynExceptionDefnRepr(Attributes synAttrs, SynUnionCase(ident=id), _, doc, vis, m)) = let attrs = TcAttributes cenv env AttributeTargets.ExnDecl synAttrs if not (String.isLeadingIdentifierCharacterUpperCase id.idText) then errorR(NotUpperCaseConstructor m) let vis, cpath = ComputeAccessAndCompPath env None m vis None parent @@ -2922,7 +2922,7 @@ module TcExceptionDeclarations = let doc = doc.ToXmlDoc(true, Some []) Construct.NewExn cpath id vis repr attrs doc - let TcExnDefnCore_Phase1G_EstablishRepresentation (cenv: cenv) (env: TcEnv) parent (exnc: Entity) (SynExceptionDefnRepr(_, SynUnionCase(_, _, args, _, _, _), reprIdOpt, _, _, m)) = + let TcExnDefnCore_Phase1G_EstablishRepresentation (cenv: cenv) (env: TcEnv) parent (exnc: Entity) (SynExceptionDefnRepr(_, SynUnionCase(caseType=args), reprIdOpt, _, _, m)) = let g = cenv.g let args = match args with SynUnionCaseKind.Fields args -> args | _ -> error(Error(FSComp.SR.tcExplicitTypeSpecificationCannotBeUsedForExceptionConstructors(), m)) let ad = env.AccessRights @@ -3111,7 +3111,7 @@ module EstablishTypeDefinitionCores = | SynTypeDefnSimpleRepr.None _ -> () | SynTypeDefnSimpleRepr.Union (_, unionCases, _) -> - for SynUnionCase (_, _, args, _, _, m) in unionCases do + for SynUnionCase (caseType=args; range=m) in unionCases do match args with | SynUnionCaseKind.Fields flds -> for SynField(_, _, _, ty, _, _, _, m) in flds do @@ -5225,7 +5225,7 @@ and TcSignatureElementsMutRec cenv parent typeNames m mutRecNSInfo envInitial (d decls, (openOk, moduleAbbrevOk) | SynModuleSigDecl.Exception (exnSig=SynExceptionSig(exnRepr=exnRepr; withKeyword=withKeyword; members=members)) -> - let ( SynExceptionDefnRepr(synAttrs, SynUnionCase(_, id, _args, _, _, _), _, doc, vis, m)) = exnRepr + let ( SynExceptionDefnRepr(synAttrs, SynUnionCase(ident=id), _, doc, vis, m)) = exnRepr let compInfo = SynComponentInfo(synAttrs, None, [], [id], doc, false, vis, id.idRange) let decls = [ MutRecShape.Tycon(SynTypeDefnSig.SynTypeDefnSig(compInfo, None, SynTypeDefnSigRepr.Exception exnRepr, withKeyword, members, m)) ] decls, (false, false) @@ -5562,7 +5562,7 @@ and TcModuleOrNamespaceElementsMutRec (cenv: cenv) parent typeNames m envInitial decls, (openOk, moduleAbbrevOk, attrs) | SynModuleDecl.Exception (SynExceptionDefn(repr, _, members, _), _m) -> - let (SynExceptionDefnRepr(synAttrs, SynUnionCase(_, id, _args, _, _, _), _repr, doc, vis, m)) = repr + let (SynExceptionDefnRepr(synAttrs, SynUnionCase(ident=id), _repr, doc, vis, m)) = repr let compInfo = SynComponentInfo(synAttrs, None, [], [id], doc, false, vis, id.idRange) let decls = [ MutRecShape.Tycon(SynTypeDefn(compInfo, None, SynTypeDefnRepr.Exception repr, None, members, None, m)) ] decls, (false, false, attrs) diff --git a/src/fsharp/CheckExpressions.fs b/src/fsharp/CheckExpressions.fs index 5c66fd46a4e..58310006a33 100644 --- a/src/fsharp/CheckExpressions.fs +++ b/src/fsharp/CheckExpressions.fs @@ -2559,7 +2559,7 @@ module EventDeclarationNormalization = match rhsExpr with // Detect 'fun () -> e' which results from the compilation of a property getter - | SynExpr.Lambda (_, _, SynSimplePats.SimplePats([], _), _, trueRhsExpr, _, m) -> + | SynExpr.Lambda (args=SynSimplePats.SimplePats([], _); body=trueRhsExpr; range=m) -> let rhsExpr = mkSynApp1 (SynExpr.DotGet (SynExpr.Paren (trueRhsExpr, range0, None, m), range0, LongIdentWithDots([ident(target, m)], []), m)) (SynExpr.Ident (ident(argName, m))) m // reconstitute rhsExpr @@ -5766,10 +5766,10 @@ and TcExprUndelayed cenv (overallTy: OverallTy) env tpenv (synExpr: SynExpr) = | SynExpr.LetOrUse _ -> TcLinearExprs (TcExprThatCanBeCtorBody cenv) cenv env overallTy tpenv false synExpr (fun x -> x) - | SynExpr.TryWith (_mTry, synBodyExpr, _mTryToWith, _mWith, synWithClauses, mWithToLast, mTryToLast, spTry, spWith) -> - TcExprTryWith cenv overallTy env tpenv (synBodyExpr, _mTryToWith, synWithClauses, mWithToLast, mTryToLast, spTry, spWith) + | SynExpr.TryWith (synBodyExpr, synWithClauses, mTryToLast, spTry, spWith, trivia) -> + TcExprTryWith cenv overallTy env tpenv (synBodyExpr, synWithClauses, trivia.WithToEndRange, mTryToLast, spTry, spWith) - | SynExpr.TryFinally (synBodyExpr, synFinallyExpr, mTryToLast, spTry, spFinally) -> + | SynExpr.TryFinally (synBodyExpr, synFinallyExpr, mTryToLast, spTry, spFinally, _trivia) -> TcExprTryFinally cenv overallTy env tpenv (synBodyExpr, synFinallyExpr, mTryToLast, spTry, spFinally) | SynExpr.JoinIn (e1, mInToken, e2, mAll) -> @@ -6036,14 +6036,14 @@ and TcExprIntegerForLoop cenv overallTy env tpenv (spBind, id, start, dir, finis let bodyExpr, tpenv = TcStmt cenv envinner tpenv body mkFastForLoop cenv.g (spBind, m, idv, startExpr, dir, finishExpr, bodyExpr), tpenv -and TcExprTryWith cenv overallTy env tpenv (synBodyExpr, _mTryToWith, synWithClauses, mWithToLast, mTryToLast, spTry, spWith) = +and TcExprTryWith cenv overallTy env tpenv (synBodyExpr, synWithClauses, mWithToLast, mTryToLast, spTry, spWith) = let bodyExpr, tpenv = TcExpr cenv overallTy env tpenv synBodyExpr // Compile the pattern twice, once as a List.filter with all succeeding targets returning "1", and once as a proper catch block. let filterClauses = synWithClauses |> List.map (fun clause -> - let (SynMatchClause(pat, optWhenExpr, arrow, _, m, _)) = clause + let (SynMatchClause(pat, optWhenExpr, _, m, _, trivia)) = clause let oneExpr = SynExpr.Const (SynConst.Int32 1, m) - SynMatchClause(pat, optWhenExpr, arrow, oneExpr, m, DebugPointAtTarget.No)) + SynMatchClause(pat, optWhenExpr, oneExpr, m, DebugPointAtTarget.No, trivia)) let checkedFilterClauses, tpenv = TcMatchClauses cenv cenv.g.exn_ty (MustEqual cenv.g.int_ty) env tpenv filterClauses let checkedHandlerClauses, tpenv = TcMatchClauses cenv cenv.g.exn_ty overallTy env tpenv synWithClauses let v1, filterExpr = CompilePatternForMatchClauses cenv env mWithToLast mWithToLast true FailFilter None cenv.g.exn_ty cenv.g.int_ty checkedFilterClauses @@ -6215,7 +6215,7 @@ and RewriteRangeExpr expr = /// Check lambdas as a group, to catch duplicate names in patterns and TcIteratedLambdas cenv isFirst (env: TcEnv) overallTy takenNames tpenv e = match e with - | SynExpr.Lambda (isMember, isSubsequent, spats, _, bodyExpr, _, m) when isMember || isFirst || isSubsequent -> + | SynExpr.Lambda (isMember, isSubsequent, spats, bodyExpr, _, m, _) when isMember || isFirst || isSubsequent -> let domainTy, resultTy = UnifyFunctionType None cenv env.DisplayEnv m overallTy.Commit let vs, (tpenv, names, takenNames) = TcSimplePats cenv isMember CheckCxs domainTy env (tpenv, Map.empty, takenNames) spats let envinner, _, vspecMap = MakeAndPublishSimpleValsForMergedScope cenv env m names @@ -8484,7 +8484,7 @@ and TcImplicitOpItemThen cenv overallTy env id sln tpenv mItem delayed = | SynExpr.ArrayOrList (_, synExprs, _) -> synExprs |> List.forall isSimpleArgument | SynExpr.Record (copyInfo=copyOpt; recordFields=fields) -> copyOpt |> Option.forall (fst >> isSimpleArgument) && fields |> List.forall ((fun (SynExprRecordField(expr=e)) -> e) >> Option.forall isSimpleArgument) | SynExpr.App (_, _, synExpr, synExpr2, _) -> isSimpleArgument synExpr && isSimpleArgument synExpr2 - | SynExpr.IfThenElse (_, _, synExpr, _, synExpr2, _, synExprOpt, _, _, _, _) -> isSimpleArgument synExpr && isSimpleArgument synExpr2 && Option.forall isSimpleArgument synExprOpt + | SynExpr.IfThenElse (ifExpr=synExpr; thenExpr=synExpr2; elseExpr=synExprOpt) -> isSimpleArgument synExpr && isSimpleArgument synExpr2 && Option.forall isSimpleArgument synExprOpt | SynExpr.DotIndexedGet (synExpr, _, _, _) -> isSimpleArgument synExpr | SynExpr.ObjExpr _ | SynExpr.AnonRecd _ @@ -9711,7 +9711,7 @@ and TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr expr cont = TcLinearExprs bodyChecker cenv envinner overallTy tpenv isCompExpr body (fun (x, tpenv) -> cont (fst (mkf (x, overallTy.Commit)), tpenv)) - | SynExpr.IfThenElse (_, _, synBoolExpr, _, synThenExpr, _, synElseExprOpt, spIfToThen, isRecovery, mIfToThen, m) when not isCompExpr -> + | SynExpr.IfThenElse (synBoolExpr, synThenExpr, synElseExprOpt, spIfToThen, isRecovery, m, trivia) when not isCompExpr -> let boolExpr, tpenv = TcExprThatCantBeCtorBody cenv (MustEqual cenv.g.bool_ty) env tpenv synBoolExpr let thenExpr, tpenv = let env = @@ -9729,7 +9729,7 @@ and TcLinearExprs bodyChecker cenv env overallTy tpenv isCompExpr expr cont = match synElseExprOpt with | None -> - let elseExpr = mkUnit cenv.g mIfToThen + let elseExpr = mkUnit cenv.g trivia.IfToThenRange let spElse = DebugPointAtTarget.No // the fake 'unit' value gets exactly the same range as spIfToThen let overallExpr = primMkCond spIfToThen DebugPointAtTarget.Yes spElse m overallTy.Commit boolExpr thenExpr elseExpr cont (overallExpr, tpenv) @@ -9769,7 +9769,7 @@ and TcMatchClauses cenv inputTy (resultTy: OverallTy) env tpenv clauses = List.mapFold (fun clause -> TcMatchClause cenv inputTy resultTy env (isFirst()) clause) tpenv clauses and TcMatchClause cenv inputTy (resultTy: OverallTy) env isFirst tpenv synMatchClause = - let (SynMatchClause(pat, optWhenExpr, _, e, patm, spTgt)) = synMatchClause + let (SynMatchClause(pat, optWhenExpr, e, patm, spTgt, _)) = synMatchClause let pat', optWhenExprR, vspecs, envinner, tpenv = TcMatchPattern cenv inputTy env tpenv (pat, optWhenExpr) let resultEnv = if isFirst then envinner else { envinner with eContextInfo = ContextInfo.FollowingPatternMatchClause e.Range } let e', tpenv = TcExprThatCanBeCtorBody cenv resultTy resultEnv tpenv e diff --git a/src/fsharp/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/src/fsharp/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index 4b51ba2fe54..dd0e960947b 100644 --- a/src/fsharp/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/src/fsharp/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -447,6 +447,12 @@ ParserAndUntypedAST\XmlDoc.fs + + ParserAndUntypedAST\SyntaxTrivia.fsi + + + ParserAndUntypedAST\SyntaxTrivia.fs + ParserAndUntypedAST\SyntaxTree.fsi diff --git a/src/fsharp/SyntaxTree.fs b/src/fsharp/SyntaxTree.fs index 8df8bb8308c..20b4addbf1d 100644 --- a/src/fsharp/SyntaxTree.fs +++ b/src/fsharp/SyntaxTree.fs @@ -8,6 +8,7 @@ open FSharp.Compiler.Syntax open FSharp.Compiler.Text open FSharp.Compiler.Text.Range open FSharp.Compiler.Xml +open FSharp.Compiler.SyntaxTrivia [] type Ident (text: string, range: range) = @@ -563,10 +564,10 @@ type SynExpr = fromMethod: bool * inLambdaSeq: bool * args: SynSimplePats * - arrow: range option * body: SynExpr * parsedData: (SynPat list * SynExpr) option * - range: range + range: range * + trivia: SynExprLambdaTrivia | MatchLambda of isExnMatch: bool * @@ -615,22 +616,20 @@ type SynExpr = range: range | TryWith of - tryKeywordRange: range * tryExpr: SynExpr * - tryRange: range * - withKeywordRange: range * withCases: SynMatchClause list * - withRange: range * range: range * tryDebugPoint: DebugPointAtTry * - withDebugPoint: DebugPointAtWith + withDebugPoint: DebugPointAtWith * + trivia: SynExprTryWithTrivia | TryFinally of tryExpr: SynExpr * finallyExpr: SynExpr * range: range * tryDebugPoint: DebugPointAtTry * - finallyDebugPoint: DebugPointAtFinally + finallyDebugPoint: DebugPointAtFinally * + trivia: SynExprTryFinallyTrivia | Lazy of expr: SynExpr * @@ -644,17 +643,13 @@ type SynExpr = range: range | IfThenElse of - ifKeyword: range * - isElif: bool * ifExpr: SynExpr * - thenKeyword: range * thenExpr: SynExpr * - elseKeyword: range option * elseExpr: SynExpr option * spIfToThen: DebugPointAtBinding * isFromErrorRecovery: bool * - ifToThenRange: range * - range: range + range: range * + trivia: SynExprIfThenElseTrivia | Ident of ident: Ident @@ -1187,14 +1182,14 @@ type SynMatchClause = | SynMatchClause of pat: SynPat * whenExpr: SynExpr option * - arrow: range option * resultExpr: SynExpr * range: range * - debugPoint: DebugPointAtTarget + debugPoint: DebugPointAtTarget * + trivia: SynMatchClauseTrivia member this.RangeOfGuardAndRhs = match this with - | SynMatchClause(_, eo, _, e, _, _) -> + | SynMatchClause(whenExpr=eo; resultExpr=e) -> match eo with | None -> e.Range | Some x -> unionRanges e.Range x.Range @@ -1403,11 +1398,11 @@ type SynEnumCase = | SynEnumCase of attributes: SynAttributes * ident: Ident * - equalsRange: range * value: SynConst * valueRange: range * xmlDoc: PreXmlDoc * - range: range + range: range * + trivia: SynEnumCaseTrivia member this.Range = match this with @@ -1422,7 +1417,8 @@ type SynUnionCase = caseType: SynUnionCaseKind * xmlDoc: PreXmlDoc * accessibility: SynAccess option * - range: range + range: range * + trivia: SynUnionCaseTrivia member this.Range = match this with diff --git a/src/fsharp/SyntaxTree.fsi b/src/fsharp/SyntaxTree.fsi index 2b66e15c770..425c7804383 100644 --- a/src/fsharp/SyntaxTree.fsi +++ b/src/fsharp/SyntaxTree.fsi @@ -5,6 +5,7 @@ namespace rec FSharp.Compiler.Syntax open FSharp.Compiler.Syntax open FSharp.Compiler.Text open FSharp.Compiler.Xml +open FSharp.Compiler.SyntaxTrivia /// Represents an identifier in F# code [] @@ -693,10 +694,10 @@ type SynExpr = fromMethod: bool * inLambdaSeq: bool * args: SynSimplePats * - arrow: range option * body: SynExpr * parsedData: (SynPat list * SynExpr) option * - range: range + range: range * + trivia: SynExprLambdaTrivia /// F# syntax: function pat1 -> expr | ... | patN -> exprN | MatchLambda of @@ -760,15 +761,12 @@ type SynExpr = /// F# syntax: try expr with pat -> expr | TryWith of - tryKeywordRange: range * tryExpr: SynExpr * - tryRange: range * - withKeywordRange: range * withCases: SynMatchClause list * - withRange: range * range: range * tryDebugPoint: DebugPointAtTry * - withDebugPoint: DebugPointAtWith + withDebugPoint: DebugPointAtWith * + trivia: SynExprTryWithTrivia /// F# syntax: try expr finally expr | TryFinally of @@ -776,7 +774,8 @@ type SynExpr = finallyExpr: SynExpr * range: range * tryDebugPoint: DebugPointAtTry * - finallyDebugPoint: DebugPointAtFinally + finallyDebugPoint: DebugPointAtFinally * + trivia: SynExprTryFinallyTrivia /// F# syntax: lazy expr | Lazy of @@ -796,17 +795,13 @@ type SynExpr = /// F# syntax: if expr then expr /// F# syntax: if expr then expr else expr | IfThenElse of - ifKeyword: range * - isElif: bool * ifExpr: SynExpr * - thenKeyword: range * thenExpr: SynExpr * - elseKeyword: range option * elseExpr: SynExpr option * spIfToThen: DebugPointAtBinding * isFromErrorRecovery: bool * - ifToThenRange: range * - range: range + range: range * + trivia: SynExprIfThenElseTrivia /// F# syntax: ident /// Optimized representation for SynExpr.LongIdent (false, [id], id.idRange) @@ -1321,10 +1316,10 @@ type SynMatchClause = | SynMatchClause of pat: SynPat * whenExpr: SynExpr option * - arrow: range option * resultExpr: SynExpr * range: range * - debugPoint: DebugPointAtTarget + debugPoint: DebugPointAtTarget * + trivia: SynMatchClauseTrivia /// Gets the syntax range of part of this construct member RangeOfGuardAndRhs: range @@ -1567,11 +1562,11 @@ type SynEnumCase = | SynEnumCase of attributes: SynAttributes * ident: Ident * - equalsRange: range * value: SynConst * valueRange: range * xmlDoc: PreXmlDoc * - range: range + range: range * + trivia: SynEnumCaseTrivia /// Gets the syntax range of this construct member Range: range @@ -1586,7 +1581,8 @@ type SynUnionCase = caseType: SynUnionCaseKind * xmlDoc: PreXmlDoc * accessibility: SynAccess option * - range: range + range: range * + trivia: SynUnionCaseTrivia /// Gets the syntax range of this construct member Range: range diff --git a/src/fsharp/SyntaxTreeOps.fs b/src/fsharp/SyntaxTreeOps.fs index 10340e8b374..969dac27cae 100644 --- a/src/fsharp/SyntaxTreeOps.fs +++ b/src/fsharp/SyntaxTreeOps.fs @@ -5,6 +5,7 @@ module FSharp.Compiler.SyntaxTreeOps open Internal.Utilities.Library open FSharp.Compiler.ErrorLogger open FSharp.Compiler.Syntax +open FSharp.Compiler.SyntaxTrivia open FSharp.Compiler.Syntax.PrettyNaming open FSharp.Compiler.Text open FSharp.Compiler.Text.Range @@ -179,7 +180,7 @@ let rec SimplePatOfPat (synArgNameGenerator: SynArgNameGenerator) p = | SynPat.Wild _ -> None | _ -> Some (fun e -> - let clause = SynMatchClause(p, None, None, e, m, DebugPointAtTarget.No) + let clause = SynMatchClause(p, None, e, m, DebugPointAtTarget.No, SynMatchClauseTrivia.Zero) let artificialMatchRange = (unionRanges m e.Range).MakeSynthetic() SynExpr.Match (artificialMatchRange, DebugPointAtBinding.NoneAtInvisible, item, artificialMatchRange, [clause], artificialMatchRange)) @@ -224,7 +225,7 @@ let rec SimplePatsOfPat synArgNameGenerator p = let PushPatternToExpr synArgNameGenerator isMember pat (rhs: SynExpr) = let nowPats, laterF = SimplePatsOfPat synArgNameGenerator pat - nowPats, SynExpr.Lambda (isMember, false, nowPats, None, appFunOpt laterF rhs, None, rhs.Range) + nowPats, SynExpr.Lambda (isMember, false, nowPats, appFunOpt laterF rhs, None, rhs.Range, SynExprLambdaTrivia.Zero) let private isSimplePattern pat = let _nowPats, laterF = SimplePatsOfPat (SynArgNameGenerator()) pat @@ -253,8 +254,8 @@ let PushCurriedPatternsToExpr synArgNameGenerator wholem isMember pats arrow rhs match spatsl with | [] -> rhs | h :: t -> - let expr = List.foldBack (fun spats e -> SynExpr.Lambda (isMember, true, spats, arrow, e, None, wholem)) t rhs - let expr = SynExpr.Lambda (isMember, false, h, arrow, expr, Some (pats, rhs), wholem) + let expr = List.foldBack (fun spats e -> SynExpr.Lambda (isMember, true, spats, e, None, wholem, { ArrowRange = arrow })) t rhs + let expr = SynExpr.Lambda (isMember, false, h, expr, Some (pats, rhs), wholem, { ArrowRange = arrow }) expr spatsl, expr @@ -325,7 +326,7 @@ let mkSynUnit m = SynExpr.Const (SynConst.Unit, m) let mkSynUnitPat m = SynPat.Const(SynConst.Unit, m) let mkSynDelay m e = - SynExpr.Lambda (false, false, SynSimplePats.SimplePats ([mkSynCompGenSimplePatVar (mkSynId m "unitVar")], m), None, e, None, m) + SynExpr.Lambda (false, false, SynSimplePats.SimplePats ([mkSynCompGenSimplePatVar (mkSynId m "unitVar")], m), e, None, m, SynExprLambdaTrivia.Zero) let mkSynAssign (l: SynExpr) (r: SynExpr) = let m = unionRanges l.Range r.Range @@ -509,7 +510,7 @@ module SynInfo = if retInfo.Attributes.Length > 0 then [] else let rec loop e = match e with - | SynExpr.Lambda (false, _, spats, _, rest, _, _) -> + | SynExpr.Lambda (fromMethod=false; args=spats; body=rest) -> InferSynArgInfoFromSimplePats spats :: loop rest | _ -> [] loop origRhsExpr @@ -625,7 +626,7 @@ let rec synExprContainsError inpExpr = and walkBinds es = es |> List.exists walkBind and walkMatchClauses cl = - cl |> List.exists (fun (SynMatchClause(_, whenExpr, _, e, _, _)) -> walkExprOpt whenExpr || walkExpr e) + cl |> List.exists (fun (SynMatchClause(whenExpr=whenExpr; resultExpr=e)) -> walkExprOpt whenExpr || walkExpr e) and walkExprOpt eOpt = eOpt |> Option.exists walkExpr @@ -716,7 +717,7 @@ let rec synExprContainsError inpExpr = | SynExpr.TryWith (tryExpr=e; withCases=cl) -> walkExpr e || walkMatchClauses cl - | SynExpr.TryFinally (e1, e2, _, _, _) -> + | SynExpr.TryFinally (tryExpr=e1; finallyExpr=e2) -> walkExpr e1 || walkExpr e2 | SynExpr.Sequential (_, _, e1, e2, _) -> @@ -725,7 +726,7 @@ let rec synExprContainsError inpExpr = | SynExpr.SequentialOrImplicitYield (_, e1, e2, _, _) -> walkExpr e1 || walkExpr e2 - | SynExpr.IfThenElse (_, _, e1, _, e2, _, e3opt, _, _, _, _) -> + | SynExpr.IfThenElse (ifExpr=e1; thenExpr=e2; elseExpr=e3opt) -> walkExpr e1 || walkExpr e2 || walkExprOpt e3opt | SynExpr.IndexRange (expr1, _, expr2, _, _, _) -> diff --git a/src/fsharp/SyntaxTrivia.fs b/src/fsharp/SyntaxTrivia.fs new file mode 100644 index 00000000000..305a990aac0 --- /dev/null +++ b/src/fsharp/SyntaxTrivia.fs @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace FSharp.Compiler.SyntaxTrivia + +open FSharp.Compiler.Text + +[] +type SynExprTryWithTrivia = + { TryKeyword: range + TryToWithRange: range + WithKeyword: range + WithToEndRange: range } + +[] +type SynExprTryFinallyTrivia = + { TryKeyword: range + FinallyKeyword: range } + +[] +type SynExprIfThenElseTrivia = + { IfKeyword: range + IsElif: bool + ThenKeyword: range + ElseKeyword: range option + IfToThenRange: range } + +[] +type SynExprLambdaTrivia = + { ArrowRange: range option } + static member Zero: SynExprLambdaTrivia = { ArrowRange = None } + +[] +type SynMatchClauseTrivia = + { ArrowRange: range option + BarRange: range option } + static member Zero: SynMatchClauseTrivia = { ArrowRange = None; BarRange = None } + +[] +type SynEnumCaseTrivia = + { BarRange: range option + EqualsRange: range } + +[] +type SynUnionCaseTrivia = { BarRange: range option } diff --git a/src/fsharp/SyntaxTrivia.fsi b/src/fsharp/SyntaxTrivia.fsi new file mode 100644 index 00000000000..44f2f5d010b --- /dev/null +++ b/src/fsharp/SyntaxTrivia.fsi @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace FSharp.Compiler.SyntaxTrivia + +open FSharp.Compiler.Text + +/// Represents additional information for SynExpr.TryWith +[] +type SynExprTryWithTrivia = + { + /// The syntax range of the `try` keyword. + TryKeyword: range + /// The syntax range from the beginning of the `try` keyword till the end of the `with` keyword. + TryToWithRange: range + /// The syntax range of the `with` keyword + WithKeyword: range + /// The syntax range from the beginning of the `with` keyword till the end of the TryWith expression. + WithToEndRange: range + } + +/// Represents additional information for SynExpr.TryFinally +[] +type SynExprTryFinallyTrivia = + { + /// The syntax range of the `try` keyword. + TryKeyword: range + /// The syntax range of the `finally` keyword + FinallyKeyword: range + } + +/// Represents additional information for SynExpr.IfThenElse +[] +type SynExprIfThenElseTrivia = + { + /// The syntax range of the `if` keyword. + IfKeyword: range + /// Indicates if the `elif` keyword was used + IsElif: bool + /// The syntax range of the `then` keyword. + ThenKeyword: range + /// The syntax range of the `else` keyword. + ElseKeyword: range option + /// The syntax range from the beginning of the `if` keyword till the end of the `then` keyword. + IfToThenRange: range + } + +/// Represents additional information for SynExpr.Lambda +[] +type SynExprLambdaTrivia = + { + /// The syntax range of the `->` token. + ArrowRange: range option + } + static member Zero: SynExprLambdaTrivia + +/// Represents additional information for SynMatchClause +[] +type SynMatchClauseTrivia = + { + /// The syntax range of the `->` token. + ArrowRange: range option + /// The syntax range of the `|` token. + BarRange: range option + } + static member Zero: SynMatchClauseTrivia + +/// Represents additional information for +[] +type SynEnumCaseTrivia = + { + /// The syntax range of the `|` token. + BarRange: range option + /// The syntax range of the `=` token. + EqualsRange: range + } + +/// Represents additional information for SynUnionCase +[] +type SynUnionCaseTrivia = + { + /// The syntax range of the `|` token. + BarRange: range option + } diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index c605094b942..29d4161fc2a 100644 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -18,6 +18,7 @@ open FSharp.Compiler.ErrorLogger open FSharp.Compiler.Features open FSharp.Compiler.ParseHelpers open FSharp.Compiler.Syntax +open FSharp.Compiler.SyntaxTrivia open FSharp.Compiler.Syntax.PrettyNaming open FSharp.Compiler.SyntaxTreeOps open FSharp.Compiler.SyntaxTreeOps @@ -2288,7 +2289,7 @@ tyconDefnOrSpfnSimpleRepr: SynTypeDefnSimpleRepr.Enum ($3 |> List.choose (function | Choice1Of2 data -> Some(data) - | Choice2Of2(SynUnionCase(_, _, _, _, _, m)) -> + | Choice2Of2(SynUnionCase(range=m)) -> errorR(Error(FSComp.SR.parsAllEnumFieldsRequireValues(), m)); None), mWhole) ) else @@ -2498,45 +2499,56 @@ unionTypeRepr: | firstUnionCaseDecl { [$1] } -barAndgrabXmlDoc : +barAndgrabXmlDoc: | BAR - { grabXmlDoc(parseState, [], 1) } + { let mBar = rhs parseState 1 + grabXmlDoc(parseState, [], 1), mBar } attrUnionCaseDecls: | attrUnionCaseDecl barAndgrabXmlDoc attrUnionCaseDecls - { (fun xmlDoc -> $1 xmlDoc :: $3 $2) } + { (fun xmlDocAndBar -> $1 xmlDocAndBar :: $3 $2) } | attrUnionCaseDecl - { (fun xmlDoc -> [ $1 xmlDoc ]) } + { (fun xmlDocAndBar -> [ $1 xmlDocAndBar ]) } /* The core of a union case definition */ attrUnionCaseDecl: | opt_attributes opt_access unionCaseName { if Option.isSome $2 then errorR(Error(FSComp.SR.parsUnionCasesCannotHaveVisibilityDeclarations(), rhs parseState 2)) let mDecl = rhs parseState 3 - (fun xmlDoc -> Choice2Of2 (SynUnionCase ( $1, $3, SynUnionCaseKind.Fields [], xmlDoc, None, mDecl))) } + (fun (xmlDoc, mBar) -> + let trivia: SynUnionCaseTrivia = { BarRange = Some mBar } + Choice2Of2 (SynUnionCase ( $1, $3, SynUnionCaseKind.Fields [], xmlDoc, None, mDecl, trivia))) } | opt_attributes opt_access unionCaseName OF unionCaseRepr { if Option.isSome $2 then errorR(Error(FSComp.SR.parsUnionCasesCannotHaveVisibilityDeclarations(), rhs parseState 2)) let mDecl = rhs2 parseState 1 5 - (fun xmlDoc -> Choice2Of2 (SynUnionCase ( $1, $3, SynUnionCaseKind.Fields $5, xmlDoc, None, mDecl))) } + (fun (xmlDoc, mBar) -> + let trivia: SynUnionCaseTrivia = { BarRange = Some mBar } + Choice2Of2 (SynUnionCase ( $1, $3, SynUnionCaseKind.Fields $5, xmlDoc, None, mDecl, trivia))) } | opt_attributes opt_access unionCaseName OF recover { if Option.isSome $2 then errorR(Error(FSComp.SR.parsUnionCasesCannotHaveVisibilityDeclarations(), rhs parseState 2)) let mDecl = rhs2 parseState 1 4 - (fun xmlDoc -> Choice2Of2 (SynUnionCase ( $1, $3, SynUnionCaseKind.Fields [], xmlDoc, None, mDecl))) } + (fun (xmlDoc, mBar) -> + let trivia: SynUnionCaseTrivia = { BarRange = Some mBar } + Choice2Of2 (SynUnionCase ( $1, $3, SynUnionCaseKind.Fields [], xmlDoc, None, mDecl, trivia))) } | opt_attributes opt_access unionCaseName COLON topType { if Option.isSome $2 then errorR(Error(FSComp.SR.parsUnionCasesCannotHaveVisibilityDeclarations(), rhs parseState 2)) if parseState.LexBuffer.ReportLibraryOnlyFeatures then libraryOnlyWarning(lhs parseState) let mDecl = rhs2 parseState 1 5 - (fun xmlDoc -> Choice2Of2 (SynUnionCase ( $1, $3, SynUnionCaseKind.FullType $5, xmlDoc, None, mDecl))) } + (fun (xmlDoc, mBar) -> + let trivia: SynUnionCaseTrivia = { BarRange = Some mBar } + Choice2Of2 (SynUnionCase ( $1, $3, SynUnionCaseKind.FullType $5, xmlDoc, None, mDecl, trivia))) } | opt_attributes opt_access unionCaseName EQUALS constant { if Option.isSome $2 then errorR(Error(FSComp.SR.parsEnumFieldsCannotHaveVisibilityDeclarations(), rhs parseState 2)) let mEquals = rhs parseState 4 let mDecl = rhs2 parseState 1 5 - (fun xmlDoc -> Choice1Of2 (SynEnumCase ( $1, $3, mEquals, fst $5, snd $5, xmlDoc, mDecl))) } + (fun (xmlDoc, mBar) -> + let trivia: SynEnumCaseTrivia = { BarRange = Some mBar; EqualsRange = mEquals } + Choice1Of2 (SynEnumCase ( $1, $3, fst $5, snd $5, xmlDoc, mDecl, trivia))) } /* The name of a union case */ unionCaseName: @@ -2551,22 +2563,26 @@ unionCaseName: firstUnionCaseDeclOfMany: | ident opt_OBLOCKSEP - { Choice2Of2 (SynUnionCase ( [], $1, SynUnionCaseKind.Fields [], grabXmlDoc(parseState, [], 1), None, rhs parseState 1)) } + { let trivia: SynUnionCaseTrivia = { BarRange = None } + Choice2Of2 (SynUnionCase ( [], $1, SynUnionCaseKind.Fields [], grabXmlDoc(parseState, [], 1), None, rhs parseState 1, trivia)) } | ident EQUALS constant opt_OBLOCKSEP { let mEquals = rhs parseState 2 - Choice1Of2 (SynEnumCase ([], $1, mEquals, fst $3, snd $3, grabXmlDoc(parseState, [], 1), rhs2 parseState 1 3)) } + let trivia: SynEnumCaseTrivia = { BarRange = None; EqualsRange = mEquals } + Choice1Of2 (SynEnumCase ([], $1, fst $3, snd $3, grabXmlDoc(parseState, [], 1), rhs2 parseState 1 3, trivia)) } | firstUnionCaseDecl opt_OBLOCKSEP { $1 } firstUnionCaseDecl: | ident OF unionCaseRepr - { Choice2Of2 (SynUnionCase ( [], $1, SynUnionCaseKind.Fields $3, grabXmlDoc(parseState, [], 1), None, rhs2 parseState 1 3)) } + { let trivia: SynUnionCaseTrivia = { BarRange = None } + Choice2Of2 (SynUnionCase ( [], $1, SynUnionCaseKind.Fields $3, grabXmlDoc(parseState, [], 1), None, rhs2 parseState 1 3, trivia)) } | ident EQUALS constant opt_OBLOCKSEP { let mEquals = rhs parseState 2 - Choice1Of2 (SynEnumCase ([], $1, mEquals, fst $3, snd $3, grabXmlDoc(parseState, [], 1), rhs2 parseState 1 3)) } + let trivia: SynEnumCaseTrivia = { BarRange = None; EqualsRange = mEquals } + Choice1Of2 (SynEnumCase ([], $1, fst $3, snd $3, grabXmlDoc(parseState, [], 1), rhs2 parseState 1 3, trivia)) } unionCaseReprElements: | unionCaseReprElement STAR unionCaseReprElements @@ -2631,13 +2647,13 @@ exconCore: /* Part of an exception definition */ exconIntro: | ident - { SynUnionCase([], $1, SynUnionCaseKind.Fields [], PreXmlDoc.Empty, None, lhs parseState) } + { SynUnionCase([], $1, SynUnionCaseKind.Fields [], PreXmlDoc.Empty, None, lhs parseState, { BarRange = None }) } | ident OF unionCaseRepr - { SynUnionCase([], $1, SynUnionCaseKind.Fields $3, PreXmlDoc.Empty, None, lhs parseState) } + { SynUnionCase([], $1, SynUnionCaseKind.Fields $3, PreXmlDoc.Empty, None, lhs parseState, { BarRange = None }) } | ident OF recover - { SynUnionCase([], $1, SynUnionCaseKind.Fields [], PreXmlDoc.Empty, None, lhs parseState) } + { SynUnionCase([], $1, SynUnionCaseKind.Fields [], PreXmlDoc.Empty, None, lhs parseState, { BarRange = None }) } exconRepr: | /* EMPTY */ @@ -3576,7 +3592,12 @@ declExpr: let mTryToWith = unionRanges mTry mWith let mWithToLast = unionRanges mWith mLast let mTryToLast = unionRanges mTry mLast - SynExpr.TryWith (mTry, $2, mTryToWith, mWith, clauses, mWithToLast, mTryToLast, spTry, spWith) } + let trivia: SynExprTryWithTrivia = + { TryKeyword = mTry + TryToWithRange = mTryToWith + WithKeyword = mWith + WithToEndRange = mWithToLast } + SynExpr.TryWith ($2, clauses, mTryToLast, spTry, spWith, trivia) } | TRY typedSequentialExprBlockR recover %prec expr_try { // Produce approximate expression during error recovery @@ -3587,9 +3608,11 @@ declExpr: | TRY typedSequentialExprBlockR FINALLY typedSequentialExprBlock %prec expr_try { let mTry = rhs parseState 1 let spTry = DebugPointAtTry.Yes mTry - let spFinally = DebugPointAtFinally.Yes (rhs parseState 3) + let mFinally = rhs parseState 3 + let spFinally = DebugPointAtFinally.Yes mFinally let mTryToLast = unionRanges mTry $4.Range - SynExpr.TryFinally ($2, $4, mTryToLast, spTry, spFinally) } + let trivia = { TryKeyword = mTry; FinallyKeyword = mFinally } + SynExpr.TryFinally ($2, $4, mTryToLast, spTry, spFinally, trivia) } | IF declExpr ifExprCases %prec expr_if { let mIf = rhs parseState 1 @@ -3610,7 +3633,8 @@ declExpr: let m = rhs parseState 1 let mEnd = m.EndRange let spIfToThen = DebugPointAtBinding.Yes mEnd - exprFromParseError (SynExpr.IfThenElse (m, false, arbExpr("ifGuard1", mEnd), m, arbExpr("thenBody1", mEnd), None, None, spIfToThen, true, m, m)) } + let trivia = { IfKeyword = m; IsElif = false; ThenKeyword = m; ElseKeyword = None; IfToThenRange = m } + exprFromParseError (SynExpr.IfThenElse (arbExpr("ifGuard1", mEnd), arbExpr("thenBody1", mEnd), None, spIfToThen, true, m, trivia)) } | LAZY declExpr %prec expr_lazy { SynExpr.Lazy ($2, unionRanges (rhs parseState 1) $2.Range) } @@ -4051,10 +4075,11 @@ withClauses: withPatternClauses: | patternClauses - { $1 } + { $1 None } | BAR patternClauses - { $2 } + { let mBar = rhs parseState 1 |> Some + $2 mBar } | BAR error { // silent recovery @@ -4077,40 +4102,48 @@ patternClauses: let mArrow, resultExpr = $2 let mLast = resultExpr.Range let m = unionRanges resultExpr.Range pat.Range - [SynMatchClause(pat, guard, (Some mArrow), resultExpr, m, DebugPointAtTarget.Yes)], mLast } + fun mBar -> + [SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, { ArrowRange = Some mArrow; BarRange = mBar })], mLast } | patternAndGuard patternResult BAR patternClauses { let pat, guard = $1 let mArrow, resultExpr = $2 - let clauses, mLast = $4 + let mNextBar = rhs parseState 3 |> Some + let clauses, mLast = $4 mNextBar let m = unionRanges resultExpr.Range pat.Range - (SynMatchClause(pat, guard, (Some mArrow), resultExpr, m, DebugPointAtTarget.Yes) :: clauses), mLast } + fun mBar -> + (SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, { ArrowRange = Some mArrow; BarRange = mBar }) :: clauses), mLast } | patternAndGuard error BAR patternClauses { let pat, guard = $1 - let clauses, mLast = $4 + let mNextBar = rhs parseState 3 |> Some + let clauses, mLast = $4 mNextBar let patm = pat.Range let m = guard |> Option.map (fun e -> unionRanges patm e.Range) |> Option.defaultValue patm - (SynMatchClause(pat, guard, None, arbExpr ("patternClauses1", m.EndRange), m, DebugPointAtTarget.Yes) :: clauses), mLast } + fun _mBar -> + (SynMatchClause(pat, guard, arbExpr ("patternClauses1", m.EndRange), m, DebugPointAtTarget.Yes, SynMatchClauseTrivia.Zero) :: clauses), mLast } | patternAndGuard patternResult BAR error { let pat, guard = $1 let mArrow, resultExpr = $2 let mLast = rhs parseState 3 let m = unionRanges resultExpr.Range pat.Range - [SynMatchClause(pat, guard, (Some mArrow), resultExpr, m, DebugPointAtTarget.Yes)], mLast } + fun mBar -> + [SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, { ArrowRange = Some mArrow; BarRange = mBar })], mLast } | patternAndGuard patternResult error { let pat, guard = $1 let mArrow, resultExpr = $2 let m = unionRanges resultExpr.Range pat.Range - [SynMatchClause(pat, guard, (Some mArrow), resultExpr, m, DebugPointAtTarget.Yes)], m } + fun mBar -> + [SynMatchClause(pat, guard, resultExpr, m, DebugPointAtTarget.Yes, { ArrowRange = Some mArrow; BarRange = mBar })], m } | patternAndGuard error { let pat, guard = $1 let patm = pat.Range let m = guard |> Option.map (fun e -> unionRanges patm e.Range) |> Option.defaultValue patm - [SynMatchClause(pat, guard, None, arbExpr ("patternClauses2", m.EndRange), m, DebugPointAtTarget.Yes)], m } + fun mBar -> + [SynMatchClause(pat, guard, arbExpr ("patternClauses2", m.EndRange), m, DebugPointAtTarget.Yes, { ArrowRange = None; BarRange = mBar })], m } patternGuard: | WHEN declExpr @@ -4133,7 +4166,8 @@ ifExprCases: let lastBranch : SynExpr = match elseExpr with None -> exprThen | Some e -> e let mIfToEndOfLastBranch = unionRanges mIf lastBranch.Range let spIfToThen = DebugPointAtBinding.Yes(mIfToThen) - SynExpr.IfThenElse (mIf, isElif, exprGuard, mThen, exprThen, mElse, elseExpr, spIfToThen, false, mIfToThen, mIfToEndOfLastBranch)) } + let trivia = { IfKeyword = mIf; IsElif = isElif; ThenKeyword = mThen; ElseKeyword = mElse; IfToThenRange = mIfToThen } + SynExpr.IfThenElse (exprGuard, exprThen, elseExpr, spIfToThen, false, mIfToEndOfLastBranch, trivia)) } ifExprThen: | THEN declExpr %prec prec_then_if diff --git a/src/fsharp/service/FSharpParseFileResults.fs b/src/fsharp/service/FSharpParseFileResults.fs index 03a08836d04..92519ce8a81 100644 --- a/src/fsharp/service/FSharpParseFileResults.fs +++ b/src/fsharp/service/FSharpParseFileResults.fs @@ -215,7 +215,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, | None -> getIdentRangeForFuncExprInApp traverseSynExpr body pos - | SynExpr.IfThenElse (_, _, ifExpr, _, thenExpr, _, elseExpr, _, _, _, range) when rangeContainsPos range pos -> + | SynExpr.IfThenElse (ifExpr=ifExpr; thenExpr=thenExpr; elseExpr=elseExpr; range=range) when rangeContainsPos range pos -> if rangeContainsPos ifExpr.Range pos then getIdentRangeForFuncExprInApp traverseSynExpr ifExpr pos elif rangeContainsPos thenExpr.Range pos then @@ -235,7 +235,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, | None -> None | Some clause -> match clause with - | SynMatchClause.SynMatchClause (_, whenExprOpt, _, resultExpr, _, _) -> + | SynMatchClause.SynMatchClause (whenExpr=whenExprOpt; resultExpr=resultExpr) -> match whenExprOpt with | None -> getIdentRangeForFuncExprInApp traverseSynExpr resultExpr pos @@ -255,7 +255,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, getIdentRangeForFuncExprInApp traverseSynExpr expr pos // Capture the body of a lambda, often nested in a call to a collection function - | SynExpr.Lambda(_, _, _args, _, body, _, _) when rangeContainsPos body.Range pos -> + | SynExpr.Lambda(body=body) when rangeContainsPos body.Range pos -> getIdentRangeForFuncExprInApp traverseSynExpr body pos | SynExpr.Do(expr, range) when rangeContainsPos range pos -> @@ -458,7 +458,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, and walkBinds es = List.collect walkBind es and walkMatchClauses cl = - [ for SynMatchClause(_, whenExprOpt, _, tgtExpr, _, _) in cl do + [ for SynMatchClause(whenExpr=whenExprOpt; resultExpr=tgtExpr) in cl do match whenExprOpt with | Some whenExpr -> yield! walkExpr false whenExpr | _ -> () @@ -617,7 +617,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, | SynExpr.MatchLambda (_isExnMatch, _argm, cl, spBind, _wholem) -> yield! walkBindSeqPt spBind - for SynMatchClause(_, whenExpr, _, e, _, _) in cl do + for SynMatchClause(whenExpr=whenExpr; resultExpr=e) in cl do yield! walkExprOpt true whenExpr yield! walkExpr true e @@ -627,7 +627,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, | SynExpr.Match (matchDebugPoint=spBind; expr=inpExpr; clauses=cl) -> yield! walkBindSeqPt spBind yield! walkExpr false inpExpr - for SynMatchClause(_, whenExpr, _, tgtExpr, _, _) in cl do + for SynMatchClause(whenExpr=whenExpr; resultExpr=tgtExpr) in cl do yield! walkExprOpt true whenExpr yield! walkExpr true tgtExpr @@ -641,7 +641,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, yield! walkExpr true tryExpr yield! walkMatchClauses cl - | SynExpr.TryFinally (e1, e2, _, spTry, spFinally) -> + | SynExpr.TryFinally (tryExpr=e1; finallyExpr=e2; tryDebugPoint=spTry; finallyDebugPoint=spFinally) -> yield! walkExpr true e1 yield! walkExpr true e2 yield! walkTrySeqPt spTry @@ -652,7 +652,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, yield! walkExpr (match spSeq with DebugPointAtSequential.SuppressExpr | DebugPointAtSequential.SuppressBoth -> false | _ -> true) e1 yield! walkExpr (match spSeq with DebugPointAtSequential.SuppressStmt | DebugPointAtSequential.SuppressBoth -> false | _ -> true) e2 - | SynExpr.IfThenElse (_, _, e1, _, e2, _, e3opt, spBind, _, _, _) -> + | SynExpr.IfThenElse (ifExpr=e1; thenExpr=e2; elseExpr=e3opt; spIfToThen=spBind) -> yield! walkBindSeqPt spBind yield! walkExpr false e1 yield! walkExpr true e2 @@ -690,7 +690,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput, | SynExpr.MatchBang (matchDebugPoint=spBind; expr=e; clauses=cl) -> yield! walkBindSeqPt spBind yield! walkExpr false e - for SynMatchClause(_, whenExpr, _, e, _, _) in cl do + for SynMatchClause(whenExpr=whenExpr; resultExpr=e) in cl do yield! walkExprOpt true whenExpr yield! walkExpr true e ] diff --git a/src/fsharp/service/ServiceInterfaceStubGenerator.fs b/src/fsharp/service/ServiceInterfaceStubGenerator.fs index ddb8f35c791..773666c555d 100644 --- a/src/fsharp/service/ServiceInterfaceStubGenerator.fs +++ b/src/fsharp/service/ServiceInterfaceStubGenerator.fs @@ -802,7 +802,7 @@ module InterfaceStubGenerator = walkExpr synExpr | SynExpr.ComputationExpr (_, synExpr, _range) -> walkExpr synExpr - | SynExpr.Lambda (_, _, _synSimplePats, _, synExpr, _, _range) -> + | SynExpr.Lambda (body=synExpr) -> walkExpr synExpr | SynExpr.MatchLambda (_isExnMatch, _argm, synMatchClauseList, _spBind, _wholem) -> @@ -830,13 +830,13 @@ module InterfaceStubGenerator = | SynExpr.TryWith (tryExpr=synExpr) -> walkExpr synExpr - | SynExpr.TryFinally (synExpr1, synExpr2, _range, _sequencePointInfoForTry, _sequencePointInfoForFinally) -> + | SynExpr.TryFinally (tryExpr=synExpr1; finallyExpr=synExpr2) -> List.tryPick walkExpr [synExpr1; synExpr2] | Sequentials exprs -> List.tryPick walkExpr exprs - | SynExpr.IfThenElse (_, _, synExpr1, _, synExpr2, _, synExprOpt, _sequencePointInfoForBinding, _isRecovery, _range, _range2) -> + | SynExpr.IfThenElse (ifExpr=synExpr1; thenExpr=synExpr2; elseExpr=synExprOpt) -> match synExprOpt with | Some synExpr3 -> List.tryPick walkExpr [synExpr1; synExpr2; synExpr3] diff --git a/src/fsharp/service/ServiceNavigation.fs b/src/fsharp/service/ServiceNavigation.fs index b95433f6e27..1446b607ad8 100755 --- a/src/fsharp/service/ServiceNavigation.fs +++ b/src/fsharp/service/ServiceNavigation.fs @@ -166,7 +166,7 @@ module NavigationImpl = | _ -> [] // Process a class declaration or F# type declaration - let rec processExnDefnRepr baseName nested (SynExceptionDefnRepr(_, SynUnionCase(_, id, fldspec, _, _, _), _, _, access, m)) = + let rec processExnDefnRepr baseName nested (SynExceptionDefnRepr(_, SynUnionCase(ident=id; caseType=fldspec), _, _, access, m)) = // Exception declaration [ createDecl(baseName, id, NavigationItemKind.Exception, FSharpGlyph.Exception, m, fldspecRange fldspec, nested, NavigationEntityKind.Exception, false, access) ] @@ -189,7 +189,7 @@ module NavigationImpl = match simple with | SynTypeDefnSimpleRepr.Union(_, cases, mb) -> let cases = - [ for SynUnionCase(_, id, fldspec, _, _, _) in cases -> + [ for SynUnionCase(ident=id; caseType=fldspec) in cases -> createMember(id, NavigationItemKind.Other, FSharpGlyph.Struct, unionRanges (fldspecRange fldspec) id.idRange, NavigationEntityKind.Union, false, access) ] let nested = cases@topMembers [ createDeclLid(baseName, lid, NavigationItemKind.Type, FSharpGlyph.Union, m, bodyRange mb nested, nested, NavigationEntityKind.Union, false, access) ] @@ -339,7 +339,7 @@ module NavigationImpl = let createMember(id:Ident, kind, baseGlyph, m, enclosingEntityKind, isAbstract, access) = NavigationItem.Create(id.idText, kind, baseGlyph, m, m, false, enclosingEntityKind, isAbstract, access), (addItemName(id.idText)) - let rec processExnRepr baseName nested (SynExceptionDefnRepr(_, SynUnionCase(_, id, fldspec, _, _, _), _, _, access, m)) = + let rec processExnRepr baseName nested (SynExceptionDefnRepr(_, SynUnionCase(ident=id; caseType=fldspec), _, _, access, m)) = // Exception declaration [ createDecl(baseName, id, NavigationItemKind.Exception, FSharpGlyph.Exception, m, fldspecRange fldspec, nested, NavigationEntityKind.Exception, false, access) ] @@ -361,7 +361,7 @@ module NavigationImpl = match simple with | SynTypeDefnSimpleRepr.Union(_, cases, mb) -> let cases = - [ for SynUnionCase(_, id, fldspec, _, _, _) in cases -> + [ for SynUnionCase(ident=id; caseType=fldspec) in cases -> createMember(id, NavigationItemKind.Other, FSharpGlyph.Struct, unionRanges (fldspecRange fldspec) id.idRange, NavigationEntityKind.Union, false, access) ] let nested = cases@topMembers [ createDeclLid(baseName, lid, NavigationItemKind.Type, FSharpGlyph.Union, m, bodyRange mb nested, nested, NavigationEntityKind.Union, false, access) ] @@ -530,7 +530,7 @@ module NavigateTo = let addModuleAbbreviation (id: Ident) isSig container = addIdent NavigableItemKind.ModuleAbbreviation id isSig container - let addExceptionRepr (SynExceptionDefnRepr(_, SynUnionCase(_, id, _, _, _, _), _, _, _, _)) isSig container = + let addExceptionRepr (SynExceptionDefnRepr(_, SynUnionCase(ident=id), _, _, _, _)) isSig container = addIdent NavigableItemKind.Exception id isSig container { Type = NavigableContainerType.Exception; Name = id.idText } @@ -551,7 +551,7 @@ module NavigateTo = let addEnumCase(SynEnumCase(ident=id)) isSig = addIdent NavigableItemKind.EnumCase id isSig - let addUnionCase(SynUnionCase(_, id, _, _, _, _)) isSig container = + let addUnionCase(SynUnionCase(ident=id)) isSig container = addIdent NavigableItemKind.UnionCase id isSig container let mapMemberKind mk = diff --git a/src/fsharp/service/ServiceParseTreeWalk.fs b/src/fsharp/service/ServiceParseTreeWalk.fs index 4058855f654..f1ff997d3c1 100755 --- a/src/fsharp/service/ServiceParseTreeWalk.fs +++ b/src/fsharp/service/ServiceParseTreeWalk.fs @@ -443,7 +443,7 @@ module SyntaxTraversal = else traverseSynExpr synExpr - | SynExpr.Lambda (_, _, synSimplePats, _, synExpr, _, _range) -> + | SynExpr.Lambda (args=synSimplePats; body=synExpr) -> match synSimplePats with | SynSimplePats.SimplePats(pats,_) -> match visitor.VisitSimplePats(path, pats) with @@ -492,7 +492,7 @@ module SyntaxTraversal = yield! synMatchClauseList |> List.map (fun x -> dive x x.Range (traverseSynMatchClause path))] |> pick expr - | SynExpr.TryFinally (synExpr, synExpr2, _range, _sequencePointInfoForTry, _sequencePointInfoForFinally) -> + | SynExpr.TryFinally (tryExpr=synExpr; finallyExpr=synExpr2) -> [dive synExpr synExpr.Range traverseSynExpr dive synExpr2 synExpr2.Range traverseSynExpr] |> pick expr @@ -506,7 +506,7 @@ module SyntaxTraversal = dive synExpr2 synExpr2.Range traverseSynExpr] |> pick expr - | SynExpr.IfThenElse (_, _, synExpr, _, synExpr2, _, synExprOpt, _sequencePointInfoForBinding, _isRecovery, _range, _range2) -> + | SynExpr.IfThenElse (ifExpr=synExpr; thenExpr=synExpr2; elseExpr=synExprOpt) -> [yield dive synExpr synExpr.Range traverseSynExpr yield dive synExpr2 synExpr2.Range traverseSynExpr match synExprOpt with @@ -781,7 +781,7 @@ module SyntaxTraversal = let defaultTraverse mc = let path = SyntaxNode.SynMatchClause mc :: origPath match mc with - | SynMatchClause(synPat, synExprOption, _, synExpr, _range, _sequencePointInfoForTarget) as all -> + | SynMatchClause(pat=synPat; whenExpr=synExprOption; resultExpr=synExpr) as all -> [dive synPat synPat.Range (traversePat path) ] @ ([ diff --git a/src/fsharp/service/ServiceParsedInputOps.fs b/src/fsharp/service/ServiceParsedInputOps.fs index f91b01418f6..2bf3aab596d 100644 --- a/src/fsharp/service/ServiceParsedInputOps.fs +++ b/src/fsharp/service/ServiceParsedInputOps.fs @@ -542,7 +542,7 @@ module ParsedInput = | SynType.Paren(t, _) -> walkType t | _ -> None - and walkClause (SynMatchClause(pat, e1, _, e2, _, _)) = + and walkClause (SynMatchClause(pat=pat; whenExpr=e1; resultExpr=e2)) = walkPatWithKind (Some EntityKind.Type) pat |> Option.orElseWith (fun () -> walkExpr e2) |> Option.orElseWith (fun () -> Option.bind walkExpr e1) @@ -588,10 +588,10 @@ module ParsedInput = walkExprWithKind (Some EntityKind.Type) e |> Option.orElseWith (fun () -> List.tryPick walkType tys) | SynExpr.LetOrUse (_, _, bindings, e, _) -> List.tryPick walkBinding bindings |> Option.orElseWith (fun () -> walkExprWithKind parentKind e) | SynExpr.TryWith (tryExpr=e; withCases=clauses) -> walkExprWithKind parentKind e |> Option.orElseWith (fun () -> List.tryPick walkClause clauses) - | SynExpr.TryFinally (e1, e2, _, _, _) -> List.tryPick (walkExprWithKind parentKind) [e1; e2] + | SynExpr.TryFinally (tryExpr=e1; finallyExpr=e2) -> List.tryPick (walkExprWithKind parentKind) [e1; e2] | SynExpr.Lazy (e, _) -> walkExprWithKind parentKind e | Sequentials es -> List.tryPick (walkExprWithKind parentKind) es - | SynExpr.IfThenElse (_, _, e1, _, e2, _, e3, _, _, _, _) -> + | SynExpr.IfThenElse (ifExpr=e1; thenExpr=e2; elseExpr=e3) -> List.tryPick (walkExprWithKind parentKind) [e1; e2] |> Option.orElseWith (fun () -> match e3 with None -> None | Some e -> walkExprWithKind parentKind e) | SynExpr.Ident ident -> ifPosInRange ident.idRange (fun _ -> Some (EntityKind.FunctionOrValue false)) | SynExpr.LongIdentSet (_, e, _) -> walkExprWithKind parentKind e @@ -677,7 +677,7 @@ module ParsedInput = | SynUnionCaseKind.Fields fields -> List.tryPick walkField fields | SynUnionCaseKind.FullType(t, _) -> walkType t - and walkUnionCase (SynUnionCase(Attributes attrs, _, t, _, _, _)) = + and walkUnionCase (SynUnionCase(attributes=Attributes attrs; caseType=t)) = List.tryPick walkAttribute attrs |> Option.orElseWith (fun () -> walkUnionCaseType t) and walkTypeDefnSimple = function @@ -1293,7 +1293,7 @@ module ParsedInput = walkType t; List.iter walkTypeConstraint typeConstraints | _ -> () - and walkClause (SynMatchClause (pat, e1, _, e2, _, _)) = + and walkClause (SynMatchClause (pat=pat; whenExpr=e1; resultExpr=e2)) = walkPat pat walkExpr e2 e1 |> Option.iter walkExpr @@ -1319,7 +1319,7 @@ module ParsedInput = | SynExpr.Assert (e, _) | SynExpr.Lazy (e, _) | SynExpr.YieldOrReturnFrom (_, e, _) -> walkExpr e - | SynExpr.Lambda (_, _, pats, _, e, _, _) -> + | SynExpr.Lambda (args=pats; body=e) -> walkSimplePats pats walkExpr e | SynExpr.New (_, t, e, _) @@ -1330,7 +1330,7 @@ module ParsedInput = | Sequentials es | SynExpr.ArrayOrList (_, es, _) -> List.iter walkExpr es | SynExpr.App (_, _, e1, e2, _) - | SynExpr.TryFinally (e1, e2, _, _, _) + | SynExpr.TryFinally (tryExpr=e1; finallyExpr=e2) | SynExpr.While (_, e1, e2, _) -> List.iter walkExpr [e1; e2] | SynExpr.Record (_, _, fields, _) -> fields |> List.iter (fun (SynExprRecordField(fieldName=(ident, _); expr=e)) -> @@ -1362,7 +1362,7 @@ module ParsedInput = List.iter walkBinding bindings; walkExpr e | SynExpr.TryWith (tryExpr=e; withCases=clauses) -> List.iter walkClause clauses; walkExpr e - | SynExpr.IfThenElse (_, _, e1, _, e2, _, e3, _, _, _, _) -> + | SynExpr.IfThenElse (ifExpr=e1; thenExpr=e2; elseExpr=e3) -> List.iter walkExpr [e1; e2] e3 |> Option.iter walkExpr | SynExpr.LongIdentSet (ident, e, _) @@ -1482,7 +1482,7 @@ module ParsedInput = | SynUnionCaseKind.Fields fields -> List.iter walkField fields | SynUnionCaseKind.FullType (t, _) -> walkType t - and walkUnionCase (SynUnionCase(Attributes attrs, _, t, _, _, _)) = + and walkUnionCase (SynUnionCase(attributes=Attributes attrs; caseType=t)) = List.iter walkAttribute attrs walkUnionCaseType t diff --git a/src/fsharp/service/ServiceStructure.fs b/src/fsharp/service/ServiceStructure.fs index 01e423d2a9c..e8b006ae2a1 100644 --- a/src/fsharp/service/ServiceStructure.fs +++ b/src/fsharp/service/ServiceStructure.fs @@ -319,7 +319,7 @@ module Structure = rcheck Scope.ObjExpr Collapse.Below wholeRange collapse parseBindings bindings parseExprInterfaces extraImpls - | SynExpr.TryWith (tryExpr=e; withCases=matchClauses; range=wholeRange; tryDebugPoint=tryPoint; withDebugPoint=withPoint) -> + | SynExpr.TryWith (e, matchClauses, wholeRange, tryPoint, withPoint, _trivia) -> match tryPoint, withPoint with | DebugPointAtTry.Yes tryRange, DebugPointAtWith.Yes withRange -> let fullrange = Range.startToEnd tryRange wholeRange @@ -334,7 +334,7 @@ module Structure = | _ -> () parseExpr e List.iter parseMatchClause matchClauses - | SynExpr.TryFinally (tryExpr, finallyExpr, r, tryPoint, finallyPoint) -> + | SynExpr.TryFinally (tryExpr, finallyExpr, r, tryPoint, finallyPoint, _trivia) -> match tryPoint, finallyPoint with | DebugPointAtTry.Yes tryRange, DebugPointAtFinally.Yes finallyRange -> let collapse = Range.endToEnd tryRange finallyExpr.Range @@ -346,7 +346,7 @@ module Structure = | _ -> () parseExpr tryExpr parseExpr finallyExpr - | SynExpr.IfThenElse (_, _, ifExpr, _, thenExpr, _, elseExprOpt, spIfToThen, _, ifToThenRange, r) -> + | SynExpr.IfThenElse (ifExpr=ifExpr; thenExpr=thenExpr; elseExpr=elseExprOpt; spIfToThen=spIfToThen; range=r; trivia=trivia) -> match spIfToThen with | DebugPointAtBinding.Yes rt -> // Outline the entire IfThenElse @@ -354,8 +354,8 @@ module Structure = let collapse = Range.endToEnd ifExpr.Range r rcheck Scope.IfThenElse Collapse.Below fullrange collapse // Outline the `then` scope - let thenRange = Range.endToEnd (Range.modEnd -4 ifToThenRange) thenExpr.Range - let thenCollapse = Range.endToEnd ifToThenRange thenExpr.Range + let thenRange = Range.endToEnd (Range.modEnd -4 trivia.IfToThenRange) thenExpr.Range + let thenCollapse = Range.endToEnd trivia.IfToThenRange thenExpr.Range rcheck Scope.ThenInIfThenElse Collapse.Below thenRange thenCollapse | _ -> () parseExpr ifExpr @@ -375,7 +375,7 @@ module Structure = | SynExpr.While (_, _, e, r) -> rcheck Scope.While Collapse.Below r r parseExpr e - | SynExpr.Lambda (_, _, pats, _, e, _, r) -> + | SynExpr.Lambda (args=pats; body=e; range=r) -> match pats with | SynSimplePats.SimplePats (_, pr) | SynSimplePats.Typed (_, _, pr) -> @@ -405,7 +405,7 @@ module Structure = rcheck Scope.Record Collapse.Same r <| Range.modBoth 1 1 r | _ -> () - and parseMatchClause (SynMatchClause(synPat, _, _, e, _r, _) as clause) = + and parseMatchClause (SynMatchClause(pat=synPat; resultExpr=e) as clause) = let rec getLastPat = function | SynPat.Or(_, pat, _) -> getLastPat pat | x -> x @@ -528,7 +528,7 @@ module Structure = parseAttributes attrs | SynTypeDefnSimpleRepr.Union (_, cases, ur) -> rcheck Scope.UnionDefn Collapse.Same ur ur - for SynUnionCase (attrs, _, _, _, _, cr) in cases do + for SynUnionCase (attributes=attrs; range=cr) in cases do rcheck Scope.UnionCase Collapse.Below cr cr parseAttributes attrs | _ -> () diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected index cbdccd61379..d5c07975e75 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -6118,11 +6118,11 @@ FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.Ident get_ident() FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.Ident ident FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.SynConst get_value() FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.SynConst value -FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.SynEnumCase NewSynEnumCase(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.Ident, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.SynConst, FSharp.Compiler.Text.Range, FSharp.Compiler.Xml.PreXmlDoc, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Syntax.SynEnumCase NewSynEnumCase(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.Ident, FSharp.Compiler.Syntax.SynConst, FSharp.Compiler.Text.Range, FSharp.Compiler.Xml.PreXmlDoc, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia) +FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia get_trivia() +FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia trivia FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Text.Range Range -FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Text.Range equalsRange FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Text.Range get_Range() -FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Text.Range get_equalsRange() FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Text.Range get_valueRange() FSharp.Compiler.Syntax.SynEnumCase: FSharp.Compiler.Text.Range range @@ -6342,9 +6342,7 @@ FSharp.Compiler.Syntax.SynExpr+FromParseError: FSharp.Compiler.Text.Range get_ra FSharp.Compiler.Syntax.SynExpr+FromParseError: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynExpr+Ident: FSharp.Compiler.Syntax.Ident get_ident() FSharp.Compiler.Syntax.SynExpr+Ident: FSharp.Compiler.Syntax.Ident ident -FSharp.Compiler.Syntax.SynExpr+IfThenElse: Boolean get_isElif() FSharp.Compiler.Syntax.SynExpr+IfThenElse: Boolean get_isFromErrorRecovery() -FSharp.Compiler.Syntax.SynExpr+IfThenElse: Boolean isElif FSharp.Compiler.Syntax.SynExpr+IfThenElse: Boolean isFromErrorRecovery FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Syntax.DebugPointAtBinding get_spIfToThen() FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Syntax.DebugPointAtBinding spIfToThen @@ -6352,18 +6350,12 @@ FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Syntax.SynExpr get_if FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Syntax.SynExpr get_thenExpr() FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Syntax.SynExpr ifExpr FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Syntax.SynExpr thenExpr -FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Text.Range get_ifKeyword() -FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Text.Range get_ifToThenRange() +FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia get_trivia() +FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia trivia FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Text.Range get_range() -FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Text.Range get_thenKeyword() -FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Text.Range ifKeyword -FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Text.Range ifToThenRange FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Text.Range range -FSharp.Compiler.Syntax.SynExpr+IfThenElse: FSharp.Compiler.Text.Range thenKeyword FSharp.Compiler.Syntax.SynExpr+IfThenElse: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr] elseExpr FSharp.Compiler.Syntax.SynExpr+IfThenElse: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr] get_elseExpr() -FSharp.Compiler.Syntax.SynExpr+IfThenElse: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] elseKeyword -FSharp.Compiler.Syntax.SynExpr+IfThenElse: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_elseKeyword() FSharp.Compiler.Syntax.SynExpr+ImplicitZero: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynExpr+ImplicitZero: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynExpr+IndexFromEnd: FSharp.Compiler.Syntax.SynExpr expr @@ -6412,10 +6404,10 @@ FSharp.Compiler.Syntax.SynExpr+Lambda: FSharp.Compiler.Syntax.SynExpr body FSharp.Compiler.Syntax.SynExpr+Lambda: FSharp.Compiler.Syntax.SynExpr get_body() FSharp.Compiler.Syntax.SynExpr+Lambda: FSharp.Compiler.Syntax.SynSimplePats args FSharp.Compiler.Syntax.SynExpr+Lambda: FSharp.Compiler.Syntax.SynSimplePats get_args() +FSharp.Compiler.Syntax.SynExpr+Lambda: FSharp.Compiler.SyntaxTrivia.SynExprLambdaTrivia get_trivia() +FSharp.Compiler.Syntax.SynExpr+Lambda: FSharp.Compiler.SyntaxTrivia.SynExprLambdaTrivia trivia FSharp.Compiler.Syntax.SynExpr+Lambda: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynExpr+Lambda: FSharp.Compiler.Text.Range range -FSharp.Compiler.Syntax.SynExpr+Lambda: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] arrow -FSharp.Compiler.Syntax.SynExpr+Lambda: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_arrow() FSharp.Compiler.Syntax.SynExpr+Lambda: Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynPat],FSharp.Compiler.Syntax.SynExpr]] get_parsedData() FSharp.Compiler.Syntax.SynExpr+Lambda: Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynPat],FSharp.Compiler.Syntax.SynExpr]] parsedData FSharp.Compiler.Syntax.SynExpr+Lazy: FSharp.Compiler.Syntax.SynExpr expr @@ -6699,6 +6691,8 @@ FSharp.Compiler.Syntax.SynExpr+TryFinally: FSharp.Compiler.Syntax.SynExpr finall FSharp.Compiler.Syntax.SynExpr+TryFinally: FSharp.Compiler.Syntax.SynExpr get_finallyExpr() FSharp.Compiler.Syntax.SynExpr+TryFinally: FSharp.Compiler.Syntax.SynExpr get_tryExpr() FSharp.Compiler.Syntax.SynExpr+TryFinally: FSharp.Compiler.Syntax.SynExpr tryExpr +FSharp.Compiler.Syntax.SynExpr+TryFinally: FSharp.Compiler.SyntaxTrivia.SynExprTryFinallyTrivia get_trivia() +FSharp.Compiler.Syntax.SynExpr+TryFinally: FSharp.Compiler.SyntaxTrivia.SynExprTryFinallyTrivia trivia FSharp.Compiler.Syntax.SynExpr+TryFinally: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynExpr+TryFinally: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Syntax.DebugPointAtTry get_tryDebugPoint() @@ -6707,16 +6701,10 @@ FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Syntax.DebugPointAtWith FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Syntax.DebugPointAtWith withDebugPoint FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Syntax.SynExpr get_tryExpr() FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Syntax.SynExpr tryExpr +FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia get_trivia() +FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia trivia FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Text.Range get_range() -FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Text.Range get_tryKeywordRange() -FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Text.Range get_tryRange() -FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Text.Range get_withKeywordRange() -FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Text.Range get_withRange() FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Text.Range range -FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Text.Range tryKeywordRange -FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Text.Range tryRange -FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Text.Range withKeywordRange -FSharp.Compiler.Syntax.SynExpr+TryWith: FSharp.Compiler.Text.Range withRange FSharp.Compiler.Syntax.SynExpr+TryWith: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMatchClause] get_withCases() FSharp.Compiler.Syntax.SynExpr+TryWith: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMatchClause] withCases FSharp.Compiler.Syntax.SynExpr+Tuple: Boolean get_isStruct() @@ -6934,7 +6922,7 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewFor(FSharp.Com FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewForEach(FSharp.Compiler.Syntax.DebugPointAtFor, FSharp.Compiler.Syntax.SeqExprOnly, Boolean, FSharp.Compiler.Syntax.SynPat, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewFromParseError(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewIdent(FSharp.Compiler.Syntax.Ident) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewIfThenElse(FSharp.Compiler.Text.Range, Boolean, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.SynExpr, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr], FSharp.Compiler.Syntax.DebugPointAtBinding, Boolean, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewIfThenElse(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr], FSharp.Compiler.Syntax.DebugPointAtBinding, Boolean, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewImplicitZero(FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewIndexFromEnd(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewIndexRange(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr], FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr], FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) @@ -6942,7 +6930,7 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewInferredDownca FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewInferredUpcast(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewInterpolatedString(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynInterpolatedStringPart], FSharp.Compiler.Syntax.SynStringKind, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewJoinIn(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewLambda(Boolean, Boolean, FSharp.Compiler.Syntax.SynSimplePats, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Syntax.SynExpr, Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynPat],FSharp.Compiler.Syntax.SynExpr]], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewLambda(Boolean, Boolean, FSharp.Compiler.Syntax.SynSimplePats, FSharp.Compiler.Syntax.SynExpr, Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynPat],FSharp.Compiler.Syntax.SynExpr]], FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynExprLambdaTrivia) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewLazy(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewLetOrUse(Boolean, Boolean, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynBinding], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewLetOrUseBang(FSharp.Compiler.Syntax.DebugPointAtBinding, Boolean, Boolean, FSharp.Compiler.Syntax.SynPat, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Syntax.SynExpr, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynExprAndBang], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) @@ -6966,8 +6954,8 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewSequential(FSh FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewSequentialOrImplicitYield(FSharp.Compiler.Syntax.DebugPointAtSequential, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewSet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewTraitCall(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynTypar], FSharp.Compiler.Syntax.SynMemberSig, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewTryFinally(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.DebugPointAtTry, FSharp.Compiler.Syntax.DebugPointAtFinally) -FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewTryWith(FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMatchClause], FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.DebugPointAtTry, FSharp.Compiler.Syntax.DebugPointAtWith) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewTryFinally(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.DebugPointAtTry, FSharp.Compiler.Syntax.DebugPointAtFinally, FSharp.Compiler.SyntaxTrivia.SynExprTryFinallyTrivia) +FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewTryWith(FSharp.Compiler.Syntax.SynExpr, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMatchClause], FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.DebugPointAtTry, FSharp.Compiler.Syntax.DebugPointAtWith, FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewTuple(Boolean, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynExpr], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewTypeApp(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynType], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewTypeTest(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range) @@ -7145,9 +7133,11 @@ FSharp.Compiler.Syntax.SynMatchClause: FSharp.Compiler.Syntax.DebugPointAtTarget FSharp.Compiler.Syntax.SynMatchClause: FSharp.Compiler.Syntax.DebugPointAtTarget get_debugPoint() FSharp.Compiler.Syntax.SynMatchClause: FSharp.Compiler.Syntax.SynExpr get_resultExpr() FSharp.Compiler.Syntax.SynMatchClause: FSharp.Compiler.Syntax.SynExpr resultExpr -FSharp.Compiler.Syntax.SynMatchClause: FSharp.Compiler.Syntax.SynMatchClause NewSynMatchClause(FSharp.Compiler.Syntax.SynPat, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.DebugPointAtTarget) +FSharp.Compiler.Syntax.SynMatchClause: FSharp.Compiler.Syntax.SynMatchClause NewSynMatchClause(FSharp.Compiler.Syntax.SynPat, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.DebugPointAtTarget, FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia) FSharp.Compiler.Syntax.SynMatchClause: FSharp.Compiler.Syntax.SynPat get_pat() FSharp.Compiler.Syntax.SynMatchClause: FSharp.Compiler.Syntax.SynPat pat +FSharp.Compiler.Syntax.SynMatchClause: FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia get_trivia() +FSharp.Compiler.Syntax.SynMatchClause: FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia trivia FSharp.Compiler.Syntax.SynMatchClause: FSharp.Compiler.Text.Range Range FSharp.Compiler.Syntax.SynMatchClause: FSharp.Compiler.Text.Range RangeOfGuardAndRhs FSharp.Compiler.Syntax.SynMatchClause: FSharp.Compiler.Text.Range get_Range() @@ -7158,8 +7148,6 @@ FSharp.Compiler.Syntax.SynMatchClause: Int32 Tag FSharp.Compiler.Syntax.SynMatchClause: Int32 get_Tag() FSharp.Compiler.Syntax.SynMatchClause: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr] get_whenExpr() FSharp.Compiler.Syntax.SynMatchClause: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr] whenExpr -FSharp.Compiler.Syntax.SynMatchClause: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] arrow -FSharp.Compiler.Syntax.SynMatchClause: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_arrow() FSharp.Compiler.Syntax.SynMatchClause: System.String ToString() FSharp.Compiler.Syntax.SynMeasure FSharp.Compiler.Syntax.SynMeasure+Anon: FSharp.Compiler.Text.Range get_range() @@ -8845,9 +8833,11 @@ FSharp.Compiler.Syntax.SynTypeDefnSimpleRepr: System.String ToString() FSharp.Compiler.Syntax.SynUnionCase FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.Ident get_ident() FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.Ident ident -FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.SynUnionCase NewSynUnionCase(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.Ident, FSharp.Compiler.Syntax.SynUnionCaseKind, FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.SynUnionCase NewSynUnionCase(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.Ident, FSharp.Compiler.Syntax.SynUnionCaseKind, FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia) FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.SynUnionCaseKind caseType FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Syntax.SynUnionCaseKind get_caseType() +FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia get_trivia() +FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia trivia FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Text.Range Range FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Text.Range get_Range() FSharp.Compiler.Syntax.SynUnionCase: FSharp.Compiler.Text.Range get_range() @@ -9066,6 +9056,65 @@ FSharp.Compiler.Syntax.TyparStaticReq: Int32 GetHashCode(System.Collections.IEqu FSharp.Compiler.Syntax.TyparStaticReq: Int32 Tag FSharp.Compiler.Syntax.TyparStaticReq: Int32 get_Tag() FSharp.Compiler.Syntax.TyparStaticReq: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia +FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: FSharp.Compiler.Text.Range EqualsRange +FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: FSharp.Compiler.Text.Range get_EqualsRange() +FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] BarRange +FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_BarRange() +FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynEnumCaseTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia +FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: Boolean IsElif +FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: Boolean get_IsElif() +FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: FSharp.Compiler.Text.Range IfKeyword +FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: FSharp.Compiler.Text.Range IfToThenRange +FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: FSharp.Compiler.Text.Range ThenKeyword +FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: FSharp.Compiler.Text.Range get_IfKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: FSharp.Compiler.Text.Range get_IfToThenRange() +FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: FSharp.Compiler.Text.Range get_ThenKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] ElseKeyword +FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_ElseKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynExprIfThenElseTrivia: Void .ctor(FSharp.Compiler.Text.Range, Boolean, FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.SynExprLambdaTrivia +FSharp.Compiler.SyntaxTrivia.SynExprLambdaTrivia: FSharp.Compiler.SyntaxTrivia.SynExprLambdaTrivia Zero +FSharp.Compiler.SyntaxTrivia.SynExprLambdaTrivia: FSharp.Compiler.SyntaxTrivia.SynExprLambdaTrivia get_Zero() +FSharp.Compiler.SyntaxTrivia.SynExprLambdaTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] ArrowRange +FSharp.Compiler.SyntaxTrivia.SynExprLambdaTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_ArrowRange() +FSharp.Compiler.SyntaxTrivia.SynExprLambdaTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynExprLambdaTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) +FSharp.Compiler.SyntaxTrivia.SynExprTryFinallyTrivia +FSharp.Compiler.SyntaxTrivia.SynExprTryFinallyTrivia: FSharp.Compiler.Text.Range FinallyKeyword +FSharp.Compiler.SyntaxTrivia.SynExprTryFinallyTrivia: FSharp.Compiler.Text.Range TryKeyword +FSharp.Compiler.SyntaxTrivia.SynExprTryFinallyTrivia: FSharp.Compiler.Text.Range get_FinallyKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprTryFinallyTrivia: FSharp.Compiler.Text.Range get_TryKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprTryFinallyTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynExprTryFinallyTrivia: Void .ctor(FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia +FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia: FSharp.Compiler.Text.Range TryKeyword +FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia: FSharp.Compiler.Text.Range TryToWithRange +FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia: FSharp.Compiler.Text.Range WithKeyword +FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia: FSharp.Compiler.Text.Range WithToEndRange +FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia: FSharp.Compiler.Text.Range get_TryKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia: FSharp.Compiler.Text.Range get_TryToWithRange() +FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia: FSharp.Compiler.Text.Range get_WithKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia: FSharp.Compiler.Text.Range get_WithToEndRange() +FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynExprTryWithTrivia: Void .ctor(FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia +FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia Zero +FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia get_Zero() +FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] ArrowRange +FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] BarRange +FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_ArrowRange() +FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_BarRange() +FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) +FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia +FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] BarRange +FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_BarRange() +FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) FSharp.Compiler.Text.ISourceText FSharp.Compiler.Text.ISourceText: Boolean ContentEquals(FSharp.Compiler.Text.ISourceText) FSharp.Compiler.Text.ISourceText: Boolean SubTextEquals(System.String, Int32) diff --git a/tests/service/ParserTests.fs b/tests/service/ParserTests.fs index a53ec060ab6..65fc4413a19 100644 --- a/tests/service/ParserTests.fs +++ b/tests/service/ParserTests.fs @@ -88,7 +88,7 @@ match () with """ match getSingleExprInModule parseResults with - | SynExpr.Match (clauses=[ SynMatchClause (SynPat.Or _, _, _, SynExpr.Const _, _, _) ]) -> () + | SynExpr.Match (clauses=[ SynMatchClause (pat=SynPat.Or _;resultExpr=SynExpr.Const _) ]) -> () | _ -> failwith "Unexpected tree" [] diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs index f4bdec43f33..4654f88efc7 100644 --- a/tests/service/Symbols.fs +++ b/tests/service/Symbols.fs @@ -403,8 +403,8 @@ type Bear = typeDefns = [ SynTypeDefn(equalsRange = Some mEquals typeRepr = SynTypeDefnRepr.Simple(simpleRepr = SynTypeDefnSimpleRepr.Enum(cases = [ - SynEnumCase(equalsRange = mEqualsEnumCase1) - SynEnumCase(equalsRange = mEqualsEnumCase2) + SynEnumCase(trivia={ EqualsRange = mEqualsEnumCase1 }) + SynEnumCase(trivia={ EqualsRange = mEqualsEnumCase2 }) ]))) ] ) ]) ])) -> @@ -799,13 +799,35 @@ with | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr(expr = - SynExpr.TryWith(tryKeywordRange=mTry; withKeywordRange=mWith)) + SynExpr.TryWith(trivia={ TryKeyword = mTry; WithKeyword = mWith })) ]) ])) -> assertRange (2, 0) (2, 3) mTry assertRange (4, 0) (4, 4) mWith | _ -> Assert.Fail "Could not get valid AST" + [] + let ``SynExpr.TryFinally contains the range of the try and with keyword`` () = + let ast = + """ +try + x +finally + () +""" + |> getParseResults + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.DoExpr(expr = + SynExpr.TryFinally(trivia={ TryKeyword = mTry; FinallyKeyword = mFinally })) + ]) + ])) -> + assertRange (2, 0) (2, 3) mTry + assertRange (4, 0) (4, 7) mFinally + | _ -> Assert.Fail "Could not get valid AST" + [] let ``SynExpr.Match contains the range of the match and with keyword`` () = let ast = @@ -1345,8 +1367,8 @@ type Bear = types = [ SynTypeDefnSig(equalsRange = Some mEquals typeRepr = SynTypeDefnSigRepr.Simple(repr = SynTypeDefnSimpleRepr.Enum(cases = [ - SynEnumCase(equalsRange = mEqualsEnumCase1) - SynEnumCase(equalsRange = mEqualsEnumCase2) + SynEnumCase(trivia={ EqualsRange = mEqualsEnumCase1 }) + SynEnumCase(trivia={ EqualsRange = mEqualsEnumCase2 }) ]) )) ] ) ]) ])) -> @@ -1605,7 +1627,7 @@ match foo with match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ - SynModuleDecl.DoExpr(expr = SynExpr.Match(clauses = [ SynMatchClause(arrow = Some mArrow) ])) + SynModuleDecl.DoExpr(expr = SynExpr.Match(clauses = [ SynMatchClause(trivia={ ArrowRange = Some mArrow }) ])) ]) ])) -> assertRange (3, 10) (3, 12) mArrow | _ -> Assert.Fail "Could not get valid AST" @@ -1620,11 +1642,101 @@ match foo with match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ - SynModuleDecl.DoExpr(expr = SynExpr.Match(clauses = [ SynMatchClause(arrow = Some mArrow) ])) + SynModuleDecl.DoExpr(expr = SynExpr.Match(clauses = [ SynMatchClause(trivia={ ArrowRange = Some mArrow }) ])) ]) ])) -> assertRange (3, 31) (3, 33) mArrow | _ -> Assert.Fail "Could not get valid AST" + [] + let ``Range of bar in a single SynMatchClause in SynExpr.Match`` () = + let parseResults = + getParseResults + """ +match foo with +| Bar bar when (someCheck bar) -> ()""" + + match parseResults with + | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.DoExpr(expr = SynExpr.Match(clauses = [ SynMatchClause(trivia={ BarRange = Some mBar }) ])) + ]) ])) -> + assertRange (3, 0) (3, 1) mBar + | _ -> Assert.Fail "Could not get valid AST" + + [] + let ``Range of bar in multiple SynMatchClauses in SynExpr.Match`` () = + let parseResults = + getParseResults + """ +match foo with +| Bar bar when (someCheck bar) -> () +| Far too -> near ()""" + + match parseResults with + | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.DoExpr(expr = SynExpr.Match(clauses = [ SynMatchClause(trivia={ BarRange = Some mBar1 }) + SynMatchClause(trivia={ BarRange = Some mBar2 }) ])) + ]) ])) -> + assertRange (3, 0) (3, 1) mBar1 + assertRange (4, 0) (4, 1) mBar2 + | _ -> Assert.Fail "Could not get valid AST" + + [] + let ``Range of bar in a single SynMatchClause in SynExpr.TryWith`` () = + let parseResults = + getParseResults + """ +try + foo () +with +| exn -> ()""" + + match parseResults with + | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.DoExpr(expr = SynExpr.TryWith(withCases = [ SynMatchClause(trivia={ BarRange = Some mBar }) ])) + ]) ])) -> + assertRange (5, 0) (5, 1) mBar + | _ -> Assert.Fail "Could not get valid AST" + + [] + let ``No range of bar in a single SynMatchClause in SynExpr.TryWith`` () = + let parseResults = + getParseResults + """ +try + foo () +with exn -> + // some comment + ()""" + + match parseResults with + | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.DoExpr(expr = SynExpr.TryWith(withCases = [ SynMatchClause(trivia={ BarRange = None }) ])) + ]) ])) -> + Assert.Pass() + | _ -> Assert.Fail "Could not get valid AST" + + [] + let ``Range of bar in a multiple SynMatchClauses in SynExpr.TryWith`` () = + let parseResults = + getParseResults + """ +try + foo () +with +| IOException as ioex -> + // some comment + () +| ex -> ()""" + + match parseResults with + | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.DoExpr(expr = SynExpr.TryWith(withCases = [ SynMatchClause(trivia={ BarRange = Some mBar1 }) + SynMatchClause(trivia={ BarRange = Some mBar2 }) ])) + ]) ])) -> + assertRange (5, 0) (5, 1) mBar1 + assertRange (8, 0) (8, 1) mBar2 + | _ -> Assert.Fail "Could not get valid AST" + module SourceIdentifiers = [] let ``__LINE__`` () = @@ -2280,7 +2392,7 @@ module Lambdas = match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr( - expr = SynExpr.Lambda(arrow = Some mArrow) + expr = SynExpr.Lambda(trivia={ ArrowRange = Some mArrow }) ) ]) ])) -> assertRange (1, 6) (1, 8) mArrow @@ -2297,7 +2409,7 @@ module Lambdas = match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr( - expr = SynExpr.Lambda(arrow = Some mArrow) + expr = SynExpr.Lambda(trivia={ ArrowRange = Some mArrow }) ) ]) ])) -> assertRange (2, 28) (2, 30) mArrow @@ -2312,7 +2424,7 @@ module Lambdas = match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr( - expr = SynExpr.Lambda(arrow = Some mArrow) + expr = SynExpr.Lambda(trivia={ ArrowRange = Some mArrow }) ) ]) ])) -> assertRange (1, 14) (1, 16) mArrow @@ -2327,7 +2439,7 @@ module Lambdas = match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr( - expr = SynExpr.Lambda(arrow = Some mArrow) + expr = SynExpr.Lambda(trivia={ ArrowRange = Some mArrow }) ) ]) ])) -> assertRange (1, 11) (1, 13) mArrow @@ -2346,7 +2458,7 @@ module Lambdas = match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr( - expr = SynExpr.Lambda(arrow = Some mArrow) + expr = SynExpr.Lambda(trivia={ ArrowRange = Some mArrow }) ) ]) ])) -> assertRange (4, 4) (4, 6) mArrow @@ -2362,7 +2474,7 @@ module IfThenElse = match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr( - expr = SynExpr.IfThenElse(ifKeyword = mIfKw; isElif = false; thenKeyword = mThenKw; elseKeyword = None) + expr = SynExpr.IfThenElse(trivia={ IfKeyword = mIfKw; IsElif = false; ThenKeyword = mThenKw; ElseKeyword = None }) ) ]) ])) -> assertRange (1, 0) (1, 2) mIfKw @@ -2378,7 +2490,7 @@ module IfThenElse = match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr( - expr = SynExpr.IfThenElse(ifKeyword = mIfKw; isElif = false; thenKeyword = mThenKw; elseKeyword = Some mElse) + expr =SynExpr.IfThenElse(trivia={ IfKeyword = mIfKw; IsElif = false; ThenKeyword = mThenKw; ElseKeyword = Some mElse }) ) ]) ])) -> assertRange (1, 0) (1, 2) mIfKw @@ -2398,7 +2510,7 @@ else c""" match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr( - expr = SynExpr.IfThenElse(ifKeyword = mIfKw; isElif = false; thenKeyword = mThenKw; elseKeyword = Some mElse) + expr = SynExpr.IfThenElse(trivia={ IfKeyword = mIfKw; IsElif = false; ThenKeyword = mThenKw; ElseKeyword = Some mElse }) ) ]) ])) -> assertRange (2, 0) (2, 2) mIfKw @@ -2418,11 +2530,8 @@ elif c then d""" match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr( - expr = SynExpr.IfThenElse(ifKeyword = mIfKw - isElif = false - thenKeyword = mThenKw - elseKeyword = None - elseExpr = Some (SynExpr.IfThenElse(ifKeyword = mElif; isElif = true))) + expr = SynExpr.IfThenElse(trivia={ IfKeyword = mIfKw; IsElif=false; ThenKeyword = mThenKw; ElseKeyword = None } + elseExpr = Some (SynExpr.IfThenElse(trivia={ IfKeyword = mElif; IsElif = true }))) ) ]) ])) -> assertRange (2, 0) (2, 2) mIfKw @@ -2443,11 +2552,8 @@ else match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr( - expr = SynExpr.IfThenElse(ifKeyword = mIfKw - isElif = false - thenKeyword = mThenKw - elseKeyword = Some mElse - elseExpr = Some (SynExpr.IfThenElse(ifKeyword = mElseIf; isElif = false))) + expr = SynExpr.IfThenElse(trivia={ IfKeyword = mIfKw; IsElif = false; ThenKeyword = mThenKw; ElseKeyword = Some mElse } + elseExpr = Some (SynExpr.IfThenElse(trivia={ IfKeyword = mElseIf; IsElif = false }))) ) ]) ])) -> assertRange (2, 0) (2, 2) mIfKw @@ -2469,11 +2575,8 @@ else if c then match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr( - expr = SynExpr.IfThenElse(ifKeyword = mIfKw - isElif = false - thenKeyword = mThenKw - elseKeyword = Some mElse - elseExpr = Some (SynExpr.IfThenElse(ifKeyword = mElseIf; isElif = false))) + expr = SynExpr.IfThenElse(trivia={ IfKeyword = mIfKw; IsElif=false; ThenKeyword = mThenKw; ElseKeyword = Some mElse } + elseExpr = Some (SynExpr.IfThenElse(trivia={ IfKeyword = mElseIf; IsElif = false }))) ) ]) ])) -> assertRange (2, 0) (2, 2) mIfKw @@ -2500,15 +2603,9 @@ else match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr( - expr = SynExpr.IfThenElse(ifKeyword = mIf1 - isElif = false - elseKeyword = None - elseExpr = Some (SynExpr.IfThenElse(ifKeyword = mElif - isElif = true - elseKeyword = Some mElse1 - elseExpr = Some (SynExpr.IfThenElse(ifKeyword = mIf2 - isElif = false - elseKeyword = Some mElse2)))))) + expr = SynExpr.IfThenElse(trivia={ IfKeyword = mIf1; IsElif = false; ElseKeyword = None } + elseExpr = Some (SynExpr.IfThenElse(trivia={ IfKeyword = mElif; IsElif = true; ElseKeyword = Some mElse1 } + elseExpr = Some (SynExpr.IfThenElse(trivia={ IfKeyword = mIf2; IsElif = false; ElseKeyword = Some mElse2 })))))) ]) ])) -> assertRange (2, 0) (2, 2) mIf1 assertRange (4, 0) (4, 4) mElif @@ -2531,10 +2628,8 @@ else (* some long comment here *) if c then match parseResults with | ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.DoExpr( - expr = SynExpr.IfThenElse(ifKeyword = mIf1 - isElif = false - elseKeyword = Some mElse - elseExpr = Some (SynExpr.IfThenElse(ifKeyword = mIf2; isElif = false)))) + expr = SynExpr.IfThenElse(trivia={ IfKeyword = mIf1; IsElif = false; ElseKeyword = Some mElse } + elseExpr = Some (SynExpr.IfThenElse(trivia = { IfKeyword = mIf2; IsElif = false })))) ]) ])) -> assertRange (2, 0) (2, 2) mIf1 assertRange (4, 0) (4, 4) mElse @@ -2542,7 +2637,7 @@ else (* some long comment here *) if c then | _ -> Assert.Fail "Could not get valid AST" -module UnionCaseComments = +module UnionCases = [] let ``Union Case fields can have comments`` () = let ast = """ @@ -2580,6 +2675,144 @@ type Foo = | _ -> failwith "Could not find SynExpr.Do" + [] + let ``single SynUnionCase has bar range`` () = + let ast = """ +type Foo = | Bar of string +""" + |> getParseResults + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Types ([ + SynTypeDefn.SynTypeDefn (typeRepr = SynTypeDefnRepr.Simple (simpleRepr = SynTypeDefnSimpleRepr.Union(unionCases = [ + SynUnionCase.SynUnionCase (trivia = { BarRange = Some mBar }) + ]))) + ], _) + ]) + ])) -> + assertRange (2, 11) (2, 12) mBar + | _ -> + Assert.Fail "Could not get valid AST" + + [] + let ``multiple SynUnionCases have bar range`` () = + let ast = """ +type Foo = + | Bar of string + | Bear of int +""" + |> getParseResults + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Types ([ + SynTypeDefn.SynTypeDefn (typeRepr = SynTypeDefnRepr.Simple (simpleRepr = SynTypeDefnSimpleRepr.Union(unionCases = [ + SynUnionCase.SynUnionCase (trivia = { BarRange = Some mBar1 }) + SynUnionCase.SynUnionCase (trivia = { BarRange = Some mBar2 }) + ]))) + ], _) + ]) + ])) -> + assertRange (3, 4) (3, 5) mBar1 + assertRange (4, 4) (4, 5) mBar2 + | _ -> + Assert.Fail "Could not get valid AST" + + [] + let ``single SynUnionCase without bar`` () = + let ast = """ +type Foo = Bar of string +""" + |> getParseResults + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Types ([ + SynTypeDefn.SynTypeDefn (typeRepr = SynTypeDefnRepr.Simple (simpleRepr = SynTypeDefnSimpleRepr.Union(unionCases = [ + SynUnionCase.SynUnionCase (trivia = { BarRange = None }) + ]))) + ], _) + ]) + ])) -> + Assert.Pass() + | _ -> + Assert.Fail "Could not get valid AST" + +module EnumCases = + [] + let ``single SynEnumCase has bar range`` () = + let ast = """ +type Foo = | Bar = 1 +""" + |> getParseResults + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Types ([ + SynTypeDefn.SynTypeDefn (typeRepr = SynTypeDefnRepr.Simple (simpleRepr = SynTypeDefnSimpleRepr.Enum(cases = [ + SynEnumCase.SynEnumCase (trivia = { BarRange = Some mBar; EqualsRange = mEquals }) + ]))) + ], _) + ]) + ])) -> + assertRange (2, 11) (2, 12) mBar + assertRange (2, 17) (2, 18) mEquals + | _ -> + Assert.Fail "Could not get valid AST" + + [] + let ``multiple SynEnumCases have bar range`` () = + let ast = """ +type Foo = + | Bar = 1 + | Bear = 2 +""" + |> getParseResults + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Types ([ + SynTypeDefn.SynTypeDefn (typeRepr = SynTypeDefnRepr.Simple (simpleRepr = SynTypeDefnSimpleRepr.Enum(cases = [ + SynEnumCase.SynEnumCase (trivia = { BarRange = Some mBar1; EqualsRange = mEquals1 }) + SynEnumCase.SynEnumCase (trivia = { BarRange = Some mBar2; EqualsRange = mEquals2 }) + ]))) + ], _) + ]) + ])) -> + assertRange (3, 4) (3, 5) mBar1 + assertRange (3, 10) (3, 11) mEquals1 + assertRange (4, 4) (4, 5) mBar2 + assertRange (4, 11) (4, 12) mEquals2 + | _ -> + Assert.Fail "Could not get valid AST" + + [] + let ``single SynEnumCase without bar`` () = + let ast = """ +type Foo = Bar = 1 +""" + |> getParseResults + + match ast with + | ParsedInput.ImplFile(ParsedImplFileInput(modules = [ + SynModuleOrNamespace.SynModuleOrNamespace(decls = [ + SynModuleDecl.Types ([ + SynTypeDefn.SynTypeDefn (typeRepr = SynTypeDefnRepr.Simple (simpleRepr = SynTypeDefnSimpleRepr.Enum(cases = [ + SynEnumCase.SynEnumCase (trivia = { BarRange = None; EqualsRange = mEquals }) + ]))) + ], _) + ]) + ])) -> + assertRange (2, 15) (2, 16) mEquals + | _ -> + Assert.Fail "Could not get valid AST" + module Patterns = [] let ``SynPat.Record contains the range of the equals sign`` () = diff --git a/tests/service/TreeVisitorTests.fs b/tests/service/TreeVisitorTests.fs index 96f0979a3d7..400e4614759 100644 --- a/tests/service/TreeVisitorTests.fs +++ b/tests/service/TreeVisitorTests.fs @@ -44,7 +44,7 @@ let ``Visit union definition test`` () = let parseTree = parseSourceCode("C:\\test.fs", source) match SyntaxTraversal.Traverse(pos0, parseTree, visitor) with - | Some [ SynUnionCase (_, id1, _, _, _, _); SynUnionCase (_, id2, _, _, _, _) ] when id1.idText = "A" && id2.idText = "B" -> () + | Some [ SynUnionCase (ident=id1); SynUnionCase (ident=id2) ] when id1.idText = "A" && id2.idText = "B" -> () | _ -> failwith "Did not visit union definition" []