Skip to content

Commit 0702a5d

Browse files
committed
Remove the findClass method from ClassPath
it was dead code, and was not well defined, leading to a potential explosion of searched the more file kinds that can define classes.
1 parent 9b12e4a commit 0702a5d

8 files changed

+11
-88
lines changed

compiler/src/dotty/tools/dotc/classpath/AggregateClassPath.scala

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,6 @@ case class AggregateClassPath(aggregates: Seq[ClassPath]) extends ClassPath {
3333
packageIndex.getOrElseUpdate(pkg.dottedString, aggregates.filter(_.hasPackage(pkg)))
3434
}
3535

36-
override def findClass(className: String): Option[ClassRepresentation] = {
37-
val (pkg, _) = PackageNameUtils.separatePkgAndClassNames(className)
38-
39-
def findEntry(isSource: Boolean): Option[ClassRepresentation] =
40-
aggregatesForPackage(PackageName(pkg)).iterator.map(_.findClass(className)).collectFirst {
41-
case Some(s: SourceFileEntry) if isSource => s
42-
case Some(s: ClassFileEntry) if !isSource => s
43-
}
44-
45-
val classEntry = findEntry(isSource = false)
46-
val sourceEntry = findEntry(isSource = true)
47-
48-
(classEntry, sourceEntry) match {
49-
case (Some(c: ClassFileEntry), Some(s: SourceFileEntry)) => Some(ClassAndSourceFilesEntry(c.file, s.file))
50-
case (c @ Some(_), _) => c
51-
case (_, s) => s
52-
}
53-
}
54-
5536
override def asURLs: Seq[URL] = aggregates.flatMap(_.asURLs)
5637

5738
override def asClassPathStrings: Seq[String] = aggregates.map(_.asClassPathString).distinct

compiler/src/dotty/tools/dotc/classpath/DirectoryClassPath.scala

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -274,16 +274,12 @@ final class CtSymClassPath(ctSym: java.nio.file.Path, release: Int) extends Clas
274274
}
275275

276276
case class DirectoryClassPath(dir: JFile) extends JFileDirectoryLookup[ClassFileEntryImpl] with NoSourcePaths {
277-
override def findClass(className: String): Option[ClassRepresentation] = findClassFile(className) map ClassFileEntryImpl.apply
278277

279278
def findClassFile(className: String): Option[AbstractFile] = {
280279
val relativePath = FileUtils.dirPath(className)
281-
val tastyFile = new JFile(dir, relativePath + ".tasty")
282-
if tastyFile.exists then Some(tastyFile.toPath.toPlainFile)
283-
else
284-
val classFile = new JFile(dir, relativePath + ".class")
285-
if classFile.exists then Some(classFile.toPath.toPlainFile)
286-
else None
280+
val classFile = new JFile(dir, relativePath + ".class")
281+
if classFile.exists then Some(classFile.toPath.toPlainFile)
282+
else None
287283
}
288284

289285
protected def createFileEntry(file: AbstractFile): ClassFileEntryImpl = ClassFileEntryImpl(file)
@@ -299,16 +295,5 @@ case class DirectorySourcePath(dir: JFile) extends JFileDirectoryLookup[SourceFi
299295
protected def createFileEntry(file: AbstractFile): SourceFileEntryImpl = SourceFileEntryImpl(file)
300296
protected def isMatchingFile(f: JFile): Boolean = endsScalaOrJava(f.getName)
301297

302-
override def findClass(className: String): Option[ClassRepresentation] = findSourceFile(className) map SourceFileEntryImpl.apply
303-
304-
private def findSourceFile(className: String): Option[AbstractFile] = {
305-
val relativePath = FileUtils.dirPath(className)
306-
val sourceFile = LazyList("scala", "java")
307-
.map(ext => new JFile(dir, relativePath + "." + ext))
308-
.collectFirst { case file if file.exists() => file }
309-
310-
sourceFile.map(_.toPath.toPlainFile)
311-
}
312-
313298
private[dotty] def sources(inPackage: PackageName): Seq[SourceFileEntry] = files(inPackage)
314299
}

compiler/src/dotty/tools/dotc/classpath/VirtualDirectoryClassPath.scala

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,12 @@ case class VirtualDirectoryClassPath(dir: VirtualDirectory) extends ClassPath wi
3838
def asURLs: Seq[URL] = Seq(new URI(dir.name).toURL)
3939
def asClassPathStrings: Seq[String] = Seq(dir.path)
4040

41-
override def findClass(className: String): Option[ClassRepresentation] = findClassFile(className) map ClassFileEntryImpl.apply
42-
4341
def findClassFile(className: String): Option[AbstractFile] = {
4442
val pathSeq = FileUtils.dirPath(className).split(java.io.File.separator)
4543
val parentDir = lookupPath(dir)(pathSeq.init.toSeq, directory = true)
46-
if parentDir == null then return None
44+
if parentDir == null then None
4745
else
48-
Option(lookupPath(parentDir)(pathSeq.last + ".tasty" :: Nil, directory = false))
49-
.orElse(Option(lookupPath(parentDir)(pathSeq.last + ".class" :: Nil, directory = false)))
46+
Option(lookupPath(parentDir)(pathSeq.last + ".class" :: Nil, directory = false))
5047
}
5148

5249
private[dotty] def classes(inPackage: PackageName): Seq[ClassFileEntry] = files(inPackage)

compiler/src/dotty/tools/dotc/classpath/ZipAndJarFileLookupFactory.scala

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,8 @@ object ZipAndJarClassPathFactory extends ZipAndJarFileLookupFactory {
4545
with NoSourcePaths {
4646

4747
override def findClassFile(className: String): Option[AbstractFile] =
48-
findClass(className).map(_.file)
49-
50-
// This method is performance sensitive as it is used by SBT's ExtractDependencies phase.
51-
override def findClass(className: String): Option[ClassFileEntryImpl] = {
5248
val (pkg, simpleClassName) = PackageNameUtils.separatePkgAndClassNames(className)
53-
val binaries = files(PackageName(pkg), simpleClassName + ".tasty", simpleClassName + ".class")
54-
binaries.find(_.file.isTasty).orElse(binaries.find(_.file.isClass))
55-
}
49+
file(PackageName(pkg), simpleClassName + ".class").map(_.file)
5650

5751
override private[dotty] def classes(inPackage: PackageName): Seq[ClassFileEntry] = files(inPackage)
5852

compiler/src/dotty/tools/dotc/classpath/ZipArchiveFileLookup.scala

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,6 @@ trait ZipArchiveFileLookup[FileEntryType <: ClassRepresentation] extends Efficie
4343
}
4444
yield createFileEntry(entry)
4545

46-
protected def files(inPackage: PackageName, names: String*): Seq[FileEntryType] =
47-
for {
48-
dirEntry <- findDirEntry(inPackage).toSeq
49-
name <- names
50-
entry <- Option(dirEntry.lookupName(name, directory = false))
51-
if isRequiredFileType(entry)
52-
}
53-
yield createFileEntry(entry)
54-
5546
protected def file(inPackage: PackageName, name: String): Option[FileEntryType] =
5647
for {
5748
dirEntry <- findDirEntry(inPackage)

compiler/src/dotty/tools/io/ClassPath.scala

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -56,32 +56,8 @@ trait ClassPath {
5656
private[dotty] def list(inPackage: PackageName): ClassPathEntries
5757

5858
/**
59-
* Returns the class file and / or source file for a given external name, e.g., "java.lang.String".
60-
* If there is both a class file and source file, the compiler can decide whether to read the
61-
* class file or compile the source file.
62-
*
63-
* Internally this seems to be used only by `ScriptRunner`, but only to call `.isDefined`. That
64-
* could probably be implemented differently.
65-
*
66-
* Externally, it is used by sbt's compiler interface:
67-
* https://github.com/sbt/sbt/blob/v0.13.15/compile/interface/src/main/scala/xsbt/CompilerInterface.scala#L249
68-
* Jason has some improvements for that in the works (https://github.com/scala/bug/issues/10289#issuecomment-310022699)
69-
*/
70-
def findClass(className: String): Option[ClassRepresentation] = {
71-
// A default implementation which should be overridden, if we can create the more efficient
72-
// solution for a given type of ClassPath
73-
val (pkg, simpleClassName) = PackageNameUtils.separatePkgAndClassNames(className)
74-
75-
val packageName = PackageName(pkg)
76-
val foundClassFromClassFiles = classes(packageName).find(_.name == simpleClassName)
77-
def findClassInSources = sources(packageName).find(_.name == simpleClassName)
78-
79-
foundClassFromClassFiles orElse findClassInSources
80-
}
81-
82-
/**
83-
* Returns the classfile for an external name, e.g., "java.lang.String". This method does not
84-
* return source files.
59+
* Returns *only* the classfile for an external name, e.g., "java.lang.String". This method does not
60+
* return source files, tasty files,.
8561
*
8662
* This method is used by the classfile parser. When parsing a Java class, its own inner classes
8763
* are entered with a `ClassfileLoader` that parses the classfile returned by this method.

compiler/test/dotty/tools/dotc/classpath/JrtClassPathTest.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ class JrtClassPathTest {
3838
assertEquals("java/lang/Object", AsmUtils.readClass(jl_Object.file.toByteArray).name)
3939
assertTrue(cp.list("java.lang").packages.exists(_.name == "java.lang.annotation"))
4040
assertTrue(cp.list("java.lang").classesAndSources.exists(_.name == "Object"))
41-
assertTrue(cp.findClass("java.lang.Object").isDefined)
4241
assertTrue(cp.findClassFile("java.lang.Object").isDefined)
4342
}
4443
}

compiler/test/dotty/tools/dotc/classpath/ZipAndJarFileLookupFactoryTest.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class ZipAndJarFileLookupFactoryTest {
2727
createZip(f, Array(), "p2/X.class")
2828
createZip(f, Array(), "p3/Y.class")
2929
val cp1 = createCp
30-
assert(cp1.findClass("p1.C").isDefined)
30+
assert(cp1.findClassFile("p1.C").isDefined)
3131

3232
// We expect get a cache hit as the underlying zip hasn't changed
3333
val cp2 = createCp
@@ -46,8 +46,8 @@ class ZipAndJarFileLookupFactoryTest {
4646
val cp3 = createCp
4747
assert(cp1 ne cp3, (System.identityHashCode(cp1), System.identityHashCode(cp3)))
4848
// And that instance should see D, not C, in package p1.
49-
assert(cp3.findClass("p1.C").isEmpty)
50-
assert(cp3.findClass("p1.D").isDefined)
49+
assert(cp3.findClassFile("p1.C").isEmpty)
50+
assert(cp3.findClassFile("p1.D").isDefined)
5151
} finally Files.delete(f)
5252
}
5353

0 commit comments

Comments
 (0)