Skip to content

Commit 01af60f

Browse files
auduchinokclaude
andcommitted
Sequence points: rework conditional erasure, fix stepping over literals
Add `isHidden` to `DebugPointAtLeafExpr.Yes` to express it explicitly in the typed tree Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent d0e593f commit 01af60f

46 files changed

Lines changed: 589 additions & 56 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/Compiler/Checking/CheckIncrementalClasses.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,7 @@ let MakeCtorForIncrClassConstructionPhase2C(
802802
// Extend the range of any immediate debug point to include the 'do'
803803
let doExpr =
804804
match doExpr with
805-
| Expr.DebugPoint(_, innerExpr) -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes mFull, innerExpr)
805+
| Expr.DebugPoint(_, innerExpr) -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFull), innerExpr)
806806
| e -> e
807807
let binder = (fun e -> mkSequential mFull doExpr e)
808808
let isPriorToSuperInit = false
@@ -940,7 +940,7 @@ let MakeCtorForIncrClassConstructionPhase2C(
940940
// Add the debug point
941941
let inheritsExpr =
942942
if inheritsIsVisible then
943-
Expr.DebugPoint(DebugPointAtLeafExpr.Yes inheritsExpr.Range, inheritsExpr)
943+
Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, inheritsExpr.Range), inheritsExpr)
944944
else
945945
inheritsExpr
946946

src/Compiler/Checking/Expressions/CheckComputationExpressions.fs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ let inline arbKeySelectors m =
8181
// Flag that a debug point should get emitted prior to both the evaluation of 'rhsExpr' and the call to Using
8282
let inline addBindDebugPoint spBind e =
8383
match spBind with
84-
| DebugPointAtBinding.Yes m -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, e)
84+
| DebugPointAtBinding.Yes m -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), false, e)
8585
| _ -> e
8686

8787
let inline mkSynDelay2 (e: SynExpr) = mkSynDelay (e.Range.MakeSynthetic()) e
@@ -1345,7 +1345,7 @@ let rec TryTranslateComputationExpression
13451345

13461346
let forCall =
13471347
match spFor with
1348-
| DebugPointAtFor.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFor, false, forCall)
1348+
| DebugPointAtFor.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFor), false, forCall)
13491349
| DebugPointAtFor.No -> forCall
13501350

13511351
translatedCtxt forCall)
@@ -1389,7 +1389,7 @@ let rec TryTranslateComputationExpression
13891389
// 'while' is hit just before each time the guard is called
13901390
let guardExpr =
13911391
match spWhile with
1392-
| DebugPointAtWhile.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mWhile, false, guardExpr)
1392+
| DebugPointAtWhile.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mWhile), false, guardExpr)
13931393
| DebugPointAtWhile.No -> guardExpr
13941394

13951395
Some(
@@ -1419,7 +1419,7 @@ let rec TryTranslateComputationExpression
14191419
// 'while!' is hit just before each time the guard is called
14201420
let guardExpr =
14211421
match spWhile with
1422-
| DebugPointAtWhile.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mWhile, false, guardExpr)
1422+
| DebugPointAtWhile.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mWhile), false, guardExpr)
14231423
| DebugPointAtWhile.No -> guardExpr
14241424

14251425
let rewrittenWhileExpr =
@@ -1557,7 +1557,7 @@ let rec TryTranslateComputationExpression
15571557
// Put down a debug point for the 'finally'
15581558
let unwindExpr2 =
15591559
match spFinally with
1560-
| DebugPointAtFinally.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFinally, true, unwindExpr)
1560+
| DebugPointAtFinally.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFinally), true, unwindExpr)
15611561
| DebugPointAtFinally.No -> unwindExpr
15621562

15631563
if ceenv.isQuery then
@@ -1571,7 +1571,7 @@ let rec TryTranslateComputationExpression
15711571

15721572
let innerExpr =
15731573
match spTry with
1574-
| DebugPointAtTry.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mTry, true, innerExpr)
1574+
| DebugPointAtTry.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mTry), true, innerExpr)
15751575
| _ -> innerExpr
15761576

15771577
Some(
@@ -2308,7 +2308,7 @@ let rec TryTranslateComputationExpression
23082308

23092309
let innerExpr =
23102310
match spTry with
2311-
| DebugPointAtTry.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mTry, true, innerExpr)
2311+
| DebugPointAtTry.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mTry), true, innerExpr)
23122312
| _ -> innerExpr
23132313

23142314
let callExpr =
@@ -2345,7 +2345,7 @@ let rec TryTranslateComputationExpression
23452345
if IsControlFlowExpression synYieldExpr then
23462346
yieldFromCall
23472347
else
2348-
SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFull, false, yieldFromCall)
2348+
SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFull), false, yieldFromCall)
23492349

23502350
Some(translatedCtxt yieldFromCall)
23512351

@@ -2374,7 +2374,7 @@ let rec TryTranslateComputationExpression
23742374
if IsControlFlowExpression synReturnExpr then
23752375
returnFromCall
23762376
else
2377-
SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFull, false, returnFromCall)
2377+
SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFull), false, returnFromCall)
23782378

23792379
Some(translatedCtxt returnFromCall)
23802380

@@ -2393,7 +2393,7 @@ let rec TryTranslateComputationExpression
23932393
if IsControlFlowExpression synYieldOrReturnExpr then
23942394
yieldOrReturnCall
23952395
else
2396-
SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFull, false, yieldOrReturnCall)
2396+
SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFull), false, yieldOrReturnCall)
23972397

23982398
Some(translatedCtxt yieldOrReturnCall)
23992399

@@ -2704,7 +2704,7 @@ and TranslateComputationExpressionBind
27042704
and convertSimpleReturnToExpr (ceenv: ComputationExpressionContext<'a>) comp varSpace innerComp =
27052705
match innerComp with
27062706
| SynExpr.YieldOrReturn((false, _), returnExpr, m, _) ->
2707-
let returnExpr = SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, returnExpr)
2707+
let returnExpr = SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), false, returnExpr)
27082708
Some(returnExpr, None)
27092709

27102710
| SynExpr.Match(spMatch, expr, clauses, m, trivia) ->

src/Compiler/Checking/Expressions/CheckExpressions.fs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3103,7 +3103,7 @@ let BuildPossiblyConditionalMethodCall (cenv: cenv) env isMutable m isProp minfo
31033103
if shouldEraseCall then
31043104
// Methods marked with 'Conditional' must return 'unit'
31053105
UnifyTypes cenv env m g.unit_ty (minfo.GetFSharpReturnType(cenv.amap, m, minst))
3106-
mkUnit g m, g.unit_ty
3106+
Expr.DebugPoint(DebugPointAtLeafExpr.Yes(isHidden = true, range = m), mkUnit g m), g.unit_ty
31073107
else
31083108
#if !NO_TYPEPROVIDERS
31093109
match minfo with
@@ -5903,6 +5903,7 @@ and TcNonControlFlowExpr (env: TcEnv) f =
59035903
let res2 =
59045904
match res with
59055905
| IfThenElseExpr _ -> res
5906+
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes(isHidden = true), _) -> res
59065907
| _ -> mkDebugPoint res.Range res
59075908
res2, tpenv
59085909
else

src/Compiler/CodeGen/IlxGen.fs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3171,8 +3171,8 @@ and GenExprAux (cenv: cenv) (cgbuf: CodeGenBuffer) eenv expr (sequel: sequel) =
31713171
| LinearOpExpr _
31723172
| Expr.Match _ -> GenLinearExpr cenv cgbuf eenv expr sequel false id |> ignore<FakeUnit>
31733173

3174-
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, innerExpr) ->
3175-
if equals m range0 then
3174+
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes(isHidden, m), innerExpr) ->
3175+
if isHidden then
31763176
cgbuf.EmitStartOfHiddenCode()
31773177
else
31783178
CG.EmitDebugPoint cgbuf m
@@ -3736,8 +3736,8 @@ and GenLinearExpr cenv cgbuf eenv expr sequel preSteps (contf: FakeUnit -> FakeU
37363736
GenSequel cenv eenv.cloc cgbuf sequelAfterJoin
37373737
Fake))
37383738

3739-
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, innerExpr) ->
3740-
if equals m range0 then
3739+
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes(isHidden, m), innerExpr) ->
3740+
if isHidden then
37413741
cgbuf.EmitStartOfHiddenCode()
37423742
else
37433743
CG.EmitDebugPoint cgbuf m
@@ -10641,10 +10641,20 @@ and CodeGenInitMethod cenv (cgbuf: CodeGenBuffer) eenv tref (codeGenInitFunc: Co
1064110641
let _, body =
1064210642
CodeGenMethod cenv cgbuf.mgbuf ([], eenv.staticInitializationName, eenv, 0, None, codeGenInitFunc, m)
1064310643

10644-
if CheckCodeDoesSomething body.Code then
10644+
let codeDoesSomething = CheckCodeDoesSomething body.Code
10645+
10646+
// Keep the init method if it carries a visible debug point, so steppable bindings like 'let i = ()' survive.
10647+
let hasVisibleDebugPoint =
10648+
body.Code.Instrs
10649+
|> Array.exists (function
10650+
| I_seqpoint sp -> sp.Line <> FeeFee cenv
10651+
| _ -> false)
10652+
10653+
if codeDoesSomething || hasVisibleDebugPoint then
1064510654
// We are here because the module we just grabbed has an interesting static initializer
1064610655
let feefee, seqpt =
10647-
if body.Code.Instrs.Length > 0 then
10656+
// Without real init code, the .cctor's FeeFee marker would just add a stray hidden sequence point.
10657+
if codeDoesSomething && body.Code.Instrs.Length > 0 then
1064810658
match body.Code.Instrs[0] with
1064910659
| I_seqpoint sp as i -> [ FeeFeeInstr cenv sp.Document ], [ i ]
1065010660
| _ -> [], []

src/Compiler/Optimize/LowerComputedCollections.fs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ let LowerComputedListOrArraySeqExpr tcVal g amap m collectorTy overallSeqExpr =
114114
let cleanupE = BuildDisposableCleanup tcVal g infoReader m enumv
115115

116116
// A debug point should get emitted prior to both the evaluation of 'inp' and the call to GetEnumerator
117-
let addForDebugPoint e = Expr.DebugPoint(DebugPointAtLeafExpr.Yes mFor, e)
117+
let addForDebugPoint e = Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFor), e)
118118

119119
let spInAsWhile = match spIn with DebugPointAtInOrTo.Yes m -> DebugPointAtWhile.Yes m | DebugPointAtInOrTo.No -> DebugPointAtWhile.No
120120

@@ -289,7 +289,7 @@ module List =
289289
match body with
290290
| Expr.Let(TBind(v, rhs, DebugPointAtBinding.Yes spBind), innerBody, m, flags) ->
291291
let bodyForAdd = Expr.Let(TBind(v, rhs, DebugPointAtBinding.NoneAtInvisible), innerBody, m, flags)
292-
Expr.DebugPoint(DebugPointAtLeafExpr.Yes spBind, mkCallCollectorAdd tcVal g reader mBody collector bodyForAdd)
292+
Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, spBind), mkCallCollectorAdd tcVal g reader mBody collector bodyForAdd)
293293
| _ ->
294294
mkCallCollectorAdd tcVal g reader mIn collector body
295295

@@ -342,7 +342,7 @@ module List =
342342
match body with
343343
| Some (loopVal, body) ->
344344
mkInvisibleLet m loopVal loopVar
345-
(Expr.DebugPoint (DebugPointAtLeafExpr.Yes mFor, mkCallCollectorAdd tcVal g reader mBody collector body))
345+
(Expr.DebugPoint (DebugPointAtLeafExpr.Yes(false, mFor), mkCallCollectorAdd tcVal g reader mBody collector body))
346346
| None ->
347347
mkCallCollectorAdd tcVal g reader mBody collector loopVar)
348348

@@ -447,7 +447,7 @@ module Array =
447447
)
448448

449449
// Add a debug point at the `for`, before anything gets evaluated.
450-
Expr.DebugPoint (DebugPointAtLeafExpr.Yes mFor, mapping)
450+
Expr.DebugPoint (DebugPointAtLeafExpr.Yes(false, mFor), mapping)
451451
)
452452

453453
/// Whether to check for overflow when converting a value to a native int.
@@ -508,7 +508,7 @@ module Array =
508508

509509
match body with
510510
| Some (loopVal, body) ->
511-
mkInvisibleLet mBody loopVal loopVar (Expr.DebugPoint (DebugPointAtLeafExpr.Yes mFor, mkStore body))
511+
mkInvisibleLet mBody loopVal loopVar (Expr.DebugPoint (DebugPointAtLeafExpr.Yes(false, mFor), mkStore body))
512512
| None ->
513513
mkStore loopVar)
514514

src/Compiler/Optimize/LowerSequences.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ let ConvertSequenceExprToObject g amap overallExpr =
118118
let (TBind(v, e, sp)) = bind
119119
let addDebugPoint e =
120120
match sp with
121-
| DebugPointAtBinding.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, e)
121+
| DebugPointAtBinding.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), e)
122122
| _ -> e
123123
let vref = mkLocalValRef v
124124
{ resBody with
@@ -262,7 +262,7 @@ let ConvertSequenceExprToObject g amap overallExpr =
262262
// body ]]
263263

264264
// A debug point should get emitted prior to both the evaluation of 'inp' and the call to GetEnumerator
265-
let addForDebugPoint e = Expr.DebugPoint(DebugPointAtLeafExpr.Yes mFor, e)
265+
let addForDebugPoint e = Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFor), e)
266266

267267
// The 'in' debug point is put back into the TypedTree at the right place for SeqWhile
268268
let mIn = match spIn with DebugPointAtInOrTo.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.While) | DebugPointAtInOrTo.No -> mIn
@@ -293,11 +293,11 @@ let ConvertSequenceExprToObject g amap overallExpr =
293293
let asyncVars = unionFreeVars res1.asyncVars (freeInExpr CollectLocals compensation)
294294
let addTryDebugPoint e =
295295
match spTry with
296-
| DebugPointAtTry.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, e)
296+
| DebugPointAtTry.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), e)
297297
| _ -> e
298298
let addFinallyDebugPoint e =
299299
match spFinally with
300-
| DebugPointAtFinally.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, e)
300+
| DebugPointAtFinally.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), e)
301301
| _ -> e
302302
Some { phase2 = (fun (pcVar, _currv, _, pcMap as ctxt) ->
303303
let generate1, dispose1, checkDispose1 = res1.phase2 ctxt

src/Compiler/Optimize/LowerStateMachines.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ let RepresentBindingAsStateVar g (bind: Binding) (resBody: StateMachineConversio
7676
let (TBind(v, e, sp)) = bind
7777
let addDebugPoint innerExpr =
7878
match sp with
79-
| DebugPointAtBinding.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, innerExpr)
79+
| DebugPointAtBinding.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), innerExpr)
8080
| _ -> innerExpr
8181
let vref = mkLocalValRef v
8282
{ resBody with

src/Compiler/Optimize/Optimizer.fs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -383,9 +383,6 @@ type OptimizationSettings =
383383
/// This optimization is off by default, given tiny overhead of including try/with. See https://github.com/dotnet/fsharp/pull/376
384384
member _.EliminateTryWithAndTryFinally = false
385385

386-
/// Determines if we should eliminate first part of sequential expression if it has no effect
387-
member x.EliminateSequential = x.LocalOptimizationsEnabled
388-
389386
/// Determines if we should determine branches in pattern matching based on known information, e.g.
390387
/// eliminate a "if true then .. else ... "
391388
member x.EliminateSwitch = x.LocalOptimizationsEnabled
@@ -2874,12 +2871,8 @@ and OptimizeLinearExpr cenv env expr contf =
28742871

28752872
OptimizeLinearExpr cenv env e2 (contf << (fun (e2R, e2info) ->
28762873
if (flag = NormalSeq) &&
2877-
// Drop bare (compiler-generated) units always; keep a debug-pointed unit in debug code so
2878-
// it stays steppable (a unit without one must go, else a dangling breakpoint - FSharp 1.0 bug 6034).
2879-
(cenv.settings.EliminateSequential ||
2880-
(match e1R with
2881-
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes _, _) -> false
2882-
| _ -> match stripDebugPoints e1R with Expr.Const (Const.Unit, _, _) -> true | _ -> false)) &&
2874+
(cenv.settings.LocalOptimizationsEnabled ||
2875+
(match e1R with | Expr.DebugPoint(DebugPointAtLeafExpr.Yes(isHidden, _), _) -> isHidden | _ -> false)) &&
28832876
not e1info.HasEffect then
28842877
e2R, e2info
28852878
else
@@ -2942,9 +2935,11 @@ and OptimizeLinearExpr cenv env expr contf =
29422935
OptimizeLinearExpr cenv env argLast (contf << (fun (argLastR, argLastInfo) ->
29432936
OptimizeExprOpReductionsAfter cenv env (op, tyargs, argsHeadR @ [argLastR], argsHeadInfosR @ [argLastInfo], m)))
29442937

2945-
| Expr.DebugPoint (m, innerExpr) when not (IsDebugPipeRightExpr cenv innerExpr)->
2938+
| Expr.DebugPoint (m, innerExpr) when not (IsDebugPipeRightExpr cenv innerExpr)->
29462939
OptimizeLinearExpr cenv env innerExpr (contf << (fun (innerExprR, einfo) ->
2947-
Expr.DebugPoint (m, innerExprR), einfo))
2940+
match m with
2941+
| DebugPointAtLeafExpr.Yes(isHidden = true) when not einfo.HasEffect -> innerExprR, einfo
2942+
| _ -> Expr.DebugPoint (m, innerExprR), einfo))
29482943

29492944
| _ -> contf (OptimizeExpr cenv env expr)
29502945

@@ -2966,7 +2961,7 @@ and OptimizeTryFinally cenv env (spTry, spFinally, e1, e2, m, ty) =
29662961
if cenv.settings.EliminateTryWithAndTryFinally && not e1info.HasEffect then
29672962
let e1R2 =
29682963
match spTry with
2969-
| DebugPointAtTry.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, e1R)
2964+
| DebugPointAtTry.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), e1R)
29702965
| DebugPointAtTry.No -> e1R
29712966
Expr.Sequential (e1R2, e2R, ThenDoSeq, m), info
29722967
else
@@ -4220,7 +4215,14 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) =
42204215
if vref.ShouldInline && IsPartialExprVal einfo.Info then
42214216
errorR(InternalError("the inline value '"+vref.LogicalName+"' was not inferred to have a known value", vref.Range))
42224217

4223-
let env = BindInternalLocalVal cenv vref (mkValInfo einfo vref) env
4218+
let env = BindInternalLocalVal cenv vref (mkValInfo einfo vref) env
4219+
4220+
// The hidden debug point on the r.h.s. is dropped above, so suppress the binding's debug point too.
4221+
let spBind =
4222+
match expr with
4223+
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes(isHidden = true), _) when not einfo.HasEffect -> DebugPointAtBinding.NoneAtLet
4224+
| _ -> spBind
4225+
42244226
(TBind(vref, exprOptimized, spBind), einfo), env
42254227
with RecoverableException exn ->
42264228
errorRecovery exn vref.Range

src/Compiler/Service/FSharpParseFileResults.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
568568
| SynInterpolatedStringPart.FillExpr(fillExpr, _) -> yield fillExpr
569569
]
570570

571-
| SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, isControlFlow, innerExpr) ->
571+
| SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(_, m), isControlFlow, innerExpr) ->
572572
yield! checkRange m
573573
yield! walkExpr isControlFlow innerExpr
574574

src/Compiler/SyntaxTree/SyntaxTree.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ type DebugPointAtTry =
270270
| No
271271

272272
[<RequireQualifiedAccess>]
273-
type DebugPointAtLeafExpr = Yes of range
273+
type DebugPointAtLeafExpr = Yes of isHidden: bool * range: range
274274

275275
[<RequireQualifiedAccess>]
276276
type DebugPointAtWith =

0 commit comments

Comments
 (0)