Skip to content

Commit 6998fd0

Browse files
authored
Merge pull request #3813 from dotty-staging/optimize-classfileparser
Simplify ClassfileParser#innerClasses#classSymbol
2 parents 7058f69 + 3c0efe8 commit 6998fd0

File tree

1 file changed

+30
-46
lines changed

1 file changed

+30
-46
lines changed

compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala

Lines changed: 30 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class ClassfileParser(
106106

107107
/** Return the class symbol of the given name. */
108108
def classNameToSymbol(name: Name)(implicit ctx: Context): Symbol = innerClasses.get(name) match {
109-
case Some(entry) => innerClasses.classSymbol(entry.externalName)
109+
case Some(entry) => innerClasses.classSymbol(entry)
110110
case None => ctx.requiredClass(name)
111111
}
112112

@@ -890,54 +890,38 @@ class ClassfileParser(
890890
classNameToSymbol(tlName)
891891
}
892892

893-
/** Return the class symbol for `externalName`. It looks it up in its outer class.
893+
/** Return the class symbol for `entry`. It looks it up in its outer class.
894894
* Forces all outer class symbols to be completed.
895-
*
896-
* If the given name is not an inner class, it returns the symbol found in `defn`.
897895
*/
898-
def classSymbol(externalName: Name)(implicit ctx: Context): Symbol = {
899-
/** Return the symbol of `innerName`, having the given `externalName`. */
900-
def innerSymbol(externalName: Name, innerName: Name, static: Boolean): Symbol = {
901-
def getMember(sym: Symbol, name: Name)(implicit ctx: Context): Symbol =
902-
if (static)
903-
if (sym == classRoot.symbol) staticScope.lookup(name)
904-
else {
905-
var module = sym.companionModule
906-
if (!module.exists && sym.isAbsent)
907-
module = sym.scalacLinkedClass
908-
module.info.member(name).symbol
909-
}
910-
else
911-
if (sym == classRoot.symbol) instanceScope.lookup(name)
912-
else sym.info.member(name).symbol
913-
914-
innerClasses.get(externalName) match {
915-
case Some(entry) =>
916-
val outerName = entry.outerName.stripModuleClassSuffix
917-
val owner = classSymbol(outerName)
918-
val result = ctx.atPhaseNotLaterThan(ctx.typerPhase) { implicit ctx =>
919-
getMember(owner, innerName.toTypeName)
920-
}
921-
assert(result ne NoSymbol,
922-
i"""failure to resolve inner class:
923-
|externalName = $externalName,
924-
|outerName = $outerName,
925-
|innerName = $innerName
926-
|owner.fullName = ${owner.showFullName}
927-
|while parsing ${classfile}""")
928-
result
929-
930-
case None =>
931-
classNameToSymbol(externalName)
896+
def classSymbol(entry: InnerClassEntry)(implicit ctx: Context): Symbol = {
897+
def getMember(sym: Symbol, name: Name)(implicit ctx: Context): Symbol =
898+
if (isStatic(entry.jflags)) {
899+
if (sym == classRoot.symbol)
900+
staticScope.lookup(name)
901+
else {
902+
var module = sym.companionModule
903+
if (!module.exists && sym.isAbsent)
904+
module = sym.scalacLinkedClass
905+
module.info.member(name).symbol
906+
}
932907
}
933-
}
934-
935-
get(externalName) match {
936-
case Some(entry) =>
937-
innerSymbol(entry.externalName, entry.originalName, isStatic(entry.jflags))
938-
case None =>
939-
classNameToSymbol(externalName)
940-
}
908+
else if (sym == classRoot.symbol)
909+
instanceScope.lookup(name)
910+
else
911+
sym.info.member(name).symbol
912+
913+
val outerName = entry.outerName.stripModuleClassSuffix
914+
val innerName = entry.originalName
915+
val owner = classNameToSymbol(outerName)
916+
val result = getMember(owner, innerName.toTypeName)(ctx.withPhase(ctx.typerPhase))
917+
assert(result ne NoSymbol,
918+
i"""failure to resolve inner class:
919+
|externalName = ${entry.externalName},
920+
|outerName = $outerName,
921+
|innerName = $innerName
922+
|owner.fullName = ${owner.showFullName}
923+
|while parsing ${classfile}""")
924+
result
941925
}
942926
}
943927

0 commit comments

Comments
 (0)