Skip to content

Commit 8fcb94e

Browse files
committed
Use a fast path when looking up trait setter getters.
1 parent 0d9e3fc commit 8fcb94e

File tree

2 files changed

+16
-12
lines changed

2 files changed

+16
-12
lines changed

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

+3-7
Original file line numberDiff line numberDiff line change
@@ -259,13 +259,9 @@ object NameOps {
259259
def setterName: TermName = name.exclude(FieldName) ++ str.SETTER_SUFFIX
260260

261261
def getterName: TermName =
262-
if name.is(TraitSetterName) then
263-
val TraitSetterName(_, original) = name
264-
original.getterName
265-
else
266-
name.exclude(FieldName).mapLast(n =>
267-
if (n.endsWith(str.SETTER_SUFFIX)) n.take(n.length - str.SETTER_SUFFIX.length).asSimpleName
268-
else n)
262+
name.exclude(FieldName).mapLast(n =>
263+
if (n.endsWith(str.SETTER_SUFFIX)) n.take(n.length - str.SETTER_SUFFIX.length).asSimpleName
264+
else n)
269265

270266
def fieldName: TermName =
271267
if (name.isSetterName)

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

+13-5
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,20 @@ class Memoize extends MiniPhase with IdentityDenotTransformer { thisPhase =>
117117

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

127135
if (sym.is(Accessor, butNot = NoFieldNeeded)
128136
&& (!sym.name.is(TraitSetterName) || traitSetterGetter.is(Accessor, butNot = NoFieldNeeded))) {

0 commit comments

Comments
 (0)