Skip to content

Commit 7ca45d2

Browse files
authored
Merge pull request #12002 from dotty-staging/fix-11994
Better error message for errors arising from implicit completions
2 parents 88389fc + 9c1647b commit 7ca45d2

File tree

4 files changed

+48
-21
lines changed

4 files changed

+48
-21
lines changed

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3056,6 +3056,10 @@ class Typer extends Namer
30563056
case _ =>
30573057
EmptyTree
30583058

3059+
def nestedFailure(ex: TypeError) =
3060+
rememberSearchFailure(qual,
3061+
SearchFailure(qual.withType(NestedFailure(ex.toMessage, selectionProto))))
3062+
30593063
// try an extension method in scope
30603064
try
30613065
val nestedCtx = ctx.fresh.setNewTyperState()
@@ -3066,30 +3070,31 @@ class Typer extends Namer
30663070
for err <- nestedCtx.reporter.allErrors.take(1) do
30673071
rememberSearchFailure(qual,
30683072
SearchFailure(app.withType(FailedExtension(app, selectionProto, err.msg))))
3069-
catch case ex: TypeError =>
3070-
rememberSearchFailure(qual,
3071-
SearchFailure(qual.withType(NestedFailure(ex.toMessage, selectionProto))))
3073+
catch case ex: TypeError => nestedFailure(ex)
30723074

30733075
// try an implicit conversion or given extension
30743076
if ctx.mode.is(Mode.ImplicitsEnabled) && !tree.name.isConstructorName && qual.tpe.isValueType then
3075-
trace(i"try insert impl on qualifier $tree $pt") {
3076-
val selProto = selectionProto
3077-
inferView(qual, selProto) match
3078-
case SearchSuccess(found, _, _, isExtension) =>
3079-
if isExtension then return found
3080-
else
3081-
checkImplicitConversionUseOK(found)
3082-
return typedSelect(tree, pt, found)
3083-
case failure: SearchFailure =>
3084-
if failure.isAmbiguous then
3085-
return (
3086-
if canDefineFurther(qual.tpe.widen) then
3087-
tryExtensionOrConversion(tree, pt, mbrProto, qual, locked, compat, privateOK)
3088-
else
3089-
err.typeMismatch(qual, selProto, failure.reason) // TODO: report NotAMember instead, but need to be aware of failure
3090-
)
3091-
rememberSearchFailure(qual, failure)
3092-
}
3077+
try
3078+
trace(i"try insert impl on qualifier $tree $pt") {
3079+
val selProto = selectionProto
3080+
inferView(qual, selProto) match
3081+
case SearchSuccess(found, _, _, isExtension) =>
3082+
if isExtension then return found
3083+
else
3084+
checkImplicitConversionUseOK(found)
3085+
return typedSelect(tree, pt, found)
3086+
case failure: SearchFailure =>
3087+
if failure.isAmbiguous then
3088+
return (
3089+
if canDefineFurther(qual.tpe.widen) then
3090+
tryExtensionOrConversion(tree, pt, mbrProto, qual, locked, compat, privateOK)
3091+
else
3092+
err.typeMismatch(qual, selProto, failure.reason) // TODO: report NotAMember instead, but need to be aware of failure
3093+
)
3094+
rememberSearchFailure(qual, failure)
3095+
}
3096+
catch case ex: TypeError => nestedFailure(ex)
3097+
30933098
EmptyTree
30943099
end tryExtensionOrConversion
30953100

tests/neg/i11994.check

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-- [E008] Not Found Error: tests/neg/i11994.scala:1:28 -----------------------------------------------------------------
2+
1 |implicit def foo[T <: Tuple.meow]: Unit = ??? // error
3+
| ^^^^^^^^^^
4+
| type meow is not a member of object Tuple.
5+
| Extension methods were tried, but the search failed with:
6+
|
7+
| Cyclic reference involving method foo
8+
-- [E008] Not Found Error: tests/neg/i11994.scala:2:18 -----------------------------------------------------------------
9+
2 |given [T <: Tuple.meow]: Unit = ??? // error
10+
| ^^^^^^^^^^
11+
| type meow is not a member of object Tuple.
12+
| Extension methods were tried, but the search failed with:
13+
|
14+
| Cyclic reference involving method given_Unit

tests/neg/i11994.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
implicit def foo[T <: Tuple.meow]: Unit = ??? // error
2+
given [T <: Tuple.meow]: Unit = ??? // error

tests/pos/i11994.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class WeirdNumber(v: Double) extends java.lang.Number {
2+
override def doubleValue = v
3+
override def intValue = v.intValue
4+
override def longValue = v.longValue
5+
override def floatValue = v.floatValue
6+
}

0 commit comments

Comments
 (0)