diff --git a/util/io/src/main/scala/sbt/IO.scala b/util/io/src/main/scala/sbt/IO.scala index 64e515b97..407cde6ce 100644 --- a/util/io/src/main/scala/sbt/IO.scala +++ b/util/io/src/main/scala/sbt/IO.scala @@ -44,10 +44,11 @@ object IO { if (codeSource ne null) { codeSource.getLocation } else { - Option(ClassLoader.getSystemClassLoader.getResource(classfilePathForClassname(cl.getName))) + // NB: this assumes that System-class-loaded classes are located in jars, and thus relies on + // uses forward-slash-separated paths and `urlAsFile`'s truncation to the containing jar file + val clsfile = s"${cl.getName.replace('.', '/')}.class" + Option(ClassLoader.getSystemClassLoader.getResource(clsfile)) .flatMap { - // TODO: assuming that System-class-loaded classes are located in jars, which - // will cause this method to truncate to the jar urlAsFile }.getOrElse { sys.error("No class location for " + cl) @@ -96,12 +97,6 @@ object IO { case _ => None } - /** - * @return The path for the given classname. - * - * TODO: crossplatform - */ - def classfilePathForClassname(clsname: String): String = s"${clsname.replace('.', '/')}.class" private[this] def uriToFile(uriString: String): File = { val uri = new URI(uriString) diff --git a/util/io/src/test/scala/CopySpec.scala b/util/io/src/test/scala/sbt/CopySpec.scala similarity index 100% rename from util/io/src/test/scala/CopySpec.scala rename to util/io/src/test/scala/sbt/CopySpec.scala diff --git a/util/io/src/test/scala/FileUtilitiesSpecification.scala b/util/io/src/test/scala/sbt/FileUtilitiesSpecification.scala similarity index 100% rename from util/io/src/test/scala/FileUtilitiesSpecification.scala rename to util/io/src/test/scala/sbt/FileUtilitiesSpecification.scala diff --git a/util/io/src/test/scala/sbt/IOSpecification.scala b/util/io/src/test/scala/sbt/IOSpecification.scala new file mode 100644 index 000000000..ccffdc5c2 --- /dev/null +++ b/util/io/src/test/scala/sbt/IOSpecification.scala @@ -0,0 +1,28 @@ +/* sbt -- Simple Build Tool + * Copyright 2008 Mark Harrah */ + +package sbt + +import util.Try + +import org.scalacheck._ +import Prop._ + +object IOSpecification extends Properties("IO") { + property("classLocation able to determine containing directories") = + Prop.forAll(classes) { (c: Class[_]) => + Try(IO.classLocationFile(c)).toOption.exists { + case jar if jar.getName.endsWith(".jar") => jar.isFile + case dir => dir.isDirectory + } + } + + implicit def classes: Gen[Class[_]] = + Gen.oneOf( + this.getClass, + classOf[java.lang.Integer], + classOf[String], + classOf[Thread], + classOf[Properties] + ) +} diff --git a/util/io/src/test/scala/NameFilterSpecification.scala b/util/io/src/test/scala/sbt/NameFilterSpecification.scala similarity index 100% rename from util/io/src/test/scala/NameFilterSpecification.scala rename to util/io/src/test/scala/sbt/NameFilterSpecification.scala diff --git a/util/io/src/test/scala/RichURISpecification.scala b/util/io/src/test/scala/sbt/RichURISpecification.scala similarity index 100% rename from util/io/src/test/scala/RichURISpecification.scala rename to util/io/src/test/scala/sbt/RichURISpecification.scala diff --git a/util/io/src/test/scala/StashSpec.scala b/util/io/src/test/scala/sbt/StashSpec.scala similarity index 100% rename from util/io/src/test/scala/StashSpec.scala rename to util/io/src/test/scala/sbt/StashSpec.scala diff --git a/util/io/src/test/scala/WithFiles.scala b/util/io/src/test/scala/sbt/WithFiles.scala similarity index 100% rename from util/io/src/test/scala/WithFiles.scala rename to util/io/src/test/scala/sbt/WithFiles.scala