Skip to content

Commit ca71de8

Browse files
authored
Merge pull request #10584 from dotty-staging/fix-#10285
Fix #10285: Fix scheme for handling setter names
2 parents 5b3a98a + edc0a23 commit ca71de8

File tree

5 files changed

+42
-9
lines changed

5 files changed

+42
-9
lines changed

compiler/src/dotty/tools/dotc/core/NameKinds.scala

+1
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,7 @@ object NameKinds {
367367
val ModuleClassName: SuffixNameKind = new SuffixNameKind(OBJECTCLASS, "$", optInfoString = "ModuleClass")
368368
val ImplMethName: SuffixNameKind = new SuffixNameKind(IMPLMETH, "$")
369369
val AdaptedClosureName: SuffixNameKind = new SuffixNameKind(ADAPTEDCLOSURE, "$adapted") { override def definesNewName = true }
370+
val SyntheticSetterName: SuffixNameKind = new SuffixNameKind(SETTER, "_$eq")
370371

371372
/** A name together with a signature. Used in Tasty trees. */
372373
object SignedName extends NameKind(SIGNED) {

compiler/src/dotty/tools/dotc/core/NameOps.scala

+13-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
package dotty.tools.dotc
1+
package dotty.tools
2+
package dotc
23
package core
34

45
import java.security.MessageDigest
@@ -9,7 +10,7 @@ import Names._, StdNames._, Contexts._, Symbols._, Flags._, NameKinds._, Types._
910
import util.Chars.{isOperatorPart, digit2int}
1011
import Definitions._
1112
import nme._
12-
import Decorators.concat
13+
import Decorators._
1314

1415
object NameOps {
1516

@@ -69,7 +70,7 @@ object NameOps {
6970
def isLocalDummyName: Boolean = name startsWith str.LOCALDUMMY_PREFIX
7071
def isReplWrapperName: Boolean = name.toString contains str.REPL_SESSION_LINE
7172
def isReplAssignName: Boolean = name.toString contains str.REPL_ASSIGN_SUFFIX
72-
def isSetterName: Boolean = name endsWith str.SETTER_SUFFIX
73+
def isSetterName: Boolean = name.endsWith(str.SETTER_SUFFIX) || name.is(SyntheticSetterName)
7374
def isScala2LocalSuffix: Boolean = testSimple(_.endsWith(" "))
7475
def isSelectorName: Boolean = testSimple(n => n.startsWith("_") && n.drop(1).forall(_.isDigit))
7576
def isAnonymousClassName: Boolean = name.startsWith(str.ANON_CLASS)
@@ -347,17 +348,21 @@ object NameOps {
347348

348349
def setterName: TermName = name.exclude(FieldName) ++ str.SETTER_SUFFIX
349350

351+
def syntheticSetterName = SyntheticSetterName(name.exclude(FieldName))
352+
350353
def getterName: TermName =
351-
name.exclude(FieldName).mapLast(n =>
354+
val name1 = name.exclude(FieldName)
355+
if name1.is(SyntheticSetterName) then name1.exclude(SyntheticSetterName)
356+
else name1.mapLast(n =>
352357
if (n.endsWith(str.SETTER_SUFFIX)) n.take(n.length - str.SETTER_SUFFIX.length).asSimpleName
353358
else n)
354359

355360
def fieldName: TermName =
356361
if (name.isSetterName)
357-
if (name.is(TraitSetterName)) {
358-
val TraitSetterName(_, original) = name
359-
original.fieldName
360-
}
362+
if name.is(SyntheticSetterName) then
363+
name.exclude(SyntheticSetterName)
364+
.replace { case TraitSetterName(_, original) => original }
365+
.fieldName
361366
else getterName.fieldName
362367
else FieldName(name.toSimpleName)
363368

compiler/src/dotty/tools/dotc/core/NameTags.scala

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ object NameTags extends TastyFormat.NameTags {
2929

3030
final val PARAMACC = 33 // Used for a private parameter alias
3131

32+
final val SETTER = 34 // A synthesized += suffix.
33+
3234
def nameTagToString(tag: Int): String = tag match {
3335
case UTF8 => "UTF8"
3436
case QUALIFIED => "QUALIFIED"

compiler/src/dotty/tools/dotc/transform/Mixin.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ object Mixin {
2525
def traitSetterName(getter: TermSymbol)(using Context): TermName =
2626
getter.ensureNotPrivate.name
2727
.expandedName(getter.owner, TraitSetterName)
28-
.asTermName.setterName
28+
.asTermName.syntheticSetterName
2929
}
3030

3131
/** This phase performs the following transformations:

tests/run/i10285.scala

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
trait Companion {
2+
3+
trait AbstractFoo {
4+
val a0 = 1
5+
private val b0 = 2
6+
def b1 = b0
7+
val (a, b) = {
8+
val av = 1
9+
val bv = 2
10+
(av, bv)
11+
}
12+
}
13+
}
14+
15+
object Bar extends Companion {
16+
class FooImpl extends AbstractFoo
17+
val foo = new FooImpl()
18+
}
19+
20+
object Test {
21+
val foo = new Bar.FooImpl
22+
def main(args: Array[String]): Unit =
23+
assert(Bar.foo.a0 + Bar.foo.b1 == 3)
24+
assert(Bar.foo.a + Bar.foo.b == 3)
25+
}

0 commit comments

Comments
 (0)