summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/symtab/classfile
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@typesafe.com>2015-04-09 19:37:43 +0300
committerLukas Rytz <lukas.rytz@typesafe.com>2015-04-09 19:37:43 +0300
commit68e05701cd9ef633f7a22b82794c81f67d45be16 (patch)
tree428fbdb725e0236f305b041bed73b185e407918e /src/compiler/scala/tools/nsc/symtab/classfile
parent9b009b42a5631a3bece0b37ea244de8e2c4c9f0c (diff)
parentbbd693ae44bab4be2be7930641f8ca2bf27c962c (diff)
downloadscala-68e05701cd9ef633f7a22b82794c81f67d45be16.tar.gz
scala-68e05701cd9ef633f7a22b82794c81f67d45be16.tar.bz2
scala-68e05701cd9ef633f7a22b82794c81f67d45be16.zip
Merge pull request #4386 from retronym/ticket/7741
SI-7741: Be more tolerant of absent inner classfiles and non-Scala interface members
Diffstat (limited to 'src/compiler/scala/tools/nsc/symtab/classfile')
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
index 1ffa064b78..994bcd8359 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
@@ -15,6 +15,7 @@ import scala.collection.mutable.{ ListBuffer, ArrayBuffer }
import scala.annotation.switch
import scala.reflect.internal.{ JavaAccFlags }
import scala.reflect.internal.pickling.{PickleBuffer, ByteCodecs}
+import scala.reflect.io.NoAbstractFile
import scala.tools.nsc.io.AbstractFile
import scala.tools.nsc.util.ClassFileLookup
@@ -1022,11 +1023,18 @@ abstract class ClassfileParser {
val sflags = jflags.toScalaFlags
val owner = ownerForFlags(jflags)
val scope = getScope(jflags)
- val innerClass = owner.newClass(name.toTypeName, NoPosition, sflags) setInfo completer
- val innerModule = owner.newModule(name.toTermName, NoPosition, sflags) setInfo completer
+ def newStub(name: Name) =
+ owner.newStubSymbol(name, s"Class file for ${entry.externalName} not found").setFlag(JAVA)
- innerModule.moduleClass setInfo loaders.moduleClassLoader
- List(innerClass, innerModule.moduleClass) foreach (_.associatedFile = file)
+ val (innerClass, innerModule) = if (file == NoAbstractFile) {
+ (newStub(name.toTypeName), newStub(name.toTermName))
+ } else {
+ val cls = owner.newClass(name.toTypeName, NoPosition, sflags) setInfo completer
+ val mod = owner.newModule(name.toTermName, NoPosition, sflags) setInfo completer
+ mod.moduleClass setInfo loaders.moduleClassLoader
+ List(cls, mod.moduleClass) foreach (_.associatedFile = file)
+ (cls, mod)
+ }
scope enter innerClass
scope enter innerModule
@@ -1046,10 +1054,8 @@ abstract class ClassfileParser {
for (entry <- innerClasses.entries) {
// create a new class member for immediate inner classes
if (entry.outerName == currentClass) {
- val file = classFileLookup.findClassFile(entry.externalName.toString) getOrElse {
- throw new AssertionError(s"Class file for ${entry.externalName} not found")
- }
- enterClassAndModule(entry, file)
+ val file = classFileLookup.findClassFile(entry.externalName.toString)
+ enterClassAndModule(entry, file.getOrElse(NoAbstractFile))
}
}
}