diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala | 43 | ||||
-rw-r--r-- | test/files/pos/javaReadsSigs/fromjava.java | 4 |
2 files changed, 36 insertions, 11 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala index 48b5d7cdce..a231a67049 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala @@ -210,12 +210,38 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid with val emitLines = debugLevel >= 2 val emitVars = debugLevel >= 3 + /** For given symbol return a symbol corresponding to a class that should be declared as inner class. + * + * For example: + * class A { + * class B + * object C + * } + * + * then method will return NoSymbol for A, the same symbol for A.B (corresponding to A$B class) and A$C$ symbol + * for A.C. + */ + private def innerClassSymbolFor(s: Symbol): Symbol = + if (s.isClass) s else if (s.isModule) s.moduleClass else NoSymbol + override def javaName(sym: Symbol): String = { - val isInner = sym.isClass && !sym.rawowner.isPackageClass && !sym.isModuleClass - // TODO: something atPhase(currentRun.flattenPhase.prev) which accounts for - // being nested in parameterized classes (if we're going to selectively flatten.) - if (isInner && !innerClassBuffer(sym)) - innerClassBuffer += sym + /** + * Checks if given symbol corresponds to inner class/object and add it to innerClassBuffer + * + * Note: This method is called recursively thus making sure that we add complete chain + * of inner class all until root class. + */ + def collectInnerClass(s: Symbol): Unit = { + // TODO: something atPhase(currentRun.flattenPhase.prev) which accounts for + // being nested in parameterized classes (if we're going to selectively flatten.) + val x = innerClassSymbolFor(s) + val isInner = x.isClass && !x.rawowner.isPackageClass + if (isInner) { + innerClassBuffer += x + collectInnerClass(x.rawowner) + } + } + collectInnerClass(sym) super.javaName(sym) } @@ -736,13 +762,12 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid with if (innerSym.isAnonymousClass || innerSym.isAnonymousFunction) null else - innerSym.rawname.toString + innerSym.rawname + innerSym.moduleSuffix // add inner classes which might not have been referenced yet atPhase(currentRun.erasurePhase.next) { - for (sym <- List(clasz.symbol, clasz.symbol.linkedClassOfClass) ; m <- sym.info.decls ; if m.isClass) - if (!innerClassBuffer(m)) - innerClassBuffer += m + for (sym <- List(clasz.symbol, clasz.symbol.linkedClassOfClass); m <- sym.info.decls.map(innerClassSymbolFor) if m.isClass) + innerClassBuffer += m } val allInners = innerClassBuffer.toList diff --git a/test/files/pos/javaReadsSigs/fromjava.java b/test/files/pos/javaReadsSigs/fromjava.java index 745fb84efd..92441b0c6b 100644 --- a/test/files/pos/javaReadsSigs/fromjava.java +++ b/test/files/pos/javaReadsSigs/fromjava.java @@ -21,13 +21,13 @@ class B { }; // we are informed if the status changes. class Contra { // Not an Ordering<Character>. - static Ordering<Object> charOrd = scala.math.Ordering$Char$.MODULE$; + static Ordering<Object> charOrd = scala.math.Ordering.Char$.MODULE$; public boolean useCharOrd() { return charOrd.compare(new Object(), new Object()) == 0; } - static Numeric<?> intNum = scala.math.Numeric$IntIsIntegral$.MODULE$; + static Numeric<?> intNum = scala.math.Numeric.IntIsIntegral$.MODULE$; } public class fromjava { |