Skip to content

Commit ffa0a48

Browse files
committed
Refactoring tryPromote
1 parent 870977a commit ffa0a48

File tree

1 file changed

+23
-26
lines changed

1 file changed

+23
-26
lines changed

compiler/src/dotty/tools/dotc/transform/init/Semantic.scala

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ class Semantic {
574574
val res = withEnv(env) { eval(body, thisV, klass) }
575575
val errors2 = res.value.promote(msg, source)
576576
if (res.errors.nonEmpty || errors2.nonEmpty)
577-
UnsafePromotion(msg, source, trace.toVector, res.errors ++ errors2) :: Nil
577+
UnsafePromotion(msg, source, trace.toVector, (res.errors ++ errors2).head) :: Nil
578578
else
579579
promoted.add(fun)
580580
Nil
@@ -607,37 +607,34 @@ class Semantic {
607607
if classRef.memberClasses.nonEmpty || !warm.isFullyFilled then
608608
return PromoteError(msg, source, trace.toVector) :: Nil
609609

610-
val fields = classRef.fields
611-
val methods = classRef.membersBasedOnFlags(Flags.Method, Flags.Deferred | Flags.Accessor)
612610
val buffer = new mutable.ArrayBuffer[Error]
613611

614-
fields.exists { denot =>
615-
val f = denot.symbol
616-
if !f.isOneOf(Flags.Deferred | Flags.Private | Flags.Protected) && f.hasSource then
617-
val trace2 = trace.add(f.defTree)
618-
val res = warm.select(f, source)
619-
locally {
620-
given Trace = trace2
621-
buffer ++= res.ensureHot(msg, source).errors
612+
warm.klass.baseClasses.exists { klass =>
613+
klass.hasSource && klass.info.decls.exists { member =>
614+
if member.isOneOf(Flags.Method | Flags.Lazy | Flags.Deferred) then {
615+
if !member.isConstructor && member.hasSource then
616+
val trace2 = trace.add(member.defTree)
617+
locally {
618+
given Trace = trace2
619+
val args = member.info.paramInfoss.flatten.map(_ => ArgInfo(Hot, EmptyTree))
620+
val res = warm.call(member, args, superType = NoType, source = source)
621+
buffer ++= res.ensureHot(msg, source).errors
622+
}
623+
} else if !member.isType then {
624+
if !member.isOneOf(Flags.Deferred | Flags.Private | Flags.Protected) && member.hasSource then
625+
val trace2 = trace.add(member.defTree)
626+
val res = warm.select(member, source)
627+
locally {
628+
given Trace = trace2
629+
buffer ++= res.ensureHot(msg, source).errors
630+
}
622631
}
623-
buffer.nonEmpty
624-
}
625-
626-
buffer.nonEmpty || methods.exists { denot =>
627-
val m = denot.symbol
628-
if !m.isConstructor && m.hasSource then
629-
val trace2 = trace.add(m.defTree)
630-
locally {
631-
given Trace = trace2
632-
val args = m.info.paramInfoss.flatten.map(_ => ArgInfo(Hot, EmptyTree))
633-
val res = warm.call(m, args, superType = NoType, source = source)
634-
buffer ++= res.ensureHot(msg, source).errors
635-
}
636-
buffer.nonEmpty
632+
buffer.nonEmpty
633+
}
637634
}
638635

639636
if buffer.isEmpty then Nil
640-
else UnsafePromotion(msg, source, trace.toVector, buffer.toList) :: Nil
637+
else UnsafePromotion(msg, source, trace.toVector, buffer(0)) :: Nil
641638
}
642639

643640
end extension

0 commit comments

Comments
 (0)