Skip to content

Commit 071acb9

Browse files
oderskymichelou
authored andcommitted
Better error message for errors arising from implicit completions
Fixes scala#11994
1 parent aacdb1b commit 071acb9

File tree

3 files changed

+37
-21
lines changed

3 files changed

+37
-21
lines changed

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

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3066,30 +3066,30 @@ class Typer extends Namer
30663066
for err <- nestedCtx.reporter.allErrors.take(1) do
30673067
rememberSearchFailure(qual,
30683068
SearchFailure(app.withType(FailedExtension(app, selectionProto, err.msg))))
3069+
3070+
// try an implicit conversion or given extension
3071+
if ctx.mode.is(Mode.ImplicitsEnabled) && !tree.name.isConstructorName && qual.tpe.isValueType then
3072+
trace(i"try insert impl on qualifier $tree $pt") {
3073+
val selProto = selectionProto
3074+
inferView(qual, selProto) match
3075+
case SearchSuccess(found, _, _, isExtension) =>
3076+
if isExtension then return found
3077+
else
3078+
checkImplicitConversionUseOK(found)
3079+
return typedSelect(tree, pt, found)
3080+
case failure: SearchFailure =>
3081+
if failure.isAmbiguous then
3082+
return (
3083+
if canDefineFurther(qual.tpe.widen) then
3084+
tryExtensionOrConversion(tree, pt, mbrProto, qual, locked, compat, privateOK)
3085+
else
3086+
err.typeMismatch(qual, selProto, failure.reason) // TODO: report NotAMember instead, but need to be aware of failure
3087+
)
3088+
rememberSearchFailure(qual, failure)
3089+
}
30693090
catch case ex: TypeError =>
30703091
rememberSearchFailure(qual,
30713092
SearchFailure(qual.withType(NestedFailure(ex.toMessage, selectionProto))))
3072-
3073-
// try an implicit conversion or given extension
3074-
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-
}
30933093
EmptyTree
30943094
end tryExtensionOrConversion
30953095

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

0 commit comments

Comments
 (0)