summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-03-07 11:56:47 +0000
committerPaul Phillips <paulp@improving.org>2011-03-07 11:56:47 +0000
commit02e043c776114af40ce329a1b8741f9ae6bc5c8c (patch)
treea1f7a8a2aae97d2f047430aaebb2b8ed6e95f79b
parent5f491e5d037b799476747f0dee6ea50fe87c269b (diff)
downloadscala-02e043c776114af40ce329a1b8741f9ae6bc5c8c.tar.gz
scala-02e043c776114af40ce329a1b8741f9ae6bc5c8c.tar.bz2
scala-02e043c776114af40ce329a1b8741f9ae6bc5c8c.zip
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.
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Definitions.scala1
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala22
-rw-r--r--test/files/pos/bug4317/J_2.java3
-rw-r--r--test/files/pos/bug4317/S_1.scala3
-rw-r--r--test/files/run/bug4317.check3
-rw-r--r--test/files/run/bug4317.flags1
-rw-r--r--test/files/run/bug4317/J_2.java5
-rw-r--r--test/files/run/bug4317/S_1.scala9
-rw-r--r--test/files/run/bug4317/S_3.scala8
9 files changed, 41 insertions, 14 deletions
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())
+ }
+}