diff --git a/compiler/src/dotty/tools/dotc/typer/Typer.scala b/compiler/src/dotty/tools/dotc/typer/Typer.scala index f414c0aadf3a..3099660b951c 100644 --- a/compiler/src/dotty/tools/dotc/typer/Typer.scala +++ b/compiler/src/dotty/tools/dotc/typer/Typer.scala @@ -503,15 +503,16 @@ class Typer extends Namer // Convert a reference `f` to an extension method select `p.f`, where // `p` is the closest enclosing extension parameter, or else convert to `this.f`. val xmethod = ctx.owner.enclosingExtensionMethod - val qualifier = - if xmethod.exists then untpd.ref(xmethod.extensionParam.termRef) - else untpd.This(untpd.EmptyTypeIdent) - val selection = untpd.cpy.Select(tree)(qualifier, name) - val result = tryEither(typed(selection, pt))((_, _) => fail) - def canAccessUnqualified(sym: Symbol) = - sym.is(ExtensionMethod) && (sym.extensionParam.span == xmethod.extensionParam.span) - if !xmethod.exists || result.tpe.isError || canAccessUnqualified(result.symbol) then - result + if xmethod.exists then + val qualifier = untpd.ref(xmethod.extensionParam.termRef) + val selection = untpd.cpy.Select(tree)(qualifier, name) + val result = tryEither(typed(selection, pt))((_, _) => fail) + def canAccessUnqualified(sym: Symbol) = + sym.is(ExtensionMethod) && (sym.extensionParam.span == xmethod.extensionParam.span) + if result.tpe.isError || canAccessUnqualified(result.symbol) then + result + else + fail else fail else diff --git a/tests/bench/FindRef.scala b/tests/bench/FindRef.scala new file mode 100644 index 000000000000..07db87f577ff --- /dev/null +++ b/tests/bench/FindRef.scala @@ -0,0 +1,11 @@ +class MyInt(val x: Int) { + def eq(that: MyInt): Boolean = this.x == that.x +} + +class Test { + def foo(x: MyInt, y: MyInt): Boolean = x.eq(y) + + val a = MyInt(2) + val b = MyInt(3) + foo(a, b) +} \ No newline at end of file