Skip to content

Commit d474461

Browse files
authored
Merge pull request #6141 from dotty-staging/fix-ide-mixin
Emit mixin-related methods as artifacts, mixin forwarders as bridges
2 parents c2551b9 + 6d0f9ca commit d474461

24 files changed

+301
-82
lines changed

compiler/src/dotty/tools/backend/jvm/BCodeHelpers.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,8 +388,11 @@ trait BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
388388
}
389389
debuglog(s"Potentially conflicting names for forwarders: $conflictingNames")
390390

391-
for (m <- moduleClass.info.membersBasedOnFlags(ExcludedForwarderFlags, Flag_METHOD)) {
392-
if (m.isType || m.isDeferred || (m.owner eq ObjectClass) || m.isConstructor || m.isExpanded)
391+
for (m0 <- moduleClass.info.membersBasedOnFlags(ExcludedForwarderFlags, Flag_METHOD)) {
392+
val m = if (m0.isBridge) m0.nextOverriddenSymbol else m0
393+
if (m == NoSymbol)
394+
log(s"$m0 is a bridge method that overrides nothing, something went wrong in a previous phase.")
395+
else if (m.isType || m.isDeferred || (m.owner eq ObjectClass) || m.isConstructor || m.isExpanded)
393396
debuglog(s"No forwarder for '$m' from $jclassName to '$moduleClass'")
394397
else if (conflictingNames(m.name))
395398
log(s"No forwarder for $m due to conflict with ${linkedClass.info.member(m.name)}")

compiler/src/dotty/tools/backend/jvm/BackendInterface.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ abstract class BackendInterface extends BackendInterfaceDefinitions {
537537
def companionSymbol: Symbol
538538
def moduleClass: Symbol
539539
def enclosingClassSym: Symbol
540-
540+
def nextOverriddenSymbol: Symbol
541541

542542

543543
// members

compiler/src/dotty/tools/backend/jvm/DottyBackendInterface.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
431431
val Flag_METHOD: Flags = Flags.Method.bits
432432
val ExcludedForwarderFlags: Flags = {
433433
Flags.Specialized | Flags.Lifted | Flags.Protected | Flags.JavaStatic |
434-
Flags.Bridge | Flags.Private | Flags.Macro
434+
Flags.Private | Flags.Macro
435435
}.bits
436436

437437
def isQualifierSafeToElide(qual: Tree): Boolean = tpd.isIdempotentExpr(qual)
@@ -765,6 +765,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
765765
}
766766
else sym.enclosingClass(ctx.withPhase(ctx.flattenPhase.prev))
767767
} //todo is handled specially for JavaDefined symbols in scalac
768+
def nextOverriddenSymbol: Symbol = toDenot(sym).nextOverriddenSymbol
768769

769770
// members
770771
def primaryConstructor: Symbol = toDenot(sym).primaryConstructor

compiler/src/dotty/tools/dotc/core/SymDenotations.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,15 @@ object SymDenotations {
11401140
if (!canMatchInheritedSymbols) Iterator.empty
11411141
else overriddenFromType(owner.info)
11421142

1143+
/** Equivalent to `allOverriddenSymbols.headOption.getOrElse(NoSymbol)` but more efficient. */
1144+
final def nextOverriddenSymbol(implicit ctx: Context): Symbol = {
1145+
val overridden = allOverriddenSymbols
1146+
if (overridden.hasNext)
1147+
overridden.next
1148+
else
1149+
NoSymbol
1150+
}
1151+
11431152
/** Returns all matching symbols defined in parents of the selftype. */
11441153
final def extendedOverriddenSymbols(implicit ctx: Context): Iterator[Symbol] =
11451154
if (!canMatchInheritedSymbols) Iterator.empty

compiler/src/dotty/tools/dotc/transform/Mixin.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ class Mixin extends MiniPhase with SymTransformer { thisPhase =>
262262
for (meth <- mixin.info.decls.toList if needsMixinForwarder(meth))
263263
yield {
264264
util.Stats.record("mixin forwarders")
265-
transformFollowing(polyDefDef(mkForwarderSym(meth.asTerm), forwarderRhsFn(meth)))
265+
transformFollowing(polyDefDef(mkForwarderSym(meth.asTerm, Bridge), forwarderRhsFn(meth)))
266266
}
267267

268268

compiler/src/dotty/tools/dotc/transform/MixinOps.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ class MixinOps(cls: ClassSymbol, thisPhase: DenotTransformer)(implicit ctx: Cont
1818
map(n => ctx.getClassIfDefined("org.junit." + n)).
1919
filter(_.exists)
2020

21-
def mkForwarderSym(member: TermSymbol): TermSymbol = {
21+
def mkForwarderSym(member: TermSymbol, extraFlags: FlagSet = EmptyFlags): TermSymbol = {
2222
val res = member.copy(
2323
owner = cls,
2424
name = member.name.stripScala2LocalSuffix,
25-
flags = member.flags &~ Deferred,
25+
flags = member.flags &~ Deferred | Synthetic | Artifact | extraFlags,
2626
info = cls.thisType.memberInfo(member)).enteredAfter(thisPhase).asTerm
2727
res.addAnnotations(member.annotations.filter(_.symbol != defn.TailrecAnnot))
2828
res

compiler/test/dotc/run-test-pickling.blacklist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@ derive-generic.scala
1313
deriving-interesting-prefixes.scala
1414
instances.scala
1515
instances-anonymous.scala
16+
mixin-forwarder-overload
17+
t8905

tests/run/mixin-bridge-methods.scala

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
case class Foo(x: Int)
2+
3+
trait A[X] {
4+
def concat[Dummy](suffix: Int): Dummy = ???
5+
}
6+
7+
class Bar extends A[Foo] {
8+
def concat(suffix: Int): Foo = Foo(0)
9+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
public class Test {
2+
public static void main(String[] args) {
3+
Bar bar = new Bar();
4+
Foo x = bar.concat(0);
5+
System.out.println(x);
6+
}
7+
}

0 commit comments

Comments
 (0)