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 @@ -274,13 +274,9 @@ object NameOps {
274
274
def setterName : TermName = name.exclude(FieldName ) ++ str.SETTER_SUFFIX
275
275
276
276
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)
284
280
285
281
def fieldName : TermName =
286
282
if (name.isSetterName)
Original file line number Diff line number Diff line change @@ -120,12 +120,20 @@ class Memoize extends MiniPhase with IdentityDenotTransformer { thisPhase =>
120
120
121
121
def traitSetterGetter : Symbol =
122
122
/* 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.
124
126
*/
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
+ }
129
137
130
138
val constantFinalVal = sym.isAllOf(Accessor | Final , butNot = Mutable ) && tree.rhs.isInstanceOf [Literal ]
131
139
You can’t perform that action at this time.
0 commit comments