File tree Expand file tree Collapse file tree 2 files changed +16
-12
lines changed
compiler/src/dotty/tools/dotc Expand file tree Collapse file tree 2 files changed +16
-12
lines changed Original file line number Diff line number Diff 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)
Original file line number Diff line number Diff 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 ))) {
You can’t perform that action at this time.
0 commit comments