diff options
author | Grzegorz Kossakowski <grzegorz.kossakowski@gmail.com> | 2013-10-14 07:16:34 -0700 |
---|---|---|
committer | Grzegorz Kossakowski <grzegorz.kossakowski@gmail.com> | 2013-10-14 07:16:34 -0700 |
commit | 686fb483e721ba2bef77e185afd5bf97a134d890 (patch) | |
tree | 75200d850cf9b39ec979e8eea71e1a2a6dbb7946 /test/files | |
parent | d068b163d36b3fbffe39f87e3dc152a14c3ca07e (diff) | |
parent | b126e5c31b2bc57df5d0d5cf3508babe1dd7a759 (diff) | |
download | scala-2.11.0-M6.tar.gz scala-2.11.0-M6.tar.bz2 scala-2.11.0-M6.zip |
Merge pull request #3037 from gkossakowski/fix-merge-3018v2.11.0-M6
[resubmit] Experimental Single Abstract Method support (sammy meets world)
Diffstat (limited to 'test/files')
-rw-r--r-- | test/files/neg/sammy_wrong_arity.check | 52 | ||||
-rw-r--r-- | test/files/neg/sammy_wrong_arity.flags | 1 | ||||
-rw-r--r-- | test/files/neg/sammy_wrong_arity.scala | 22 | ||||
-rw-r--r-- | test/files/pos/sammy_poly.flags | 1 | ||||
-rw-r--r-- | test/files/pos/sammy_poly.scala | 7 | ||||
-rw-r--r-- | test/files/pos/sammy_scope.flags | 1 | ||||
-rw-r--r-- | test/files/pos/sammy_scope.scala | 8 | ||||
-rw-r--r-- | test/files/pos/sammy_single.flags | 1 | ||||
-rw-r--r-- | test/files/pos/sammy_single.scala | 9 | ||||
-rw-r--r-- | test/files/pos/sammy_twice.flags | 1 | ||||
-rw-r--r-- | test/files/pos/sammy_twice.scala | 9 | ||||
-rw-r--r-- | test/files/pos/t6221.scala | 8 | ||||
-rw-r--r-- | test/files/run/sammy_java8.flags | 1 | ||||
-rw-r--r-- | test/files/run/sammy_java8.scala | 34 | ||||
-rw-r--r-- | test/files/run/t7398.scala | 2 |
15 files changed, 154 insertions, 3 deletions
diff --git a/test/files/neg/sammy_wrong_arity.check b/test/files/neg/sammy_wrong_arity.check new file mode 100644 index 0000000000..af547a201d --- /dev/null +++ b/test/files/neg/sammy_wrong_arity.check @@ -0,0 +1,52 @@ +sammy_wrong_arity.scala:6: error: type mismatch; + found : () => Int + required: T1 + (() => 0): T1 + ^ +sammy_wrong_arity.scala:7: error: type mismatch; + found : Any => Int + required: T2 + ((x: Any) => 0): T2 + ^ +sammy_wrong_arity.scala:9: error: type mismatch; + found : Any => Int + required: T0 + ((x: Any) => 0): T0 + ^ +sammy_wrong_arity.scala:10: error: type mismatch; + found : Any => Int + required: T2 + ((x: Any) => 0): T2 + ^ +sammy_wrong_arity.scala:12: error: type mismatch; + found : (Any, Any) => Int + required: T0 + ((x: Any, y: Any) => 0): T0 + ^ +sammy_wrong_arity.scala:13: error: type mismatch; + found : (Any, Any) => Int + required: T1 + ((x: Any, y: Any) => 0): T1 + ^ +sammy_wrong_arity.scala:15: error: missing parameter type + ((x) => 0): T2 + ^ +sammy_wrong_arity.scala:17: error: missing parameter type + ((x) => 0): T0 + ^ +sammy_wrong_arity.scala:18: error: missing parameter type + ((x) => 0): T2 + ^ +sammy_wrong_arity.scala:20: error: missing parameter type + ((x, y) => 0): T0 + ^ +sammy_wrong_arity.scala:20: error: missing parameter type + ((x, y) => 0): T0 + ^ +sammy_wrong_arity.scala:21: error: missing parameter type + ((x, y) => 0): T1 + ^ +sammy_wrong_arity.scala:21: error: missing parameter type + ((x, y) => 0): T1 + ^ +13 errors found diff --git a/test/files/neg/sammy_wrong_arity.flags b/test/files/neg/sammy_wrong_arity.flags new file mode 100644 index 0000000000..48fd867160 --- /dev/null +++ b/test/files/neg/sammy_wrong_arity.flags @@ -0,0 +1 @@ +-Xexperimental diff --git a/test/files/neg/sammy_wrong_arity.scala b/test/files/neg/sammy_wrong_arity.scala new file mode 100644 index 0000000000..d03d266a0b --- /dev/null +++ b/test/files/neg/sammy_wrong_arity.scala @@ -0,0 +1,22 @@ +trait T0 { def ap(): Int } +trait T1 { def ap(a: Any): Int } +trait T2 { def ap(a: Any, b: Any): Int } + +class Test { + (() => 0): T1 + ((x: Any) => 0): T2 + + ((x: Any) => 0): T0 + ((x: Any) => 0): T2 + + ((x: Any, y: Any) => 0): T0 + ((x: Any, y: Any) => 0): T1 + + ((x) => 0): T2 + + ((x) => 0): T0 + ((x) => 0): T2 + + ((x, y) => 0): T0 + ((x, y) => 0): T1 +} diff --git a/test/files/pos/sammy_poly.flags b/test/files/pos/sammy_poly.flags new file mode 100644 index 0000000000..48fd867160 --- /dev/null +++ b/test/files/pos/sammy_poly.flags @@ -0,0 +1 @@ +-Xexperimental diff --git a/test/files/pos/sammy_poly.scala b/test/files/pos/sammy_poly.scala new file mode 100644 index 0000000000..c629be7166 --- /dev/null +++ b/test/files/pos/sammy_poly.scala @@ -0,0 +1,7 @@ +// test synthesizeSAMFunction where the sam type is not fully defined +class T { + trait F[T, U] { def apply(x: T): U } + // NOTE: the f(x) desugaring for now assumes the single abstract method is called 'apply' + def app[T, U](x: T)(f: F[T, U]): U = f(x) + app(1)(x => List(x)) +}
\ No newline at end of file diff --git a/test/files/pos/sammy_scope.flags b/test/files/pos/sammy_scope.flags new file mode 100644 index 0000000000..48fd867160 --- /dev/null +++ b/test/files/pos/sammy_scope.flags @@ -0,0 +1 @@ +-Xexperimental diff --git a/test/files/pos/sammy_scope.scala b/test/files/pos/sammy_scope.scala new file mode 100644 index 0000000000..8f1fe7058e --- /dev/null +++ b/test/files/pos/sammy_scope.scala @@ -0,0 +1,8 @@ +// test synthesizeSAMFunction: scope hygiene +abstract class SamFun[T1, R] { self => + def apply(v1: T1): R + + // this should type check, as the apply ref is equivalent to self.apply + // it shouldn't resolve to the sam's apply that's synthesized (that wouldn't type check, hence the pos test) + def compose[A](g: SamFun[A, T1]): SamFun[A, R] = { x => apply(g(x)) } +}
\ No newline at end of file diff --git a/test/files/pos/sammy_single.flags b/test/files/pos/sammy_single.flags new file mode 100644 index 0000000000..48fd867160 --- /dev/null +++ b/test/files/pos/sammy_single.flags @@ -0,0 +1 @@ +-Xexperimental diff --git a/test/files/pos/sammy_single.scala b/test/files/pos/sammy_single.scala new file mode 100644 index 0000000000..7a3d272983 --- /dev/null +++ b/test/files/pos/sammy_single.scala @@ -0,0 +1,9 @@ +// test that dependent types work +// TODO: def apply(x: String): x.type does NOT work yet +object Test { + val s: String = "" + + trait T { def apply(x: s.type): s.type } + + val preservedResult: s.type = ((x => x): T)(s) +}
\ No newline at end of file diff --git a/test/files/pos/sammy_twice.flags b/test/files/pos/sammy_twice.flags new file mode 100644 index 0000000000..48fd867160 --- /dev/null +++ b/test/files/pos/sammy_twice.flags @@ -0,0 +1 @@ +-Xexperimental diff --git a/test/files/pos/sammy_twice.scala b/test/files/pos/sammy_twice.scala new file mode 100644 index 0000000000..c91f5b9fd2 --- /dev/null +++ b/test/files/pos/sammy_twice.scala @@ -0,0 +1,9 @@ +// test repeated synthesizeSAMFunction where the sam type is not fully defined +// the naive implementation would enter the same apply$body in the same scope twice +trait F[T, U] { def apply(x: T): U } + +class C { + def app[T, U](x: T)(f: F[T, U]): U = f(x) + app(1)(x => List(x)) + app(2)(x => List(x)) +}
\ No newline at end of file diff --git a/test/files/pos/t6221.scala b/test/files/pos/t6221.scala index dd7776f596..34f02859f3 100644 --- a/test/files/pos/t6221.scala +++ b/test/files/pos/t6221.scala @@ -7,23 +7,27 @@ class MyCollection[A] { class OtherFunc[-A, +B] {} object Test { - implicit def functionToMyFunc[A, B](f: A => B): MyFunc[A, B] = new MyFunc + implicit def functionToMyFunc[A, B](f: A => B): MyFunc[A, B] = new MyFunc // = new MyFunc[A,Nothing](); - implicit def otherFuncToMyFunc[A, B](f: OtherFunc[A, B]): MyFunc[A, B] = new MyFunc + implicit def otherFuncToMyFunc[A, B](f: OtherFunc[A, B]): MyFunc[A, B] = new MyFunc // = new MyFunc[A,Nothing](); def main(args: Array[String]) { val col = new MyCollection[Int] // Doesn't compile: error: missing parameter type for expanded function ((x$1) => x$1.toString) println(col.map(_.toString)) + // scala.this.Predef.println(col.map[String](Test.this.functionToMyFunc[Int, String](((x$1: Int) => x$1.toString())))); // Doesn't compile: error: missing parameter type println(col.map(x => x.toString)) + // scala.this.Predef.println(col.map[String](Test.this.functionToMyFunc[Int, String](((x: Int) => x.toString())))); // Does compile println(col.map((x: Int) => x.toString)) + // scala.this.Predef.println(col.map[String](Test.this.functionToMyFunc[Int, String](((x: Int) => x.toString())))); // Does compile (even though type params of OtherFunc not given) println(col.map(new OtherFunc)) + // scala.this.Predef.println(col.map[Nothing](Test.this.otherFuncToMyFunc[Any, Nothing](new OtherFunc[Any,Nothing]()))) } }
\ No newline at end of file diff --git a/test/files/run/sammy_java8.flags b/test/files/run/sammy_java8.flags new file mode 100644 index 0000000000..48fd867160 --- /dev/null +++ b/test/files/run/sammy_java8.flags @@ -0,0 +1 @@ +-Xexperimental diff --git a/test/files/run/sammy_java8.scala b/test/files/run/sammy_java8.scala new file mode 100644 index 0000000000..db9df7f5fe --- /dev/null +++ b/test/files/run/sammy_java8.scala @@ -0,0 +1,34 @@ +import scala.tools.partest._ + +// java8 version of sammy_poly.scala +object Test extends CompilerTest { + import global._ + + override lazy val units: List[CompilationUnit] = { + global.settings.Xexperimental.value = true + + // This test itself does not depend on JDK8. + javaCompilationUnits(global)(samSource) ++ + compilationUnits(global)(useSamSource) + } + + private def samSource = """ +// trait F[T, U] { def apply(x: T): U } +public interface F<T, U> { + U apply(T t); + default void yadayada() { + throw new UnsupportedOperationException("yadayada"); + } +} + """ + + private def useSamSource = """ +class T { + def app[T, U](x: T)(f: F[T, U]): U = f(x) + app(1)(x => List(x)) +} + """ + + // We're only checking we can compile it. + def check(source: String, unit: global.CompilationUnit): Unit = () +} diff --git a/test/files/run/t7398.scala b/test/files/run/t7398.scala index 493c4dcf40..4b46850768 100644 --- a/test/files/run/t7398.scala +++ b/test/files/run/t7398.scala @@ -21,6 +21,6 @@ public interface Iterator<E> { } """ - // We're only checking we can parse it. + // We're only checking we can compile it. def check(source: String, unit: global.CompilationUnit): Unit = () } |