File tree 2 files changed +31
-1
lines changed
compiler/src/dotty/tools/dotc/typer
2 files changed +31
-1
lines changed Original file line number Diff line number Diff line change @@ -1119,7 +1119,19 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
1119
1119
case Apply (fn, _) if fn.symbol.is(ExtensionMethod ) =>
1120
1120
def toSetter (fn : Tree ): untpd.Tree = fn match
1121
1121
case fn @ Ident (name : TermName ) =>
1122
- untpd.cpy.Ident (fn)(name.setterName)
1122
+ // We need to make sure that the prefix of this extension getter is
1123
+ // retained when we transform it into a setter. Otherwise, we could
1124
+ // end up resolving an unrelated setter from another extension. We
1125
+ // transform the `Ident` into a `Select` to ensure that the prefix
1126
+ // is retained with a `TypedSplice` (see `case Select` bellow).
1127
+ // See tests/pos/i18713.scala for an example.
1128
+ fn.tpe match
1129
+ case TermRef (qual : TermRef , _) =>
1130
+ toSetter(ref(qual).select(fn.symbol).withSpan(fn.span))
1131
+ case TermRef (qual : ThisType , _) =>
1132
+ toSetter(This (qual.cls).select(fn.symbol).withSpan(fn.span))
1133
+ case TermRef (NoPrefix , _) =>
1134
+ untpd.cpy.Ident (fn)(name.setterName)
1123
1135
case fn @ Select (qual, name : TermName ) =>
1124
1136
untpd.cpy.Select (fn)(untpd.TypedSplice (qual), name.setterName)
1125
1137
case fn @ TypeApply (fn1, targs) =>
Original file line number Diff line number Diff line change
1
+ import language .experimental .relaxedExtensionImports
2
+
3
+ class A
4
+ object AA :
5
+ extension (a : A )
6
+ def f = ???
7
+ def f_= (x : String ) = ???
8
+
9
+ object BB :
10
+ extension (b : Long )
11
+ def f = ???
12
+ def f_= (x : String ) = ???
13
+
14
+ def test (a : A ) =
15
+ import AA .*
16
+ import BB .*
17
+ a.f
18
+ a.f = " aa"
You can’t perform that action at this time.
0 commit comments