summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-01-12 09:17:26 -0800
committerPaul Phillips <paulp@improving.org>2012-01-12 10:06:00 -0800
commitccb590c0378819011640a58b822fbdeb938144dc (patch)
tree6b92649121c4fdbfe851d266a5002d8eb892ff34
parent15372027c762b18bccf231b9810e9db3415e7f5a (diff)
downloadscala-ccb590c0378819011640a58b822fbdeb938144dc.tar.gz
scala-ccb590c0378819011640a58b822fbdeb938144dc.tar.bz2
scala-ccb590c0378819011640a58b822fbdeb938144dc.zip
Disambiguate some type printing.
Functions of functions use parens for grouping.
-rw-r--r--src/compiler/scala/reflect/internal/Types.scala7
-rw-r--r--test/files/neg/nested-fn-print.check20
-rw-r--r--test/files/neg/nested-fn-print.scala11
-rw-r--r--test/files/neg/t0003.check2
-rw-r--r--test/files/presentation/callcc-interpreter.check2
5 files changed, 38 insertions, 4 deletions
diff --git a/src/compiler/scala/reflect/internal/Types.scala b/src/compiler/scala/reflect/internal/Types.scala
index 6d4332216c..fa62d00c6a 100644
--- a/src/compiler/scala/reflect/internal/Types.scala
+++ b/src/compiler/scala/reflect/internal/Types.scala
@@ -2095,8 +2095,11 @@ trait Types extends api.Types { self: SymbolTable =>
// ...but only if it's not a tuple, so ((T1, T2)) => R is distinguishable
// from (T1, T2) => R.
targs match {
- case in :: out :: Nil if !isTupleTypeOrSubtype(in) =>
- "" + in + " => " + out
+ case in :: out :: Nil if !isTupleTypeOrSubtype(in) =>
+ // A => B => C should be (A => B) => C or A => (B => C)
+ val in_s = if (isFunctionType(in)) "(" + in + ")" else "" + in
+ val out_s = if (isFunctionType(out)) "(" + out + ")" else "" + out
+ in_s + " => " + out_s
case xs =>
xs.init.mkString("(", ", ", ")") + " => " + xs.last
}
diff --git a/test/files/neg/nested-fn-print.check b/test/files/neg/nested-fn-print.check
new file mode 100644
index 0000000000..ea278554d4
--- /dev/null
+++ b/test/files/neg/nested-fn-print.check
@@ -0,0 +1,20 @@
+nested-fn-print.scala:4: error: only classes can have declared but undefined members
+(Note that variables need to be initialized to be defined)
+ var x3: Int => Double
+ ^
+nested-fn-print.scala:7: error: type mismatch;
+ found : String("a")
+ required: Int => (Float => Double)
+ x1 = "a"
+ ^
+nested-fn-print.scala:8: error: type mismatch;
+ found : String("b")
+ required: (Int => Float) => Double
+ x2 = "b"
+ ^
+nested-fn-print.scala:9: error: type mismatch;
+ found : String("c")
+ required: Int => Double
+ x3 = "c"
+ ^
+four errors found
diff --git a/test/files/neg/nested-fn-print.scala b/test/files/neg/nested-fn-print.scala
new file mode 100644
index 0000000000..9a4bd162c0
--- /dev/null
+++ b/test/files/neg/nested-fn-print.scala
@@ -0,0 +1,11 @@
+object Test {
+ var x1: Int => Float => Double = _
+ var x2: (Int => Float) => Double = _
+ var x3: Int => Double
+
+ def main(args: Array[String]): Unit = {
+ x1 = "a"
+ x2 = "b"
+ x3 = "c"
+ }
+}
diff --git a/test/files/neg/t0003.check b/test/files/neg/t0003.check
index 1913dde9dd..8bab55db3f 100644
--- a/test/files/neg/t0003.check
+++ b/test/files/neg/t0003.check
@@ -1,5 +1,5 @@
t0003.scala:2: error: type mismatch;
- found : A => B => B
+ found : A => (B => B)
required: A => B
def foo[A, B, C](l: List[A], f: A => B=>B, g: B=>B=>C): List[C] = l map (g compose f)
^
diff --git a/test/files/presentation/callcc-interpreter.check b/test/files/presentation/callcc-interpreter.check
index ca99a5afc5..3385ef12b7 100644
--- a/test/files/presentation/callcc-interpreter.check
+++ b/test/files/presentation/callcc-interpreter.check
@@ -23,7 +23,7 @@ retrieved 64 members
`method add(a: callccInterpreter.Value, b: callccInterpreter.Value)callccInterpreter.M[_ >: callccInterpreter.Num with callccInterpreter.Wrong.type <: Product with Serializable with callccInterpreter.Value]`
`method apply(a: callccInterpreter.Value, b: callccInterpreter.Value)callccInterpreter.M[callccInterpreter.Value]`
`method asInstanceOf[T0]=> T0`
-`method callCC[A](h: A => callccInterpreter.M[A] => callccInterpreter.M[A])callccInterpreter.M[A]`
+`method callCC[A](h: (A => callccInterpreter.M[A]) => callccInterpreter.M[A])callccInterpreter.M[A]`
`method clone()Object`
`method ensuring(cond: Boolean)callccInterpreter.type`
`method ensuring(cond: Boolean, msg: => Any)callccInterpreter.type`