From 02e043c776114af40ce329a1b8741f9ae6bc5c8c Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Mon, 7 Mar 2011 11:56:47 +0000 Subject: More signature fixes and tests and generally be... More signature fixes and tests and generally being more sophisticated about our primitive squashing. These signatures belong in world-class museums but we are their shepherds for now. Closes #4317, no review. --- .../scala/tools/nsc/symtab/Definitions.scala | 1 + .../scala/tools/nsc/transform/Erasure.scala | 22 ++++++++++++++-------- test/files/pos/bug4317/J_2.java | 3 --- test/files/pos/bug4317/S_1.scala | 3 --- test/files/run/bug4317.check | 3 +++ test/files/run/bug4317.flags | 1 + test/files/run/bug4317/J_2.java | 5 +++++ test/files/run/bug4317/S_1.scala | 9 +++++++++ test/files/run/bug4317/S_3.scala | 8 ++++++++ 9 files changed, 41 insertions(+), 14 deletions(-) delete mode 100644 test/files/pos/bug4317/J_2.java delete mode 100644 test/files/pos/bug4317/S_1.scala create mode 100644 test/files/run/bug4317.check create mode 100644 test/files/run/bug4317.flags create mode 100644 test/files/run/bug4317/J_2.java create mode 100644 test/files/run/bug4317/S_1.scala create mode 100644 test/files/run/bug4317/S_3.scala diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala index 011b753a9d..5f9a7d2816 100644 --- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala +++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala @@ -714,6 +714,7 @@ trait Definitions extends reflect.generic.StandardDefinitions { /** Is symbol a value class? */ def isValueClass(sym: Symbol) = scalaValueClassesSet(sym) + def isNonUnitValueClass(sym: Symbol) = (sym != UnitClass) && isValueClass(sym) /** Is symbol a boxed value class, e.g. java.lang.Integer? */ def isBoxedValueClass(sym: Symbol) = boxedValueClassesSet(sym) diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index 7030b70082..3f94e165a1 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -237,6 +237,13 @@ abstract class Erasure extends AddInterfaces def javaSig(sym0: Symbol, info: Type): Option[String] = atPhase(currentRun.erasurePhase) { def jsig(tp: Type): String = jsig2(false, Nil, tp) + // Unit in return position is 'V', but that cannot appear elsewhere. + def unboxedSig(tpe: Type, isReturnPosition: Boolean) = { + val tsym = tpe.typeSymbol + if (isReturnPosition && (tsym == UnitClass || sym0.isConstructor)) VOID_TAG + else if (isNonUnitValueClass(tsym)) abbrvTag(tsym) + else jsig(tpe) + } def boxedSig(tp: Type) = jsig(squashBoxed(tp)) def squashBoxed(tp: Type) = if (boxedClass contains tp.typeSymbol) ObjectClass.tpe @@ -328,15 +335,14 @@ abstract class Erasure extends AddInterfaces def paramSig(tsym: Symbol) = tsym.name + boundSig(hiBounds(tsym.info.bounds)) val paramString = if (toplevel) tparams map paramSig mkString ("<", "", ">") else "" - paramString + jsig(restpe) + traceSig.seq("PolyType", Seq(tparams, restpe))(paramString + jsig(restpe)) case MethodType(params, restpe) => - val ressym = restpe.typeSymbol - "(%s)%s".format( - params map (x => jsig(x.tpe)) mkString, - if (ressym == UnitClass || sym0.isConstructor) VOID_TAG - else if (isValueClass(ressym)) abbrvTag(ressym) - else jsig(restpe) - ) + traceSig.seq("MethodType", Seq(params, restpe)) { + "(%s)%s".format( + params map (p => unboxedSig(p.tpe, false)) mkString, + unboxedSig(restpe, true) + ) + } case RefinedType(parent :: _, decls) => jsig(parent) case ClassInfoType(parents, _, _) => diff --git a/test/files/pos/bug4317/J_2.java b/test/files/pos/bug4317/J_2.java deleted file mode 100644 index fc8f7ec476..0000000000 --- a/test/files/pos/bug4317/J_2.java +++ /dev/null @@ -1,3 +0,0 @@ -class J_2 { - int bar() { return S_1.foo(String.class) ; } -} \ No newline at end of file diff --git a/test/files/pos/bug4317/S_1.scala b/test/files/pos/bug4317/S_1.scala deleted file mode 100644 index 9f368ee484..0000000000 --- a/test/files/pos/bug4317/S_1.scala +++ /dev/null @@ -1,3 +0,0 @@ -object S_1 { - def foo(x: Class[_ <: AnyRef]) = 0 -} diff --git a/test/files/run/bug4317.check b/test/files/run/bug4317.check new file mode 100644 index 0000000000..c6d0e511a5 --- /dev/null +++ b/test/files/run/bug4317.check @@ -0,0 +1,3 @@ +0 +99 +33 diff --git a/test/files/run/bug4317.flags b/test/files/run/bug4317.flags new file mode 100644 index 0000000000..e8fb65d50c --- /dev/null +++ b/test/files/run/bug4317.flags @@ -0,0 +1 @@ +-Xfatal-warnings \ No newline at end of file diff --git a/test/files/run/bug4317/J_2.java b/test/files/run/bug4317/J_2.java new file mode 100644 index 0000000000..4e81b390eb --- /dev/null +++ b/test/files/run/bug4317/J_2.java @@ -0,0 +1,5 @@ +public class J_2 { + int bar1() { return S_1.foo1(String.class) ; } + int bar2() { return S_1.foo2(String.class, 0); } + int bar3() { return S_1.foo3(11, 22); } +} \ No newline at end of file diff --git a/test/files/run/bug4317/S_1.scala b/test/files/run/bug4317/S_1.scala new file mode 100644 index 0000000000..2de408268c --- /dev/null +++ b/test/files/run/bug4317/S_1.scala @@ -0,0 +1,9 @@ +object S_1 { + def foo1(x: Class[_ <: AnyRef]) = 0 + def foo2(x: Class[_ <: AnyRef], y: Int) = 99 + def foo3[T](x: Int, y: Int) = x + y + def foo4a(x: Unit): Unit = () + def foo4[T](x: Unit): Unit = () + def foo5[T <: Unit](x: T): T = sys.error("") + def foo6[T](x: Class[_], y: Class[T], z: Class[_ <: T]) = ((x, y, z)) +} diff --git a/test/files/run/bug4317/S_3.scala b/test/files/run/bug4317/S_3.scala new file mode 100644 index 0000000000..ce8e2330e3 --- /dev/null +++ b/test/files/run/bug4317/S_3.scala @@ -0,0 +1,8 @@ +object Test { + def main(args: Array[String]): Unit = { + val j = new J_2() + println(j.bar1()) + println(j.bar2()) + println(j.bar3()) + } +} -- cgit v1.2.3