Skip to content

Commit a83d436

Browse files
authored
Merge pull request #1477 from dotty-staging/fix-bootstrap-3
Fix bootstrap, take 3
2 parents dae2d64 + c9d670f commit a83d436

File tree

4 files changed

+41
-31
lines changed

4 files changed

+41
-31
lines changed

src/dotty/tools/backend/jvm/CollectSuperCalls.scala

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@ import dotty.tools.dotc.ast.tpd
44
import dotty.tools.dotc.ast.Trees._
55
import dotty.tools.dotc.core.Contexts.Context
66
import dotty.tools.dotc.core.Symbols._
7+
import dotty.tools.dotc.core.Flags.Trait
78
import dotty.tools.dotc.transform.TreeTransforms.{MiniPhaseTransform, TransformerInfo}
89

9-
/** Collect all super calls except to the parent class.
10+
/** Collect all super calls to trait members.
11+
*
12+
* For each super reference to trait member, register a call from the current class to the
13+
* owner of the referenced member.
1014
*
1115
* This information is used to know if it is safe to remove a redundant mixin class.
1216
* A redundant mixin class is one that is implemented by another mixin class. As the
@@ -20,9 +24,9 @@ class CollectSuperCalls extends MiniPhaseTransform {
2024

2125
override def transformSelect(tree: Select)(implicit ctx: Context, info: TransformerInfo): Tree = {
2226
tree.qualifier match {
23-
case Super(qual: This, mix) if mix.nonEmpty =>
24-
val classSymbol = qual.symbol.asClass.classSymbol
25-
registerSuperCall(classSymbol, tree.symbol.owner.asClass)
27+
case sup: Super =>
28+
if (tree.symbol.owner.is(Trait))
29+
registerSuperCall(ctx.owner.enclosingClass.asClass, tree.symbol.owner.asClass)
2630
case _ =>
2731
}
2832
tree

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -747,9 +747,13 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
747747
*/
748748
def superInterfaces: List[Symbol] = {
749749
val directlyInheritedTraits = decorateSymbol(sym).directlyInheritedTraits
750+
val directlyInheritedTraitsSet = directlyInheritedTraits.toSet
750751
val allBaseClasses = directlyInheritedTraits.iterator.flatMap(_.symbol.asClass.baseClasses.drop(1)).toSet
751752
val superCalls = superCallsMap.getOrElse(sym, Set.empty)
752-
directlyInheritedTraits.filter(t => !allBaseClasses(t) || superCalls(t))
753+
val additional = (superCalls -- directlyInheritedTraitsSet).filter(_.is(Flags.Trait))
754+
// if (additional.nonEmpty)
755+
// println(s"$fullName: adding supertraits $additional")
756+
directlyInheritedTraits.filter(t => !allBaseClasses(t) || superCalls(t)) ++ additional
753757
}
754758

755759
/**

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

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ trait SymDenotations { this: Context =>
4646
val initial = denot.initial
4747
val firstPhaseId = initial.validFor.firstPhaseId.max(ctx.typerPhase.id)
4848
if ((initial ne denot) || ctx.phaseId != firstPhaseId)
49-
ctx.withPhase(firstPhaseId).stillValidInOwner(initial.asSymDenotation)
49+
ctx.withPhase(firstPhaseId).stillValidInOwner(initial)
5050
else
5151
stillValidInOwner(denot)
5252
}
@@ -56,6 +56,7 @@ trait SymDenotations { this: Context =>
5656
stillValid(owner) && (
5757
!owner.isClass
5858
|| owner.isRefinementClass
59+
|| owner.is(Scala2x)
5960
|| (owner.unforcedDecls.lookupAll(denot.name) contains denot.symbol)
6061
|| denot.isSelfSym)
6162
} catch {
@@ -77,7 +78,7 @@ trait SymDenotations { this: Context =>
7778
implicit val ctx: Context = this
7879
val initial = denot.initial
7980
if ((initial ne denot) || ctx.phaseId != initial.validFor.firstPhaseId) {
80-
ctx.withPhase(initial.validFor.firstPhaseId).traceInvalid(initial.asSymDenotation)
81+
ctx.withPhase(initial.validFor.firstPhaseId).traceInvalid(initial)
8182
} else try {
8283
val owner = denot.owner.denot
8384
if (!traceInvalid(owner)) explainSym("owner is invalid")
@@ -346,14 +347,14 @@ object SymDenotations {
346347
else {
347348
def legalize(name: Name): Name = // JVM method names may not contain `<' or `>' characters
348349
if (is(Method)) name.replace('<', '(').replace('>', ')') else name
349-
legalize(name.expandedName(initial.asSymDenotation.owner))
350+
legalize(name.expandedName(initial.owner))
350351
}
351352
// need to use initial owner to disambiguate, as multiple private symbols with the same name
352353
// might have been moved from different origins into the same class
353354

354355
/** The name with which the denoting symbol was created */
355356
final def originalName(implicit ctx: Context) = {
356-
val d = initial.asSymDenotation
357+
val d = initial
357358
if (d is ExpandedName) d.name.unexpandedName else d.name // !!!DEBUG, was: effectiveName
358359
}
359360

@@ -435,13 +436,13 @@ object SymDenotations {
435436

436437
/** Is this symbol an anonymous class? */
437438
final def isAnonymousClass(implicit ctx: Context): Boolean =
438-
isClass && (initial.asSymDenotation.name startsWith tpnme.ANON_CLASS)
439+
isClass && (initial.name startsWith tpnme.ANON_CLASS)
439440

440441
final def isAnonymousFunction(implicit ctx: Context) =
441-
this.symbol.is(Method) && (initial.asSymDenotation.name startsWith nme.ANON_FUN)
442+
this.symbol.is(Method) && (initial.name startsWith nme.ANON_FUN)
442443

443444
final def isAnonymousModuleVal(implicit ctx: Context) =
444-
this.symbol.is(ModuleVal) && (initial.asSymDenotation.name startsWith nme.ANON_CLASS)
445+
this.symbol.is(ModuleVal) && (initial.name startsWith nme.ANON_CLASS)
445446

446447
/** Is this a companion class method or companion object method?
447448
* These methods are generated by Symbols#synthesizeCompanionMethod
@@ -606,7 +607,7 @@ object SymDenotations {
606607

607608
/** Is this symbol a class that extends `AnyVal`? */
608609
final def isValueClass(implicit ctx: Context): Boolean = {
609-
val di = this.initial.asSymDenotation
610+
val di = initial
610611
di.isClass &&
611612
di.derivesFrom(defn.AnyValClass)(ctx.withPhase(di.validFor.firstPhaseId))
612613
// We call derivesFrom at the initial phase both because AnyVal does not exist
@@ -1164,6 +1165,8 @@ object SymDenotations {
11641165
d
11651166
}
11661167

1168+
override def initial: SymDenotation = super.initial.asSymDenotation
1169+
11671170
/** Install this denotation as the result of the given denotation transformer. */
11681171
override def installAfter(phase: DenotTransformer)(implicit ctx: Context): Unit =
11691172
super.installAfter(phase)
@@ -1226,10 +1229,13 @@ object SymDenotations {
12261229
if (myTypeParams == null)
12271230
myTypeParams =
12281231
if (ctx.erasedTypes || is(Module)) Nil // fast return for modules to avoid scanning package decls
1229-
else if (this ne initial) initial.asSymDenotation.typeParams
1230-
else infoOrCompleter match {
1231-
case info: TypeParamsCompleter => info.completerTypeParams(symbol)
1232-
case _ => typeParamsFromDecls
1232+
else {
1233+
val di = initial
1234+
if (this ne di) di.typeParams
1235+
else infoOrCompleter match {
1236+
case info: TypeParamsCompleter => info.completerTypeParams(symbol)
1237+
case _ => typeParamsFromDecls
1238+
}
12331239
}
12341240
myTypeParams
12351241
}

src/dotty/tools/dotc/transform/SelectStatic.scala

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,21 @@ class SelectStatic extends MiniPhaseTransform with IdentityDenotTransformer { th
1919
import ast.tpd._
2020

2121
override def phaseName: String = "selectStatic"
22-
private val isPackage = FlagConjunction(PackageCreationFlags.bits)
2322

2423
override def transformSelect(tree: tpd.Select)(implicit ctx: Context, info: TransformerInfo): tpd.Tree = {
2524
val sym = tree.symbol
26-
val r1 =
27-
if (!sym.is(isPackage) && !sym.maybeOwner.is(isPackage) &&
28-
(
29-
((sym is Flags.Module) && sym.maybeOwner.isStaticOwner) ||
30-
(sym is Flags.JavaStatic) ||
31-
(sym.maybeOwner is Flags.ImplClass) ||
32-
sym.hasAnnotation(ctx.definitions.ScalaStaticAnnot)
33-
)
34-
)
35-
if (!tree.qualifier.symbol.is(JavaModule) && !tree.qualifier.isType)
36-
Block(List(tree.qualifier), ref(sym))
37-
else tree
25+
def isStaticMember =
26+
(sym is Flags.Module) && sym.initial.maybeOwner.initial.isStaticOwner ||
27+
(sym is Flags.JavaStatic) ||
28+
(sym.maybeOwner is Flags.ImplClass) ||
29+
sym.hasAnnotation(ctx.definitions.ScalaStaticAnnot)
30+
val isStaticRef = !sym.is(Package) && !sym.maybeOwner.is(Package) && isStaticMember
31+
val tree1 =
32+
if (isStaticRef && !tree.qualifier.symbol.is(JavaModule) && !tree.qualifier.isType)
33+
Block(List(tree.qualifier), ref(sym))
3834
else tree
3935

40-
normalize(r1)
36+
normalize(tree1)
4137
}
4238

4339
private def normalize(t: Tree)(implicit ctx: Context) = t match {

0 commit comments

Comments
 (0)