From bc9a3475f308e78de193e4072f11e2edb7f7a72b Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Sun, 6 Mar 2011 10:07:51 +0000 Subject: Re-enabling the disabled signature test along w... Re-enabling the disabled signature test along with changes which allow it to pass. Closes #4238 again, no review. (But would anyone like to expand the signature tests? Great idea, extempore!) --- .../scala/tools/nsc/transform/Erasure.scala | 47 ++++++++++++---------- src/compiler/scala/tools/nsc/util/Tracer.scala | 3 +- test/disabled/jvm/t2585.check | 0 test/disabled/jvm/t2585/Test.java | 16 -------- test/disabled/jvm/t2585/genericouter.scala | 25 ------------ test/files/jvm/JavaInteraction.scala | 2 +- test/files/jvm/t2585.check | 0 test/files/jvm/t2585/Test.java | 16 ++++++++ test/files/jvm/t2585/genericouter.scala | 25 ++++++++++++ 9 files changed, 70 insertions(+), 64 deletions(-) delete mode 100644 test/disabled/jvm/t2585.check delete mode 100644 test/disabled/jvm/t2585/Test.java delete mode 100644 test/disabled/jvm/t2585/genericouter.scala create mode 100644 test/files/jvm/t2585.check create mode 100644 test/files/jvm/t2585/Test.java create mode 100644 test/files/jvm/t2585/genericouter.scala diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index a6c862c19d..dcc6ab044c 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -202,14 +202,15 @@ abstract class Erasure extends AddInterfaces private def needsJavaSig(tp: Type) = !settings.Ynogenericsig.value && NeedsSigCollector.collect(tp) // only refer to type params that will actually make it into the sig, this excludes: - // * higher-order type parameters (aka !sym.owner.isTypeParameterOrSkolem) + // * higher-order type parameters // * parameters of methods - // * type members not visible in the enclosing template - private def isTypeParameterInSig(sym: Symbol, nestedIn: Symbol) = ( - !sym.owner.isTypeParameterOrSkolem && + // * type members not visible in an enclosing template + private def isTypeParameterInSig(sym: Symbol, initialSymbol: Symbol) = ( + !sym.isHigherOrderTypeParameter && sym.isTypeParameterOrSkolem && - (sym isNestedIn nestedIn) + initialSymbol.enclClassChain.exists(sym isNestedIn _) ) + // Ensure every '.' in the generated signature immediately follows // a close angle bracket '>'. Any which do not are replaced with '$'. // This arises due to multiply nested classes in the face of the @@ -274,8 +275,10 @@ abstract class Erasure extends AddInterfaces if (unboundedGenericArrayLevel(tp) == 1) jsig(ObjectClass.tpe) else ARRAY_TAG.toString+(args map jsig).mkString } - else if (isTypeParameterInSig(sym, sym0.enclClass)) + else if (isTypeParameterInSig(sym, sym0)) { + assert(!sym.isAliasType, "Unexpected alias type: " + sym) TVAR_TAG.toString+sym.name+";" + } else if (sym == AnyClass || sym == AnyValClass || sym == SingletonClass) jsig(ObjectClass.tpe) else if (sym == UnitClass) @@ -288,21 +291,23 @@ abstract class Erasure extends AddInterfaces jsig(ObjectClass.tpe) else if (sym.isClass) { val preRebound = pre.baseType(sym.owner) // #2585 - dotCleanup( - ( - if (needsJavaSig(preRebound)) { - val s = jsig(preRebound) - if (s.charAt(0) == 'L') s.substring(0, s.length - 1) + classSigSuffix + traceSig.seq("sym.isClass", Seq(sym.ownerChain, preRebound, sym0.enclClassChain)) { + dotCleanup( + ( + if (needsJavaSig(preRebound)) { + val s = jsig(preRebound) + if (s.charAt(0) == 'L') s.substring(0, s.length - 1) + classSigSuffix + else classSig + } else classSig - } - else classSig - ) + ( - if (args.isEmpty) "" else - "<"+(args map argSig).mkString+">" - ) + ( - ";" + ) + ( + if (args.isEmpty) "" else + "<"+(args map argSig).mkString+">" + ) + ( + ";" + ) ) - ) + } } else jsig(erasure(tp)) case PolyType(tparams, restpe) => @@ -338,13 +343,13 @@ abstract class Erasure extends AddInterfaces else jsig(etp) } } - // traceSig("javaSig", sym0, info) { + traceSig.seq("javaSig", Seq(sym0, info)) { if (needsJavaSig(info)) { try Some(jsig2(true, Nil, info)) catch { case ex: UnknownSig => None } } else None - // } + } } class UnknownSig extends Exception diff --git a/src/compiler/scala/tools/nsc/util/Tracer.scala b/src/compiler/scala/tools/nsc/util/Tracer.scala index c5d3fd3753..17be05a4d6 100644 --- a/src/compiler/scala/tools/nsc/util/Tracer.scala +++ b/src/compiler/scala/tools/nsc/util/Tracer.scala @@ -22,7 +22,7 @@ class Tracer(enabled: () => Boolean) { p(ind("" + x)) x } - def apply[T](name: String, args: Any*)(body: => T): T = { + def seq[T](name: String, args: => Seq[Any])(body: => T): T = { if (enabled()) { p(ind("%s(%s) = {\n".format(name, args mkString ", "))) try indented(pin(body)) @@ -30,6 +30,7 @@ class Tracer(enabled: () => Boolean) { } else body } + def apply[T](name: String, args: Any*)(body: => T): T = seq(name, args.toSeq)(body) } object Tracer { diff --git a/test/disabled/jvm/t2585.check b/test/disabled/jvm/t2585.check deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/test/disabled/jvm/t2585/Test.java b/test/disabled/jvm/t2585/Test.java deleted file mode 100644 index 51fe20d81e..0000000000 --- a/test/disabled/jvm/t2585/Test.java +++ /dev/null @@ -1,16 +0,0 @@ -class J { S s ; } - -public class Test { - public static void main(String[] args) { - final X x = new X(); - final OuterImpl o = new OuterImpl(x); - - final OuterImpl.Inner i1 = o.newInner(); - i1.getT().getI().getT().getI(); // <--- Error: "The method getI() is undefined for the type Object" - - final Outer.Inner i2 = o.newInner(); - i2.getT().getI().getT().getI(); // <--- Error: "The method getI() is undefined for the type Object" - - HashMap map = new HashMap(); - } -} \ No newline at end of file diff --git a/test/disabled/jvm/t2585/genericouter.scala b/test/disabled/jvm/t2585/genericouter.scala deleted file mode 100644 index e06aa8101e..0000000000 --- a/test/disabled/jvm/t2585/genericouter.scala +++ /dev/null @@ -1,25 +0,0 @@ -case class S(n:Int) - -trait TraversableLike[+A, +Repr] { - class WithFilter(p: A => Boolean) - def withFilter(p: A => Boolean): WithFilter = new WithFilter(p) -} - -class HashMap[K, +V] extends TraversableLike[(K, V), HashMap[K, V]] - -class Outer[T](val t: T) { - class Inner { - def getT : T = t - } -} - -class OuterImpl(x: X) extends Outer[X](x) { - def newInner = new Inner -} - -class X { - def getI : Outer[X]#Inner = { - val oImpl = new OuterImpl(this) - new oImpl.Inner - } -} \ No newline at end of file diff --git a/test/files/jvm/JavaInteraction.scala b/test/files/jvm/JavaInteraction.scala index 0381d6aa82..26fbc17e58 100644 --- a/test/files/jvm/JavaInteraction.scala +++ b/test/files/jvm/JavaInteraction.scala @@ -16,7 +16,7 @@ p.x = 5 p.c = java.awt.Color[r=255,g=0,b=0] p.getX() = 5.0 p.getC() = java.awt.Color[r=255,g=0,b=0] - """.trim + "\n" + """.trim def connect() = { val p = new ColoredPoint(5, 7, Color.RED); diff --git a/test/files/jvm/t2585.check b/test/files/jvm/t2585.check new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/files/jvm/t2585/Test.java b/test/files/jvm/t2585/Test.java new file mode 100644 index 0000000000..51fe20d81e --- /dev/null +++ b/test/files/jvm/t2585/Test.java @@ -0,0 +1,16 @@ +class J { S s ; } + +public class Test { + public static void main(String[] args) { + final X x = new X(); + final OuterImpl o = new OuterImpl(x); + + final OuterImpl.Inner i1 = o.newInner(); + i1.getT().getI().getT().getI(); // <--- Error: "The method getI() is undefined for the type Object" + + final Outer.Inner i2 = o.newInner(); + i2.getT().getI().getT().getI(); // <--- Error: "The method getI() is undefined for the type Object" + + HashMap map = new HashMap(); + } +} \ No newline at end of file diff --git a/test/files/jvm/t2585/genericouter.scala b/test/files/jvm/t2585/genericouter.scala new file mode 100644 index 0000000000..e06aa8101e --- /dev/null +++ b/test/files/jvm/t2585/genericouter.scala @@ -0,0 +1,25 @@ +case class S(n:Int) + +trait TraversableLike[+A, +Repr] { + class WithFilter(p: A => Boolean) + def withFilter(p: A => Boolean): WithFilter = new WithFilter(p) +} + +class HashMap[K, +V] extends TraversableLike[(K, V), HashMap[K, V]] + +class Outer[T](val t: T) { + class Inner { + def getT : T = t + } +} + +class OuterImpl(x: X) extends Outer[X](x) { + def newInner = new Inner +} + +class X { + def getI : Outer[X]#Inner = { + val oImpl = new OuterImpl(this) + new oImpl.Inner + } +} \ No newline at end of file -- cgit v1.2.3