@@ -2463,21 +2463,26 @@ class Typer extends Namer
2463
2463
case _ => typedUnadapted(desugar(tree), pt, locked)
2464
2464
}
2465
2465
2466
- val ifpt = defn.asContextFunctionType(pt)
2467
- val result =
2468
- if ifpt.exists
2469
- && xtree.isTerm
2470
- && ! untpd.isContextualClosure(xtree)
2471
- && ! ctx.mode.is(Mode .Pattern )
2472
- && ! ctx.isAfterTyper
2473
- && ! ctx.isInlineContext
2474
- then
2475
- makeContextualFunction(xtree, ifpt)
2476
- else xtree match
2477
- case xtree : untpd.NameTree => typedNamed(xtree, pt)
2478
- case xtree => typedUnnamed(xtree)
2479
-
2480
- simplify(result, pt, locked)
2466
+ try
2467
+ val ifpt = defn.asContextFunctionType(pt)
2468
+ val result =
2469
+ if ifpt.exists
2470
+ && xtree.isTerm
2471
+ && ! untpd.isContextualClosure(xtree)
2472
+ && ! ctx.mode.is(Mode .Pattern )
2473
+ && ! ctx.isAfterTyper
2474
+ && ! ctx.isInlineContext
2475
+ then
2476
+ makeContextualFunction(xtree, ifpt)
2477
+ else xtree match
2478
+ case xtree : untpd.NameTree => typedNamed(xtree, pt)
2479
+ case xtree => typedUnnamed(xtree)
2480
+
2481
+ simplify(result, pt, locked)
2482
+ catch case ex : TypeError => errorTree(xtree, ex, xtree.sourcePos.focus)
2483
+ // use focussed sourcePos since tree might be a large definition
2484
+ // and a large error span would hide all errors in interior.
2485
+ // TODO: Not clear that hiding is what we want, actually
2481
2486
}
2482
2487
}
2483
2488
@@ -2534,22 +2539,13 @@ class Typer extends Namer
2534
2539
trace(i " typing $tree, pt = $pt" , typr, show = true ) {
2535
2540
record(s " typed $getClass" )
2536
2541
record(" typed total" )
2537
- if ( ctx.phase.isTyper)
2542
+ if ctx.phase.isTyper then
2538
2543
assertPositioned(tree)
2539
- if ( tree.source != ctx.source && tree.source.exists)
2544
+ if tree.source != ctx.source && tree.source.exists then
2540
2545
typed(tree, pt, locked)(using ctx.withSource(tree.source))
2541
- else
2542
- try
2543
- if ctx.run.isCancelled then tree.withType(WildcardType )
2544
- else adapt(typedUnadapted(tree, pt, locked), pt, locked)
2545
- catch {
2546
- case ex : TypeError =>
2547
- errorTree(tree, ex, tree.sourcePos.focus)
2548
- // This uses tree.span.focus instead of the default tree.span, because:
2549
- // - since tree can be a top-level definition, tree.span can point to the whole definition
2550
- // - that would in turn hide all other type errors inside tree.
2551
- // TODO: might be even better to store positions inside TypeErrors.
2552
- }
2546
+ else if ctx.run.isCancelled then
2547
+ tree.withType(WildcardType )
2548
+ else adapt(typedUnadapted(tree, pt, locked), pt, locked)
2553
2549
}
2554
2550
2555
2551
def typed (tree : untpd.Tree , pt : Type = WildcardType )(using Context ): Tree =
@@ -2875,12 +2871,13 @@ class Typer extends Namer
2875
2871
* If all this fails, error
2876
2872
* Parameters as for `typedUnadapted`.
2877
2873
*/
2878
- def adapt (tree : Tree , pt : Type , locked : TypeVars , tryGadtHealing : Boolean = true )(using Context ): Tree = {
2879
- trace(i " adapting $tree to $pt ${if (tryGadtHealing) " " else " (tryGadtHealing=false)" }\n " , typr, show = true ) {
2880
- record(" adapt" )
2881
- adapt1(tree, pt, locked, tryGadtHealing)
2882
- }
2883
- }
2874
+ def adapt (tree : Tree , pt : Type , locked : TypeVars , tryGadtHealing : Boolean = true )(using Context ): Tree =
2875
+ try
2876
+ trace(i " adapting $tree to $pt ${if (tryGadtHealing) " " else " (tryGadtHealing=false)" }\n " , typr, show = true ) {
2877
+ record(" adapt" )
2878
+ adapt1(tree, pt, locked, tryGadtHealing)
2879
+ }
2880
+ catch case ex : TypeError => errorTree(tree, ex, tree.sourcePos.focus)
2884
2881
2885
2882
final def adapt (tree : Tree , pt : Type )(using Context ): Tree =
2886
2883
adapt(tree, pt, ctx.typerState.ownedVars)
0 commit comments