diff options
author | michelou <michelou@epfl.ch> | 2010-07-26 14:27:41 +0000 |
---|---|---|
committer | michelou <michelou@epfl.ch> | 2010-07-26 14:27:41 +0000 |
commit | 0ce0ad51284ba129a7553ea2ec98d1be45660706 (patch) | |
tree | 567e7719af3cbada29b898b233e7a60a2f0f42ea /src | |
parent | 280cc3fe3e2cfaf5d367cc7ba296156e2d06a17d (diff) | |
download | scala-0ce0ad51284ba129a7553ea2ec98d1be45660706.tar.gz scala-0ce0ad51284ba129a7553ea2ec98d1be45660706.tar.bz2 scala-0ce0ad51284ba129a7553ea2ec98d1be45660706.zip |
fixed case 2 (Android) in ticket #2464 (case 1 ...
fixed case 2 (Android) in ticket #2464 (case 1 is ok with 2.8.0.final)
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index b7110b66df..84fca0436d 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -427,14 +427,48 @@ abstract class ClassfileParser { sym } - /** Return the class symbol of the given name. */ def classNameToSymbol(name: Name): Symbol = { + def loadClassSymbol(name: Name) = { + val s = name.toString + val file = global.classPath findSourceFile s getOrElse { + throw new MissingRequirementError("class " + s) + } + val completer = new global.loaders.ClassfileLoader(file) + var owner: Symbol = definitions.RootClass + var sym: Symbol = NoSymbol + var ss: String = null + var start = 0 + var end = s indexOf '.' + while (end > 0) { + ss = s.substring(start, end) + sym = owner.info.decls lookup ss + if (sym == NoSymbol) { + sym = owner.newPackage(NoPosition, ss) setInfo completer + sym.moduleClass setInfo completer + owner.info.decls enter sym + } + owner = sym.moduleClass + start = end + 1 + end = s.indexOf('.', start) + } + ss = s substring start + sym = owner.info.decls lookup ss + if (sym == NoSymbol) { + sym = owner.newClass(NoPosition, ss) setInfo completer + owner.info.decls enter sym + if (settings.debug.value && settings.verbose.value) + println("loaded "+sym+" from file "+file) + } + sym + } def lookupClass(name: Name) = if (name.pos('.') == name.length) definitions.getMember(definitions.EmptyPackageClass, name.toTypeName) else - definitions.getClass(name) + //definitions.getClass(name) // see ticket #2464 + try { definitions.getClass(name) } + catch { case _: FatalError => loadClassSymbol(name) } innerClasses.get(name) match { case Some(entry) => @@ -709,7 +743,8 @@ abstract class ClassfileParser { val eparams = typeParamsToExistentials(classSym, classSym.unsafeTypeParams) val t = TypeRef(pre, classSym, eparams.map(_.tpe)) val res = existentialType(eparams, t) - if (settings.debug.value && settings.verbose.value) println("raw type " + classSym + " -> " + res) + if (settings.debug.value && settings.verbose.value) + println("raw type " + classSym + " -> " + res) res } case tp => |