Skip to content

Commit ce4f7ba

Browse files
committed
Use a fast path when looking up trait setter getters.
1 parent de5df36 commit ce4f7ba

File tree

2 files changed

+16
-12
lines changed

2 files changed

+16
-12
lines changed

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -274,13 +274,9 @@ object NameOps {
274274
def setterName: TermName = name.exclude(FieldName) ++ str.SETTER_SUFFIX
275275

276276
def getterName: TermName =
277-
if name.is(TraitSetterName) then
278-
val TraitSetterName(_, original) = name
279-
original.getterName
280-
else
281-
name.exclude(FieldName).mapLast(n =>
282-
if (n.endsWith(str.SETTER_SUFFIX)) n.take(n.length - str.SETTER_SUFFIX.length).asSimpleName
283-
else n)
277+
name.exclude(FieldName).mapLast(n =>
278+
if (n.endsWith(str.SETTER_SUFFIX)) n.take(n.length - str.SETTER_SUFFIX.length).asSimpleName
279+
else n)
284280

285281
def fieldName: TermName =
286282
if (name.isSetterName)

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,20 @@ class Memoize extends MiniPhase with IdentityDenotTransformer { thisPhase =>
120120

121121
def traitSetterGetter: Symbol =
122122
/* We have to compare SimpleNames here, because the setter name only
123-
* embed the original getter's simple name, not its semantic name.
123+
* embeds the original getter's simple name, not its semantic name.
124+
* To mitigate the issue, we first try a fast path where we look up the
125+
* simple name itself, which works for public fields.
124126
*/
125-
val getterSimpleName = sym.asTerm.name.getterName
126-
sym.owner.info.decls.find { getter =>
127-
getter.is(Accessor) && getter.asTerm.name.toSimpleName == getterSimpleName
128-
}
127+
val TraitSetterName(_, original) = sym.name
128+
val getterSimpleName = original.getterName
129+
val ownerInfo = sym.owner.info
130+
val fastPath = ownerInfo.decl(getterSimpleName)
131+
if fastPath.exists then
132+
fastPath.symbol
133+
else
134+
ownerInfo.decls.find { getter =>
135+
getter.is(Accessor) && getter.asTerm.name.toSimpleName == getterSimpleName
136+
}
129137

130138
val constantFinalVal = sym.isAllOf(Accessor | Final, butNot = Mutable) && tree.rhs.isInstanceOf[Literal]
131139

0 commit comments

Comments
 (0)