More fixes for tracking Java sources.

git-svn-id: https://simple-build-tool.googlecode.com/svn/trunk@894 d89573ee-9141-11dd-94d4-bdf5e562f29c
This commit is contained in:
dmharrah 2009-07-27 15:13:55 +00:00
parent dd32ac75da
commit 3cd6f75b4a
3 changed files with 21 additions and 14 deletions

View File

@ -797,7 +797,7 @@ object FileUtilities
def classLocation(cl: Class[_]): URL =
{
val codeSource = cl.getProtectionDomain.getCodeSource
if(codeSource == null) null // TODO: return something nicer, probably the location of rt.jar
if(codeSource == null) error("No class location for " + cl)
else codeSource.getLocation
}
def classLocationFile(cl: Class[_]): File = toFile(classLocation(cl))

View File

@ -51,25 +51,27 @@ object Analyze
Control.trapAndLog(log)
{
val clazz = Class.forName(tpe, false, loader)
val file = FileUtilities.classLocationFile(clazz)
if(file.isDirectory)
for(file <- Control.convertException(FileUtilities.classLocationFile(clazz)).right)
{
val resolved = resolveClassFile(file, tpe)
require(resolved.exists, "Resolved class file " + resolved + " did not exist")
val resolvedPath = Path.fromFile(resolved)
if(Path.fromFile(file) == outputDirectory)
if(file.isDirectory)
{
productToSource.get(resolvedPath) match
val resolved = resolveClassFile(file, tpe)
assume(resolved.exists, "Resolved class file " + resolved + " from " + source + " did not exist")
val resolvedPath = Path.fromFile(resolved)
if(Path.fromFile(file) == outputDirectory)
{
case Some(dependsOn) => analysis.sourceDependency(dependsOn, source)
case None => analysis.productDependency(resolvedPath, source)
productToSource.get(resolvedPath) match
{
case Some(dependsOn) => analysis.sourceDependency(dependsOn, source)
case None => analysis.productDependency(resolvedPath, source)
}
}
else
analysis.classDependency(resolved, source)
}
else
analysis.classDependency(resolved, source)
analysis.jarDependency(file, source)
}
else
analysis.jarDependency(file, source)
}
}

View File

@ -88,7 +88,12 @@ object Parser
constants.flatMap { constant =>
constant.tag match
{
case ConstantClass => slashesToDots(toUTF8(constant.nameIndex)) :: Nil
case ConstantClass =>
val name = toUTF8(constant.nameIndex)
if(name.startsWith("["))
descriptorToTypes(Some(name))
else
slashesToDots(name) :: Nil
case _ => Nil
}
}