handle Java sources not compiled in Mixed configuration

This commit is contained in:
Mark Harrah 2012-04-28 18:58:38 -04:00
parent 6769c94208
commit 408d11557d
13 changed files with 57 additions and 8 deletions

View File

@ -35,17 +35,16 @@ final class Analyzer(val global: CallbackGlobal) extends Compat
// build dependencies structure
val sourceFile = unit.source.file.file
callback.beginSource(sourceFile)
println("Dependencies of " + sourceFile)
for(on <- unit.depends)
{
def binaryDependency(file: File, className: String) = callback.binaryDependency(file, className, sourceFile)
val onSource = on.sourceFile
println("\t" + on + ", src: " + onSource + ", class: " + classFile(on))
if(onSource == null)
{
classFile(on) match
{
case Some((f,className)) =>
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)
@ -84,11 +83,11 @@ final class Analyzer(val global: CallbackGlobal) extends Compat
}
private[this] final val classSeparator = '.'
private[this] def classFile(sym: Symbol): Option[(AbstractFile, String)] =
private[this] def classFile(sym: Symbol): Option[(AbstractFile, String, Boolean)] =
{
import scala.tools.nsc.symtab.Flags
val name = flatname(sym, classSeparator) + moduleSuffix(sym)
findClass(name).map(file => (file, name)) orElse {
findClass(name).map { case (file,inOut) => (file, name,inOut) } orElse {
if(isTopLevelModule(sym))
{
val linked = sym.companionClass

View File

@ -23,7 +23,7 @@ final class CompilerInterface
}
sealed abstract class CallbackGlobal(settings: Settings, reporter: reporters.Reporter) extends Global(settings, reporter) {
def callback: AnalysisCallback
def findClass(name: String): Option[AbstractFile]
def findClass(name: String): Option[(AbstractFile,Boolean)]
}
class InterfaceCompileFailed(val arguments: Array[String], val problems: Array[Problem], override val toString: String) extends xsbti.CompileFailed
@ -173,8 +173,8 @@ private final class CachedCompiler0(args: Array[String], initialLog: WeakLog) ex
override def registerTopLevelSym(sym: Symbol) = toForget += sym
def findClass(name: String): Option[AbstractFile] =
getOutputClass(name) orElse findOnClassPath(name)
def findClass(name: String): Option[(AbstractFile, Boolean)] =
getOutputClass(name).map(f => (f,true)) orElse findOnClassPath(name).map(f =>(f, false))
def getOutputClass(name: String): Option[AbstractFile] =
{

View File

@ -0,0 +1 @@
compileOrder := CompileOrder.JavaThenScala

View File

@ -0,0 +1,5 @@
package example;
public class A {
public final int x = 3;
}

View File

@ -0,0 +1,5 @@
package example;
public class A {
public final String x = "a";
}

View File

@ -0,0 +1 @@
object B

View File

@ -0,0 +1,3 @@
object B {
val x: Int = (new example.A).x
}

View File

@ -0,0 +1,3 @@
object B {
val x: String = (new example.A).x
}

View File

@ -0,0 +1,10 @@
$ copy-file changes/B0.scala B.scala
> compile
$ copy-file changes/A1.java src/main/java/example/A.java
$ copy-file changes/B1.scala B.scala
> compile
$ copy-file changes/A2.java src/main/java/example/A.java
$ copy-file changes/B2.scala B.scala
> compile

View File

@ -0,0 +1,5 @@
package example
object A {
val x: Int = green
}

View File

@ -0,0 +1,3 @@
package object example {
val green = 3
}

View File

@ -0,0 +1,3 @@
package object example {
val green = "asdf"
}

View File

@ -0,0 +1,11 @@
$ copy-file changes/package.scala src/main/scala/example/package.scala
> compile
$ copy-file changes/A.scala src/main/scala/example/A.scala
> compile
$ copy-file changes/package2.scala src/main/scala/example/package.scala
-> compile
$ copy-file changes/package.scala src/main/scala/example/package.scala
> compile