@@ -439,58 +439,62 @@ abstract class ClassfileParser {
439439// println("found: " + sym)
440440 sym
441441 }
442-
443- protected def lookupClass (name : Name ) = {
444- val sym = name match {
445- case fulltpnme.RuntimeNothing => definitions.NothingClass
446- case fulltpnme.RuntimeNull => definitions.NullClass
447- case _ =>
448- if (innerClasses contains name) // check inner classes
449- innerClasses.classSymbol(innerClasses(name).externalName)
450- else if (name containsChar '.' ) // qualified name
451- definitions.getClassIfDefined(name)
452- else // might be in the empty package
453- definitions.getMember(definitions.EmptyPackageClass , name.toTypeName)
454- }
455-
456- sym orElse loadClassSymbol(name)
457- }
458442
459- protected def loadClassSymbol (name : Name ): Symbol = {
460- val file = global.classPath findSourceFile (" " + name) getOrElse {
461- warning(" Class " + name + " not found - continuing with a stub." )
462- return NoSymbol .newClass(name.toTypeName)
463- }
464- val completer = new global.loaders.ClassfileLoader (file)
465- var owner : Symbol = definitions.RootClass
466- var sym : Symbol = NoSymbol
467- var ss : Name = null
468- var start = 0
469- var end = name indexOf '.'
470-
471- while (end > 0 ) {
472- ss = name.subName(start, end)
473- sym = owner.info.decls lookup ss
474- if (sym == NoSymbol ) {
475- sym = owner.newPackage(ss) setInfo completer
476- sym.moduleClass setInfo completer
477- owner.info.decls enter sym
443+ /** Return the class symbol of the given name. */
444+ def classNameToSymbol (name : Name ): Symbol = {
445+ def loadClassSymbol (name : Name ): Symbol = {
446+ val file = global.classPath findSourceFile (" " + name) getOrElse {
447+ warning(" Class " + name + " not found - continuing with a stub." )
448+ return NoSymbol .newClass(name.toTypeName)
449+ }
450+ val completer = new global.loaders.ClassfileLoader (file)
451+ var owner : Symbol = definitions.RootClass
452+ var sym : Symbol = NoSymbol
453+ var ss : Name = null
454+ var start = 0
455+ var end = name indexOf '.'
456+
457+ while (end > 0 ) {
458+ ss = name.subName(start, end)
459+ sym = owner.info.decls lookup ss
460+ if (sym == NoSymbol ) {
461+ sym = owner.newPackage(ss) setInfo completer
462+ sym.moduleClass setInfo completer
463+ owner.info.decls enter sym
464+ }
465+ owner = sym.moduleClass
466+ start = end + 1
467+ end = name.indexOf('.' , start)
478468 }
479- owner = sym.moduleClass
480- start = end + 1
481- end = name.indexOf('.' , start)
469+ ss = name.subName(0 , start)
470+ owner.info.decls lookup ss orElse {
471+ sym = owner.newClass(ss.toTypeName) setInfoAndEnter completer
472+ debuglog(" loaded " + sym+ " from file " + file)
473+ sym
474+ }
475+ }
476+
477+ def lookupClass (name : Name ) = try {
478+ if (name.pos('.' ) == name.length)
479+ definitions.getMember(definitions.EmptyPackageClass , name.toTypeName)
480+ else
481+ definitions.getClass(name) // see tickets #2464, #3756
482+ } catch {
483+ case _ : FatalError => loadClassSymbol(name)
482484 }
483- ss = name.subName(0 , start)
484- owner.info.decls lookup ss orElse {
485- sym = owner.newClass(ss.toTypeName) setInfoAndEnter completer
486- debuglog(" loaded " + sym+ " from file " + file)
487- sym
485+
486+ innerClasses.get(name) match {
487+ case Some (entry) =>
488+ // println("found inner class " + name)
489+ val res = innerClasses.classSymbol(entry.externalName)
490+ // println("\trouted to: " + res)
491+ res
492+ case None =>
493+ // if (name.toString.contains("$")) println("No inner class: " + name + innerClasses + " while parsing " + in.file.name)
494+ lookupClass(name)
488495 }
489496 }
490497
491- /** Return the class symbol of the given name. */
492- def classNameToSymbol (name : Name ): Symbol = lookupClass(name)
493-
494498 var sawPrivateConstructor = false
495499
496500 def parseClass () {
0 commit comments