Skip to content

Commit ce699fc

Browse files
committed
Fix FromTasty not loading modules
1 parent 0b4e36f commit ce699fc

File tree

4 files changed

+37
-30
lines changed

4 files changed

+37
-30
lines changed

compiler/src/dotty/tools/dotc/FromTasty.scala

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ import SymDenotations._
1212
import typer.FrontEnd
1313
import Phases.Phase
1414
import util._
15-
import reporting.Reporter
1615
import Decorators._
16+
import dotty.tools.dotc.ast.tpd
17+
import dotty.tools.dotc.core._
18+
import dotty.tools.dotc.core.Names._
19+
import dotty.tools.dotc.core.NameOps._
1720
import dotty.tools.dotc.transform.Pickler
18-
import tasty.DottyUnpickler
19-
import ast.tpd._
20-
import NameKinds.QualifiedName
2121

2222
/** Compiler for TASTY files.
2323
* Usage:
@@ -65,36 +65,44 @@ object FromTasty extends Driver {
6565
override def isTyper = false
6666

6767
override def runOn(units: List[CompilationUnit])(implicit ctx: Context): List[CompilationUnit] =
68-
units.map(readTASTY)
68+
units.flatMap(readTASTY)
6969

70-
def readTASTY(unit: CompilationUnit)(implicit ctx: Context): CompilationUnit = unit match {
70+
def readTASTY(unit: CompilationUnit)(implicit ctx: Context): List[CompilationUnit] = unit match {
7171
case unit: TASTYCompilationUnit =>
7272
assert(ctx.settings.YretainTrees.value)
7373
val className = unit.className.toTypeName
74-
ctx.base.staticRef(className) match {
75-
case clsd: ClassDenotation =>
76-
def cannotUnpickle(reason: String) =
77-
ctx.error(s"class $className cannot be unpickled because $reason")
78-
def tryToLoad = clsd.infoOrCompleter match {
79-
case info: ClassfileLoader =>
80-
info.load(clsd)
81-
Option(clsd.symbol.asClass.tree).orElse {
82-
cannotUnpickle(s"its class file ${info.classfile} does not have a TASTY attribute")
83-
None
84-
}
74+
val compilationUnits = List(tree(className), tree(className.moduleClassName)).flatMap {
75+
case Some((clsd, unpickled)) if !unpickled.isEmpty =>
76+
List(CompilationUnit.mkCompilationUnit(clsd, unpickled, forceTrees = true))
77+
case _ => Nil
78+
}
79+
compilationUnits
80+
}
8581

86-
case info =>
87-
cannotUnpickle(s"its info of type ${info.getClass} is not a ClassfileLoader")
82+
private def tree(className: TypeName)(implicit ctx: Context): Option[(ClassDenotation, tpd.Tree)] = {
83+
val clsd = ctx.base.staticRef(className)
84+
ctx.base.staticRef(className) match {
85+
case clsd: ClassDenotation =>
86+
def cannotUnpickle(reason: String) =
87+
ctx.error(s"class $className cannot be unpickled because $reason")
88+
def tryToLoad = clsd.infoOrCompleter match {
89+
case info: ClassfileLoader =>
90+
info.load(clsd)
91+
Option(clsd.symbol.asClass.tree).orElse {
92+
cannotUnpickle(s"its class file ${info.classfile} does not have a TASTY attribute")
8893
None
89-
}
90-
Option(clsd.symbol.asClass.tree).orElse(tryToLoad)
91-
.map(unpickled => CompilationUnit.mkCompilationUnit(clsd, unpickled, forceTrees = true))
92-
.getOrElse(unit)
94+
}
9395

94-
case _ =>
95-
ctx.error(s"class not found: $className")
96-
unit
97-
}
96+
case info =>
97+
cannotUnpickle(s"its info of type ${info.getClass} is not a ClassfileLoader")
98+
None
99+
}
100+
Option(clsd.symbol.asClass.tree).orElse(tryToLoad).map(tree => (clsd, tree))
101+
102+
case _ =>
103+
ctx.error(s"class not found: $className")
104+
None
105+
}
98106
}
99107
}
100108
}

compiler/test/dotty/tools/dotc/FromTastyTests.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ class FromTastyTests extends ParallelTesting {
3636
implicit val testGroup: TestGroup = TestGroup("runTestFromTasty")
3737
val (step1, step2) = {
3838
// compileTastyInDir("../tests/run", defaultOptions) + // FIXME
39-
compileTastyInDir("../tests/run-from-tasty", defaultOptions)
39+
compileTastyInDir("../tests/run-from-tasty", defaultOptions) +
40+
compileTasty("../tests/run/t493.scala", defaultOptions)
4041
}
4142
step1.keepOutput.checkCompile() // Compile all files to generate the class files with tasty
4243
step2.keepOutput.checkRuns() // Compile from tasty and run the result

tests/run-from-tasty/innerClass.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package foo {
66

77
}
88

9-
class Test
109
object Test {
1110
def main(args: Array[String]): Unit = {
1211
val a = new foo.A

tests/run-from-tasty/simpleClass.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package foo {
66

77
}
88

9-
class Test
109
object Test {
1110
def main(args: Array[String]): Unit = {
1211
println(new foo.A().getClass.getName)

0 commit comments

Comments
 (0)