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 {
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)
Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments