File tree 2 files changed +16
-12
lines changed
compiler/src/dotty/tools/dotc
2 files changed +16
-12
lines changed Original file line number Diff line number Diff line change @@ -259,13 +259,9 @@ object NameOps {
259
259
def setterName : TermName = name.exclude(FieldName ) ++ str.SETTER_SUFFIX
260
260
261
261
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)
269
265
270
266
def fieldName : TermName =
271
267
if (name.isSetterName)
Original file line number Diff line number Diff line change @@ -117,12 +117,20 @@ class Memoize extends MiniPhase with IdentityDenotTransformer { thisPhase =>
117
117
118
118
def traitSetterGetter : Symbol =
119
119
/* 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.
121
123
*/
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
+ }
126
134
127
135
if (sym.is(Accessor , butNot = NoFieldNeeded )
128
136
&& (! sym.name.is(TraitSetterName ) || traitSetterGetter.is(Accessor , butNot = NoFieldNeeded ))) {
You can’t perform that action at this time.
0 commit comments