diff --git a/compile/interface/Analyzer.scala b/compile/interface/Analyzer.scala index 7cfea03bd..e20dd46cc 100644 --- a/compile/interface/Analyzer.scala +++ b/compile/interface/Analyzer.scala @@ -44,6 +44,7 @@ final class Analyzer(val global: CallbackGlobal) extends Compat classFile(on) match { case Some((f,className,inOutDir)) => + if(inOutDir && on.isJavaDefined) registerTopLevelSym(on) f match { case ze: ZipArchive#Entry => for(zip <- ze.underlyingSource; zipFile <- Option(zip.file) ) binaryDependency(zipFile, className) diff --git a/compile/interface/CompilerInterface.scala b/compile/interface/CompilerInterface.scala index bc0a3175a..41a8e5e4e 100644 --- a/compile/interface/CompilerInterface.scala +++ b/compile/interface/CompilerInterface.scala @@ -172,6 +172,7 @@ private final class CachedCompiler0(args: Array[String], initialLog: WeakLog) ex def clear() { callback0 = null + atPhase(currentRun.namerPhase) { forgetAll() } superDropRun() reporter = null } @@ -188,6 +189,21 @@ private final class CachedCompiler0(args: Array[String], initialLog: WeakLog) ex def findOnClassPath(name: String): Option[AbstractFile] = classPath.findClass(name).flatMap(_.binary.asInstanceOf[Option[AbstractFile]]) + override def registerTopLevelSym(sym: Symbol) = toForget += sym + + final def unlinkAll(m: Symbol) { + val scope = m.owner.info.decls + scope unlink m + scope unlink m.companionSymbol + } + + def forgetAll() + { + for(sym <- toForget) + unlinkAll(sym) + toForget = mutable.Set() + } + // fine-control over external changes is unimplemented: // must drop whole CachedCompiler when !changes.isEmpty def reload(changes: DependencyChanges)