diff options
Diffstat (limited to 'test')
51 files changed, 1931 insertions, 878 deletions
diff --git a/test/files/neg/divergent-implicit.check b/test/files/neg/divergent-implicit.check index 60d876409f..d4a3ddfc71 100644 --- a/test/files/neg/divergent-implicit.check +++ b/test/files/neg/divergent-implicit.check @@ -3,6 +3,10 @@ divergent-implicit.scala:4: error: type mismatch; required: String val x1: String = 1 ^ +divergent-implicit.scala:5: error: diverging implicit expansion for type Int => String +starting with method $conforms in object Predef + val x2: String = cast[Int, String](1) + ^ divergent-implicit.scala:14: error: type mismatch; found : Test2.Foo required: Test2.Bar @@ -13,4 +17,4 @@ divergent-implicit.scala:15: error: type mismatch; required: Test2.Bar val y: Bar = new Baz ^ -three errors found +four errors found diff --git a/test/files/neg/t5148.check b/test/files/neg/t5148.check index f426bd2010..8a667f4b88 100644 --- a/test/files/neg/t5148.check +++ b/test/files/neg/t5148.check @@ -1,5 +1,5 @@ -error: bad symbolic reference. A signature in Imports.class refers to type Request -in class scala.tools.nsc.interpreter.IMain which is not available. -It may be completely missing from the current classpath, or the version on -the classpath might be incompatible with the version used when compiling Imports.class. +error: bad symbolic reference to scala.tools.nsc.interpreter.IMain.Request encountered in class file 'Imports.class'. +Cannot access type Request in class scala.tools.nsc.interpreter.IMain. The current classpath may be +missing a definition for scala.tools.nsc.interpreter.IMain.Request, or Imports.class may have been compiled against a version that's +incompatible with the one found on the current classpath. one error found diff --git a/test/files/neg/t8265.check b/test/files/neg/t8265.check new file mode 100644 index 0000000000..7b1db1c4e5 --- /dev/null +++ b/test/files/neg/t8265.check @@ -0,0 +1,6 @@ +t8265.scala:1: warning: Construct depends on unsound variance analysis and will not compile in scala 2.11 and beyond +class Foo[+CC[X]] { type Coll = CC[_] } + ^ +error: No warnings can be incurred under -Xfatal-warnings. +one warning found +one error found diff --git a/test/files/neg/t8265.flags b/test/files/neg/t8265.flags new file mode 100644 index 0000000000..9d7ba7abd8 --- /dev/null +++ b/test/files/neg/t8265.flags @@ -0,0 +1 @@ +-Xsource:2.10 -deprecation -language:higherKinds -Xfatal-warnings diff --git a/test/files/neg/t8265.scala b/test/files/neg/t8265.scala new file mode 100644 index 0000000000..a215903ebc --- /dev/null +++ b/test/files/neg/t8265.scala @@ -0,0 +1 @@ +class Foo[+CC[X]] { type Coll = CC[_] } diff --git a/test/files/neg/t8430.check b/test/files/neg/t8430.check new file mode 100644 index 0000000000..7c6a73ce53 --- /dev/null +++ b/test/files/neg/t8430.check @@ -0,0 +1,27 @@ +t8430.scala:15: warning: match may not be exhaustive. +It would fail on the following inputs: ??, LetC, LetF, LetL(IntLit), LetP + (tree: Tree) => tree match {case LetL(CharLit) => ??? } + ^ +t8430.scala:16: warning: match may not be exhaustive. +It would fail on the following inputs: ??, LetC, LetF, LetL(IntLit), LetP + (tree: Tree) => tree match {case LetL(CharLit) => ??? } + ^ +t8430.scala:17: warning: match may not be exhaustive. +It would fail on the following inputs: ??, LetC, LetF, LetL(IntLit), LetP + (tree: Tree) => tree match {case LetL(CharLit) => ??? } + ^ +t8430.scala:18: warning: match may not be exhaustive. +It would fail on the following inputs: ??, LetC, LetF, LetL(IntLit), LetP + (tree: Tree) => tree match {case LetL(CharLit) => ??? } + ^ +t8430.scala:19: warning: match may not be exhaustive. +It would fail on the following inputs: ??, LetC, LetF, LetL(IntLit), LetP + (tree: Tree) => tree match {case LetL(CharLit) => ??? } + ^ +t8430.scala:20: warning: match may not be exhaustive. +It would fail on the following inputs: ??, LetC, LetF, LetL(IntLit), LetP + (tree: Tree) => tree match {case LetL(CharLit) => ??? } + ^ +error: No warnings can be incurred under -Xfatal-warnings. +6 warnings found +one error found diff --git a/test/files/neg/t8430.flags b/test/files/neg/t8430.flags new file mode 100644 index 0000000000..85d8eb2ba2 --- /dev/null +++ b/test/files/neg/t8430.flags @@ -0,0 +1 @@ +-Xfatal-warnings diff --git a/test/files/neg/t8430.scala b/test/files/neg/t8430.scala new file mode 100644 index 0000000000..4166b08a0a --- /dev/null +++ b/test/files/neg/t8430.scala @@ -0,0 +1,32 @@ +sealed trait CL3Literal +case object IntLit extends CL3Literal +case object CharLit extends CL3Literal +case object BooleanLit extends CL3Literal +case object UnitLit extends CL3Literal + + +sealed trait Tree +case class LetL(value: CL3Literal) extends Tree +case object LetP extends Tree +case object LetC extends Tree +case object LetF extends Tree + +object Test { + (tree: Tree) => tree match {case LetL(CharLit) => ??? } + (tree: Tree) => tree match {case LetL(CharLit) => ??? } + (tree: Tree) => tree match {case LetL(CharLit) => ??? } + (tree: Tree) => tree match {case LetL(CharLit) => ??? } + (tree: Tree) => tree match {case LetL(CharLit) => ??? } + (tree: Tree) => tree match {case LetL(CharLit) => ??? } + // After the first patch for SI-8430, we achieve stability: all of + // these get the same warning: + // + // ??, LetC, LetF, LetL(IntLit), LetP + // + // Before, it was non-deterministic. + // + // However, we our list of counter examples is itself non-exhaustive. + // We need to rework counter example generation to fix that. + // + // That work is the subject of SI-7746 +} diff --git a/test/files/neg/t8431.check b/test/files/neg/t8431.check new file mode 100644 index 0000000000..75351a8ae7 --- /dev/null +++ b/test/files/neg/t8431.check @@ -0,0 +1,27 @@ +t8431.scala:24: error: type mismatch; + found : CanBuildFrom[Invariant[Nothing]] + required: CanBuildFrom[Invariant[G]] + s.combined // fail + ^ +t8431.scala:24: error: value combined is not a member of Invariant[Nothing] + s.combined // fail + ^ +t8431.scala:35: error: type mismatch; + found : CanBuildFrom[Invariant[Nothing]] + required: CanBuildFrom[Invariant[G]] + s.combined // was okay! + ^ +t8431.scala:35: error: value combined is not a member of Invariant[Nothing] + s.combined // was okay! + ^ +t8431.scala:45: error: type mismatch; + found : CanBuildFrom[Invariant[Nothing]] + required: CanBuildFrom[Invariant[G]] + convert2(s).combined + ^ +t8431.scala:48: error: type mismatch; + found : CanBuildFrom[Invariant[Nothing]] + required: CanBuildFrom[Invariant[G]] + {val c1 = convert2(s); c1.combined} + ^ +6 errors found diff --git a/test/files/neg/t8431.scala b/test/files/neg/t8431.scala new file mode 100644 index 0000000000..032a1f394d --- /dev/null +++ b/test/files/neg/t8431.scala @@ -0,0 +1,63 @@ +trait Covariant[+A] +trait Invariant[A] extends Covariant[A @annotation.unchecked.uncheckedVariance] + +trait Combinable[G] { + def combined = 0 +} + +trait CanBuildFrom[+C] + +object C { + implicit def convert1[G, TRAVONCE[+e] <: Covariant[e]] + (xs: TRAVONCE[G]): Combinable[G] = ??? + + implicit def convert2[G, SET[e] <: Invariant[e]] + (xs: SET[_ <: G]) + (implicit cbf: CanBuildFrom[SET[G]]): Combinable[G] = ??? + + implicit def cbf[A]: CanBuildFrom[Invariant[A]] = ??? +} +// always failed +class Test1 { + import C.{cbf, convert1, convert2} + val s: Invariant[Nothing] = ??? + s.combined // fail +} +// didn't fail, now correctly fails +class Test2 { + import C.{cbf, convert2, convert1} + + val s: Invariant[Nothing] = ??? + + // Non-uniformity with Test1 was due to order of typechecking implicit candidates: + // the last candidate typechecked was the only one that could contribute undetermined type parameters + // to the enclosing context, due to mutation of `Context#undetparam` in `doTypedApply`. + s.combined // was okay! +} + + +class TestExplicit { + import C.{cbf, convert2} + + val s: Invariant[Nothing] = ??? + + // Now the implicit Test fail uniformly as per this explicit conversion + convert2(s).combined + + // Breaking this expression down doesn't make it work. + {val c1 = convert2(s); c1.combined} +} + +// These ones work before and after; infering G=Null doesn't need to contribute an undetermined type param. +class Test3 { + import C.{cbf, convert1, convert2} + val s: Invariant[Null] = ??? + s.combined // okay +} + +class Test4 { + import C.{cbf, convert2, convert1} + + val s: Invariant[Null] = ??? + s.combined // okay +} diff --git a/test/files/neg/t8450.check b/test/files/neg/t8450.check new file mode 100644 index 0000000000..eeabb9730c --- /dev/null +++ b/test/files/neg/t8450.check @@ -0,0 +1,6 @@ +t8450.scala:5: warning: implicit numeric widening + def elapsed: Foo = (System.nanoTime - 100L).foo + ^ +error: No warnings can be incurred under -Xfatal-warnings. +one warning found +one error found diff --git a/test/files/neg/t8450.flags b/test/files/neg/t8450.flags new file mode 100644 index 0000000000..9a1332d7af --- /dev/null +++ b/test/files/neg/t8450.flags @@ -0,0 +1 @@ +-Ywarn-numeric-widen -Xfatal-warnings
\ No newline at end of file diff --git a/test/files/neg/t8450.scala b/test/files/neg/t8450.scala new file mode 100644 index 0000000000..f20ed2bc31 --- /dev/null +++ b/test/files/neg/t8450.scala @@ -0,0 +1,12 @@ +trait Foo + +class WarnWidening { + implicit class FooDouble(d: Double) { def foo = new Foo {} } + def elapsed: Foo = (System.nanoTime - 100L).foo +} + +class NoWarnWidening { + implicit class FooLong(l: Long) { def foo = new Foo {} } + implicit class FooDouble(d: Double) { def foo = new Foo {} } + def elapsed: Foo = (System.nanoTime - 100L).foo +} diff --git a/test/files/neg/t8463.check b/test/files/neg/t8463.check new file mode 100644 index 0000000000..1a3eea2870 --- /dev/null +++ b/test/files/neg/t8463.check @@ -0,0 +1,10 @@ +t8463.scala:5: error: type mismatch; + found : Long + required: ?T[Long] +Note that implicit conversions are not applicable because they are ambiguous: + both method longWrapper in class LowPriorityImplicits of type (x: Long)scala.runtime.RichLong + and method ArrowAssoc in object Predef of type [A](self: A)ArrowAssoc[A] + are possible conversion functions from Long to ?T[Long] + insertCell(Foo(5)) + ^ +one error found diff --git a/test/files/neg/t8463.scala b/test/files/neg/t8463.scala new file mode 100644 index 0000000000..7c954fd834 --- /dev/null +++ b/test/files/neg/t8463.scala @@ -0,0 +1,38 @@ +object Test { + case class Foo[+T[_]](activity:T[Long]) + type Cell[T] = T + def insertCell(u:Foo[Cell]) = ??? + insertCell(Foo(5)) +} + +/* If SI-8230 is fixed, and `viewExists` is changed to no longer leak + ambiguity errors, you might expect the check file for this test to + change as folloes: + +@@ -1,18 +1,10 @@ +-t8463.scala:5: error: no type parameters for method apply: (activity: +- --- because --- +-argument expression's type is not compatible with formal parameter ty ++t8463.scala:5: error: type mismatch; + found : Long + required: ?T[Long] ++Note that implicit conversions are not applicable because they are am ++ both method longWrapper in class LowPriorityImplicits of type (x: Lo ++ and method ArrowAssoc in object Predef of type [A](self: A)ArrowAsso ++ are possible conversion functions from Long to ?T[Long] + insertCell(Foo(5)) +- ^ +-t8463.scala:5: error: type mismatch; +- found : Long(5L) +- required: T[Long] +- insertCell(Foo(5)) +- ^ +-t8463.scala:5: error: type mismatch; +- found : Test.Foo[T] +- required: Test.Foo[Test.Cell] +- insertCell(Foo(5)) +- ^ +-three errors found ++ ^ ++one error found +*/ diff --git a/test/files/pos/t8403.scala b/test/files/pos/t8403.scala new file mode 100644 index 0000000000..eea60ed7ff --- /dev/null +++ b/test/files/pos/t8403.scala @@ -0,0 +1,9 @@ +trait Bug { + val u: { type Amb } = ??? + import u._ + + class Amb { def x = 0 } + class C(x: Amb) { // after dbd8457e4, "reference to Amb is ambiguous" + x.x + } +} diff --git a/test/files/pos/t8411/Macros_1.scala b/test/files/pos/t8411/Macros_1.scala new file mode 100644 index 0000000000..c5319c559c --- /dev/null +++ b/test/files/pos/t8411/Macros_1.scala @@ -0,0 +1,10 @@ +import scala.language.experimental.macros +import scala.reflect.macros.blackbox.Context + +object Macros { + def defaultZeroCase(pf: PartialFunction[Int, Int]): PartialFunction[Int, Int] = macro impl + def impl(c: Context)(pf: c.Tree) = { import c.universe._ + val q"{ case ..$cases }" = pf + q"{ case ..$cases case _ => 0 }" + } +} diff --git a/test/files/pos/t8411/Test_2.scala b/test/files/pos/t8411/Test_2.scala new file mode 100644 index 0000000000..a0ad30f0f5 --- /dev/null +++ b/test/files/pos/t8411/Test_2.scala @@ -0,0 +1,4 @@ +object Test extends App { + val pf = Macros.defaultZeroCase { case 1 => 2 } + assert(pf(2) == 0) +} diff --git a/test/files/pos/t8460.scala b/test/files/pos/t8460.scala new file mode 100644 index 0000000000..10d2ed432c --- /dev/null +++ b/test/files/pos/t8460.scala @@ -0,0 +1,25 @@ +object tan extends UFunc { + implicit def ImplDouble: Impl[Double, Double] = ??? +} + +trait UFunc { + trait TC[+A] + type Impl[V, VR] = UFunc.UImpl[this.type, V, VR] +} + +object UFunc { + class UImpl[A, B, C] + implicit def implicitDoubleUTag[Tag, V, VR](implicit conv: V=>Double, impl: UImpl[Tag, Double, VR]):UImpl[Tag, V, VR] = ??? + +} + +object Test { + implicitly[tan.Impl[Double, Double]] + // we should discard the one and only divergent implicit (`implicitDoubleUTag`) + // This is done under `scalac-hash v2.10.4 test.scala`, but not under + // `scalac-hash v2.10.4 -Xdivergence211 test.scala` + // + // This seems to be because the companion implicits contain redundant entries + // + +} diff --git a/test/files/pos/t8497/A_1.scala b/test/files/pos/t8497/A_1.scala new file mode 100644 index 0000000000..6a76b0ee99 --- /dev/null +++ b/test/files/pos/t8497/A_1.scala @@ -0,0 +1,13 @@ +package p { + object Crash { + def e(s: (String @java.lang.Deprecated)): Unit = () + def f(s: (String @nonStatic)): Unit = () + } + object Ok { + def g(s: (String @nonStatic @static)): Unit = () + def h(s: (String @static)): Unit = () + } +} + +class nonStatic extends scala.annotation.Annotation +class static extends scala.annotation.StaticAnnotation diff --git a/test/files/pos/t8497/B_2.scala b/test/files/pos/t8497/B_2.scala new file mode 100644 index 0000000000..efe2edf2c3 --- /dev/null +++ b/test/files/pos/t8497/B_2.scala @@ -0,0 +1 @@ +package p { object Test { Crash } } diff --git a/test/files/run/mirror_symbolof_x.check b/test/files/run/mirror_symbolof_x.check new file mode 100644 index 0000000000..cc9cad7a13 --- /dev/null +++ b/test/files/run/mirror_symbolof_x.check @@ -0,0 +1,13 @@ +class Int +object C +type T +type Id +class Nothing +class Null +class Int +object C +type T +type Id +class Nothing +class Null +exception: class C not found. diff --git a/test/files/run/mirror_symbolof_x.scala b/test/files/run/mirror_symbolof_x.scala new file mode 100644 index 0000000000..8fec301f56 --- /dev/null +++ b/test/files/run/mirror_symbolof_x.scala @@ -0,0 +1,43 @@ +import scala.reflect.runtime.universe._ +import scala.reflect.runtime.{universe => ru} +import scala.reflect.runtime.{currentMirror => cm} +import scala.reflect.api.Mirror + +class C +object C + +object Test extends App { + object test1 { + val m = cm + type T = Int + type Id[X] = X + println(m.symbolOf[Int]: ru.TypeSymbol) + println(m.symbolOf[C.type]: ru.TypeSymbol) + println(m.symbolOf[T]: ru.TypeSymbol) + println(m.symbolOf[Id[_]]: ru.TypeSymbol) + println(m.symbolOf[Nothing]: ru.TypeSymbol) + println(m.symbolOf[Null]: ru.TypeSymbol) + } + + object test2 { + val m: Mirror[ru.type] = cm + type T = Int + type Id[X] = X + println(m.symbolOf[Int]: ru.TypeSymbol) + println(m.symbolOf[C.type]: ru.TypeSymbol) + println(m.symbolOf[T]: ru.TypeSymbol) + println(m.symbolOf[Id[_]]: ru.TypeSymbol) + println(m.symbolOf[Nothing]: ru.TypeSymbol) + println(m.symbolOf[Null]: ru.TypeSymbol) + } + + object test3 { + val m = ru.runtimeMirror(classOf[Int].getClass.getClassLoader) + try println(m.symbolOf[C]) + catch { case ex: ScalaReflectionException => println(s"exception: ${ex.getMessage}") } + } + + test1 + test2 + test3 +} diff --git a/test/files/run/t6196.scala b/test/files/run/t6196.scala index 16c2c7409d..a75911fb9e 100644 --- a/test/files/run/t6196.scala +++ b/test/files/run/t6196.scala @@ -43,7 +43,7 @@ object Test extends App { override def equals(that:Any) = { equalsCount += 1 - this match { + that match { case HashCounter(value) => this.value == value case _ => false } diff --git a/test/files/run/t6200.scala b/test/files/run/t6200.scala index 9a5d91e042..75600cd557 100644 --- a/test/files/run/t6200.scala +++ b/test/files/run/t6200.scala @@ -43,7 +43,7 @@ object Test extends App { override def equals(that: Any) = { equalsCount += 1 - this match { + that match { case HashCounter(value) => this.value == value case _ => false } diff --git a/test/files/run/t6440.check b/test/files/run/t6440.check index 806279fb74..27d5d1380e 100644 --- a/test/files/run/t6440.check +++ b/test/files/run/t6440.check @@ -1,4 +1,4 @@ -pos: source-newSource1.scala,line-9,offset=109 bad symbolic reference. A signature in U.class refers to term pack1 -in package <root> which is not available. -It may be completely missing from the current classpath, or the version on -the classpath might be incompatible with the version used when compiling U.class. ERROR +pos: source-newSource1.scala,line-9,offset=109 bad symbolic reference to <root>.pack1 encountered in class file 'U.class'. +Cannot access term pack1 in package <root>. The current classpath may be +missing a definition for <root>.pack1, or U.class may have been compiled against a version that's +incompatible with the one found on the current classpath. ERROR diff --git a/test/files/run/t6440b.check b/test/files/run/t6440b.check index 9771ce5efb..0b642c2c35 100644 --- a/test/files/run/t6440b.check +++ b/test/files/run/t6440b.check @@ -1,4 +1,4 @@ -pos: NoPosition bad symbolic reference. A signature in U.class refers to type T -in package pack1 which is not available. -It may be completely missing from the current classpath, or the version on -the classpath might be incompatible with the version used when compiling U.class. ERROR +pos: NoPosition bad symbolic reference to pack1.T encountered in class file 'U.class'. +Cannot access type T in package pack1. The current classpath may be +missing a definition for pack1.T, or U.class may have been compiled against a version that's +incompatible with the one found on the current classpath. ERROR diff --git a/test/files/run/t7992.scala b/test/files/run/t7992.scala new file mode 100644 index 0000000000..fde231b961 --- /dev/null +++ b/test/files/run/t7992.scala @@ -0,0 +1,20 @@ +class C { + def foo: Int = 0 +} + +class D extends C { + override def foo: Int = { + val f = () => { + class C // comment this line to fix. + D.super.foo // no super accessor generated here! + // java.lang.VerifyError: (class: D$$anonfun$1, method: apply$mcI$sp signature: ()I) Illegal use of nonvirtual function call + } + f() + } +} + +object Test { + def main(args: Array[String]) { + new D().foo + } +} diff --git a/test/files/run/t7992b.scala b/test/files/run/t7992b.scala new file mode 100644 index 0000000000..6fe1f990d5 --- /dev/null +++ b/test/files/run/t7992b.scala @@ -0,0 +1,18 @@ +class C { + def foo: Int = 0 +} + +class E extends C { + override def foo: Int = { + (None: Option[Int]).getOrElse { + class C + E.super.foo + } + } +} + +object Test { + def main(args: Array[String]) { + new E().foo + } +} diff --git a/test/files/run/t8266-octal-interp.check b/test/files/run/t8266-octal-interp.check index 6e9454119b..66ecafddc2 100644 --- a/test/files/run/t8266-octal-interp.check +++ b/test/files/run/t8266-octal-interp.check @@ -10,7 +10,7 @@ t8266-octal-interp.scala:6: warning: Octal escape literals are deprecated, use \ t8266-octal-interp.scala:7: warning: Octal escape literals are deprecated, use \r instead. f"a\15c", ^ -t8266-octal-interp.scala:8: warning: Octal escape literals are deprecated, use \u0022 instead. +t8266-octal-interp.scala:8: warning: Octal escape literals are deprecated, use ${'"'} or a triple-quoted literal """with embedded " or \u0022""" instead. f"a\42c", ^ t8266-octal-interp.scala:9: warning: Octal escape literals are deprecated, use \\ instead. diff --git a/test/files/run/t8425.check b/test/files/run/t8425.check new file mode 100644 index 0000000000..8379fa0a74 --- /dev/null +++ b/test/files/run/t8425.check @@ -0,0 +1 @@ +List(fresh$macro$1, $macro$2) diff --git a/test/files/run/t8425/Macros_1.scala b/test/files/run/t8425/Macros_1.scala new file mode 100644 index 0000000000..71a96518e8 --- /dev/null +++ b/test/files/run/t8425/Macros_1.scala @@ -0,0 +1,12 @@ +import scala.language.experimental.macros +import scala.reflect.macros.blackbox.Context + +object Macros { + def foo: Unit = macro impl + def impl(c: Context) = { + import c.universe._ + val test1 = c.freshName() + val test2 = c.freshName("$") + q"println(List($test1, $test2))" + } +}
\ No newline at end of file diff --git a/test/files/run/t8425/Test_2.scala b/test/files/run/t8425/Test_2.scala new file mode 100644 index 0000000000..acfddae942 --- /dev/null +++ b/test/files/run/t8425/Test_2.scala @@ -0,0 +1,3 @@ +object Test extends App { + Macros.foo +}
\ No newline at end of file diff --git a/test/files/run/t8428.scala b/test/files/run/t8428.scala new file mode 100644 index 0000000000..7da1207b7b --- /dev/null +++ b/test/files/run/t8428.scala @@ -0,0 +1,12 @@ +object Test extends App { + val xs = List.tabulate(4)(List(_)) + val i = xs.map(_.iterator).reduce { (a,b) => + a.hasNext + a ++ b + } + + val r1 = i.toList + val r2 = xs.flatten.toList + + assert(r1 == r2, r1) +} diff --git a/test/files/run/t8437.check b/test/files/run/t8437.check new file mode 100644 index 0000000000..fd3c81a4d7 --- /dev/null +++ b/test/files/run/t8437.check @@ -0,0 +1,2 @@ +5 +5 diff --git a/test/files/run/t8437/Macros_1.scala b/test/files/run/t8437/Macros_1.scala new file mode 100644 index 0000000000..6286ea2a8c --- /dev/null +++ b/test/files/run/t8437/Macros_1.scala @@ -0,0 +1,18 @@ +import scala.language.experimental.macros +import scala.reflect.macros._ + +abstract class AbstractBundle(val c: blackbox.Context) { + import c.Expr + import c.universe._ + def foo: Expr[Int] = Expr[Int](q"5") +} + +class ConcreteBundle(override val c: blackbox.Context) extends AbstractBundle(c) { + import c.Expr + val bar: Expr[Int] = foo +} + +object InvokeBundle { + def foo: Int = macro ConcreteBundle.foo // nope + def bar: Int = macro ConcreteBundle.bar // yep +}
\ No newline at end of file diff --git a/test/files/run/t8437/Test_2.scala b/test/files/run/t8437/Test_2.scala new file mode 100644 index 0000000000..47bb84ad0e --- /dev/null +++ b/test/files/run/t8437/Test_2.scala @@ -0,0 +1,4 @@ +object Test extends App { + println(InvokeBundle.foo) + println(InvokeBundle.bar) +}
\ No newline at end of file diff --git a/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala b/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala index 69aef12668..fd810674f5 100644 --- a/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala +++ b/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala @@ -90,6 +90,15 @@ trait ClassConstruction { self: QuasiquoteProperties => val args = q"val a: Int; val b: Int" assertEqAst(q"class C(implicit ..$args)", "class C(implicit val a: Int, val b: Int)") } + + property("SI-8451: inline secondary constructors") = test { + assertEqAst(q"class C(x: Int) { def this() = this(0) }", "class C(x: Int) { def this() = this(0) }") + } + + property("SI-8451: unquoted secondary constructors") = test { + val secondaryCtor = q"def this() = this(0)" + assertEqAst(q"class C(x: Int) { $secondaryCtor }", "class C(x: Int) { def this() = this(0) }") + } } trait TraitConstruction { self: QuasiquoteProperties => diff --git a/test/files/scalacheck/quasiquotes/DefinitionDeconstructionProps.scala b/test/files/scalacheck/quasiquotes/DefinitionDeconstructionProps.scala index af7f2164a0..2c0e100b5a 100644 --- a/test/files/scalacheck/quasiquotes/DefinitionDeconstructionProps.scala +++ b/test/files/scalacheck/quasiquotes/DefinitionDeconstructionProps.scala @@ -229,6 +229,12 @@ trait DefDeconstruction { self: QuasiquoteProperties => val q"def foo(...$argss)(implicit ..$impl)" = q"def foo(x: Int)" assert(impl.isEmpty) } + + property("SI-8451") = test { + val q"def this(..$params) = this(..$args)" = q"def this(x: Int) = this(0)" + assert(params ≈ List(q"${Modifiers(PARAM)} val x: Int")) + assert(args ≈ List(q"0")) + } } trait ImportDeconstruction { self: QuasiquoteProperties => diff --git a/test/files/scalacheck/quasiquotes/ErrorProps.scala b/test/files/scalacheck/quasiquotes/ErrorProps.scala index 3d9b27de77..2cba07abf2 100644 --- a/test/files/scalacheck/quasiquotes/ErrorProps.scala +++ b/test/files/scalacheck/quasiquotes/ErrorProps.scala @@ -9,9 +9,10 @@ object ErrorProps extends QuasiquoteProperties("errors") { """) property("can't unquote with given rank") = fails( - "Can't unquote List[reflect.runtime.universe.Ident], consider using ..", + "Can't unquote List[StringBuilder], consider using .. or providing an implicit instance of Liftable[List[StringBuilder]]", """ - val xs = List(q"x", q"x") + import java.lang.StringBuilder + val xs: List[StringBuilder] = Nil q"$xs" """) @@ -71,9 +72,10 @@ object ErrorProps extends QuasiquoteProperties("errors") { """) property("use ... rank or provide liftable") = fails( - "Can't unquote List[List[reflect.runtime.universe.Ident]], consider using ...", + "Can't unquote List[List[StringBuilder]], consider using ... or providing an implicit instance of Liftable[List[List[StringBuilder]]]", """ - val xs = List(List(q"x", q"x")) + import java.lang.StringBuilder + val xs: List[List[StringBuilder]] = Nil q"$xs" """) @@ -172,6 +174,40 @@ object ErrorProps extends QuasiquoteProperties("errors") { tq"_" """) + property("SI-8420: don't crash on splicing of non-unliftable native type (1)") = fails( + "Can't unquote List[reflect.runtime.universe.Symbol] with .., consider omitting the dots or providing an implicit instance of Liftable[reflect.runtime.universe.Symbol]", + """ + val l: List[Symbol] = Nil + q"f(..$l)" + """) + + property("SI-8420: don't crash on splicing of non-unliftable native type (2)") = fails( + "Can't unquote List[reflect.runtime.universe.FlagSet] with .., consider omitting the dots or providing an implicit instance of Liftable[reflect.runtime.universe.FlagSet]", + """ + val l: List[FlagSet] = Nil + q"f(..$l)" + """) + + property("SI-8420: don't crash on splicing of non-unliftable native type (3)") = fails( + "Can't unquote List[reflect.runtime.universe.Modifiers] with .., consider omitting the dots or providing an implicit instance of Liftable[reflect.runtime.universe.Modifiers]", + """ + val l: List[Modifiers] = Nil + q"f(..$l)" + """) + + property("SI-8451 construction: disallow everything except for constructor calls in secondary constructor bodies") = fails( + "'this' expected but unquotee found", + """ + val rhs1 = q"this(0)" + val ctor1 = q"def this(x: Int) = $rhs1" + """) + + property("SI-8451 deconstruction: disallow everything except for constructor calls in secondary constructor bodies") = fails( + "'this' expected but unquotee found", + """ + val q"def this(..$params) = $rhs2" = q"def this(x: Int) = this(0)" + """) + // // Make sure a nice error is reported in this case // { import Flag._; val mods = NoMods; q"lazy $mods val x: Int" } } diff --git a/test/files/scalacheck/quasiquotes/LiftableProps.scala b/test/files/scalacheck/quasiquotes/LiftableProps.scala index 5d0eeb53c6..a4c57ac359 100644 --- a/test/files/scalacheck/quasiquotes/LiftableProps.scala +++ b/test/files/scalacheck/quasiquotes/LiftableProps.scala @@ -88,9 +88,10 @@ object LiftableProps extends QuasiquoteProperties("liftable") { assert(q"$const" ≈ q"0") } + val immutable = q"$scalapkg.collection.immutable" + property("lift list variants") = test { val lst = List(1, 2) - val immutable = q"$scalapkg.collection.immutable" assert(q"$lst" ≈ q"$immutable.List(1, 2)") assert(q"f(..$lst)" ≈ q"f(1, 2)") val llst = List(List(1), List(2)) @@ -98,6 +99,11 @@ object LiftableProps extends QuasiquoteProperties("liftable") { assert(q"f(...$llst)" ≈ q"f(1)(2)") } + property("lift list of tree") = test { + val lst = List(q"a", q"b") + assert(q"$lst" ≈ q"$immutable.List(a, b)") + } + property("lift tuple") = test { assert(q"${(1, 2)}" ≈ q"(1, 2)") assert(q"${(1, 2, 3)}" ≈ q"(1, 2, 3)") @@ -158,4 +164,11 @@ object LiftableProps extends QuasiquoteProperties("liftable") { val right3: Either[Int, Int] = Right(1) assert(q"$right3" ≈ q"scala.util.Right(1)") } + + property("lift xml comment") = test { + implicit val liftXmlComment = Liftable[xml.Comment] { comment => + q"new _root_.scala.xml.Comment(${comment.commentText})" + } + assert(q"${xml.Comment("foo")}" ≈ q"<!--foo-->") + } } diff --git a/test/files/scalacheck/quasiquotes/TermDeconstructionProps.scala b/test/files/scalacheck/quasiquotes/TermDeconstructionProps.scala index 9e60729c09..49ffaff630 100644 --- a/test/files/scalacheck/quasiquotes/TermDeconstructionProps.scala +++ b/test/files/scalacheck/quasiquotes/TermDeconstructionProps.scala @@ -222,4 +222,28 @@ object TermDeconstructionProps extends QuasiquoteProperties("term deconstruction val q"{ case ..$cases }" = q"{ case a => b case c => d }" val List(cq"a => b", cq"c => d") = cases } + + property("SI-8350 `new C` and `new C()` are equivalent") = test { + val q"new C" = q"new C()" + val q"new C()" = q"new C" + } + + property("SI-8350 new applications extracted only for non-empty ctor calls") = test{ + val q"new $c1" = q"new C()" + assert(c1 ≈ tq"C") + val q"new $c2" = q"new C(x)" + assert(c2 ≈ q"${tq"C"}(x)") + } + + property("SI-8350 original test case") = test { + val q"new ..$parents" = q"new Foo with Bar" + assert(parents ≈ List(tq"Foo", tq"Bar")) + } + + property("SI-8387 new is not an application") = test { + val `new` = q"new F(x)" + val q"$f(...$argss)" = `new` + assert(f ≈ `new`) + assert(argss.isEmpty) + } } diff --git a/test/files/scalacheck/quasiquotes/TypecheckedProps.scala b/test/files/scalacheck/quasiquotes/TypecheckedProps.scala index 7c4cb0306e..a5d526191f 100644 --- a/test/files/scalacheck/quasiquotes/TypecheckedProps.scala +++ b/test/files/scalacheck/quasiquotes/TypecheckedProps.scala @@ -2,32 +2,13 @@ import org.scalacheck._, Prop._, Gen._, Arbitrary._ import scala.reflect.runtime.universe._, Flag._, internal.reificationSupport._ object TypecheckedProps extends QuasiquoteProperties("typechecked") { - def original(tree: Tree) = tree match { - case tt: TypeTree => Some(tt.original) - case _ => None - } - def originals(trees: List[Tree]) = trees.flatMap(original) - val int = ScalaDot(TypeName("Int")) - val intint = List(int, int) + property("tuple term") = test { val q"(..$elements)" = typecheck(q"(1, 2)") assert(elements ≈ List(q"1", q"2")) } - property("tuple type") = test { - val tq"(..$els0)" = typecheckTyp(tq"Unit") - assert(els0.isEmpty) - val tq"(..$els1)" = typecheckTyp(tq"(Int, Int)") - assert(originals(els1) ≈ intint) - } - - property("function type") = test { - val tq"(..$argtpes) => $restpe" = typecheckTyp(tq"(Int, Int) => Int") - assert(originals(argtpes) ≈ intint) - assert(original(restpe).get ≈ int) - } - property("for/for-yield") = test { val enums = fq"x <- xs" :: fq"x1 = x + 1" :: fq"if x1 % 2 == 0" :: Nil val body = q"x1" @@ -152,4 +133,84 @@ object TypecheckedProps extends QuasiquoteProperties("typechecked") { assert(name == defName) assert(rhs ≈ defRhs) } + + property("partial function") = test { + val q"{ case ..$cases }: $ascr" = typecheck(q"{ case 1 => () }: PartialFunction[Int, Unit]") + assert(cases ≈ q"{ case 1 => () }".cases) + } +} + +trait TypecheckedTypes { self: QuasiquoteProperties => + property("type ident") = test { + val q"$_; type $_ = $tpt" = typecheck(q"class C; type T = C") + val tq"C" = tpt + } + + property("type select") = test { + val tq"scala.Int" = typecheckTyp(tq"Int") + } + + property("this type select") = test { + val q"class $_ { $_; type $_ = $tpt }" = typecheck(q"class C { type A = Int; type B = this.A }") + val tq"this.$name" = tpt + val TypeName("A") = name + } + + property("super type select") = test { + val q"$_; class $_ extends $_ { type $_ = $tpt }" = + typecheck(q"class C1 { type A = Int }; class C2 extends C1 { type B = super[C1].A }") + val tq"$empty.super[$c1].$a" = tpt + val TypeName("") = empty + val TypeName("C1") = c1 + val TypeName("A") = a + } + + property("applied type") = test { + val tt = typecheckTyp(q"Map[Int, Int]") + val tq"$tpt[..$tpts]" = tt + val tq"scala.this.Predef.Map" = tpt + val List(tq"scala.Int", tq"scala.Int") = tpts + } + + property("tuple type") = test { + val tq"(..$els0)" = typecheckTyp(tq"Unit") + assert(els0.isEmpty) + val tq"(..$els1)" = typecheckTyp(tq"(Int, Int)") + val List(tq"scala.Int", tq"scala.Int") = els1 + } + + property("function type") = test { + val tq"(..$argtpes) => $restpe" = typecheckTyp(tq"(Int, Int) => Int") + val List(tq"scala.Int", tq"scala.Int") = argtpes + val tq"scala.Int" = restpe + } + + property("compound type") = test { + val tq"..$parents { ..$defns }" = typecheckTyp(tq"Int { def x: Int }") + val List(tq"Int") = parents + val List(q"def x: Int") = defns + } + + property("singleton type") = test { + val tq"$ref.type" = typecheckTyp(tq"scala.Predef.type") + val q"scala.Predef" = ref + } + + property("type projection") = test { + val tq"$tpt#$name" = typecheckTyp(tq"({ type T = Int })#T") + val TypeName("T") = name + val tq"{ type T = Int }" = tpt + } + + property("annotated type") = test { + val tq"$tpt @$annot" = typecheckTyp(tq"Int @unchecked") + val tq"scala.Int" = tpt + val q"new unchecked" = annot + } + + property("existential type") = test { + val tq"$tpt forSome { ..$defns }" = typecheckTyp(tq"T forSome { type T }") + val tq"T" = tpt + val q"type T" :: Nil = defns + } } diff --git a/test/files/scalacheck/quasiquotes/UnliftableProps.scala b/test/files/scalacheck/quasiquotes/UnliftableProps.scala index 1d7629aa29..659b18edab 100644 --- a/test/files/scalacheck/quasiquotes/UnliftableProps.scala +++ b/test/files/scalacheck/quasiquotes/UnliftableProps.scala @@ -155,4 +155,12 @@ object UnliftableProps extends QuasiquoteProperties("unliftable") { assert(t21 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21)) assert(t22 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22)) } + + property("unlift xml comment") = test { + implicit val unliftXmlComment = Unliftable[xml.Comment] { + case q"new _root_.scala.xml.Comment(${value: String})" => xml.Comment(value) + } + val q"${comment: xml.Comment}" = q"<!--foo-->" + assert(comment.commentText == "foo") + } } diff --git a/test/junit/scala/reflect/internal/MirrorsTest.scala b/test/junit/scala/reflect/internal/MirrorsTest.scala index 8f2a92f27a..9108af139f 100644 --- a/test/junit/scala/reflect/internal/MirrorsTest.scala +++ b/test/junit/scala/reflect/internal/MirrorsTest.scala @@ -1,22 +1,18 @@ -// looks like tests are compiled by the old version of compiler -// therefore certain scala-reflect tests give me AMEs after the SI-8063 overhaul -// TODO: fix this in build.xml +package scala.reflect.internal -// package scala.reflect.internal +import org.junit.Assert._ +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 -// import org.junit.Assert._ -// import org.junit.Test -// import org.junit.runner.RunWith -// import org.junit.runners.JUnit4 - -// @RunWith(classOf[JUnit4]) -// class MirrorsTest { -// @Test def rootCompanionsAreConnected(): Unit = { -// val cm = scala.reflect.runtime.currentMirror -// import cm._ -// assertEquals("RootPackage.moduleClass == RootClass", RootClass, RootPackage.moduleClass) -// assertEquals("RootClass.module == RootPackage", RootPackage, RootClass.module) -// assertEquals("EmptyPackage.moduleClass == EmptyPackageClass", EmptyPackageClass, EmptyPackage.moduleClass) -// assertEquals("EmptyPackageClass.module == EmptyPackage", EmptyPackage, EmptyPackageClass.module) -// } -// }
\ No newline at end of file +@RunWith(classOf[JUnit4]) +class MirrorsTest { + @Test def rootCompanionsAreConnected(): Unit = { + val cm = scala.reflect.runtime.currentMirror + import cm._ + assertEquals("RootPackage.moduleClass == RootClass", RootClass, RootPackage.moduleClass) + assertEquals("RootClass.module == RootPackage", RootPackage, RootClass.module) + assertEquals("EmptyPackage.moduleClass == EmptyPackageClass", EmptyPackageClass, EmptyPackage.moduleClass) + assertEquals("EmptyPackageClass.module == EmptyPackage", EmptyPackage, EmptyPackageClass.module) + } +}
\ No newline at end of file diff --git a/test/junit/scala/reflect/internal/PrintersTest.scala b/test/junit/scala/reflect/internal/PrintersTest.scala index 62cb401aa9..4587417a99 100644 --- a/test/junit/scala/reflect/internal/PrintersTest.scala +++ b/test/junit/scala/reflect/internal/PrintersTest.scala @@ -1,824 +1,1164 @@ -// looks like tests are compiled by the old version of compiler -// therefore certain scala-reflect tests give me AMEs after the SI-8063 overhaul -// TODO: fix this in build.xml +package scala.reflect.internal -// package scala.reflect.internal +import org.junit.Test +import org.junit.Assert._ +import scala.tools.reflect._ +import scala.reflect.runtime.universe._ +import scala.reflect.runtime.{currentMirror=>cm} +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 -// import org.junit.Test -// import org.junit.Assert._ -// import scala.tools.reflect._ -// import scala.reflect.runtime.universe._ -// import scala.reflect.runtime.{currentMirror=>cm} -// import org.junit.runner.RunWith -// import org.junit.runners.JUnit4 +@RunWith(classOf[JUnit4]) +class PrintersTest extends BasePrintTests + with ClassPrintTests + with TraitPrintTests + with ValAndDefPrintTests + with QuasiTreesPrintTests + with PackagePrintTests -// @RunWith(classOf[JUnit4]) -// class PrintersTest extends BasePrintTests -// with ClassPrintTests -// with TraitPrintTests -// with ValAndDefPrintTests -// with QuasiTreesPrintTests -// with PackagePrintTests +object PrinterHelper { + val toolbox = cm.mkToolBox() -// object PrinterHelper { -// val toolbox = cm.mkToolBox() -// def assertPrintedCode(code: String, tree: Tree = EmptyTree) = { -// def processEOL(resultCode: String) = { -// import scala.reflect.internal.Chars._ -// resultCode.replaceAll(s"$CR$LF", s"$LF").replace(CR, LF) -// } + import scala.reflect.internal.Chars._ + private def normalizeEOL(resultCode: String) = + resultCode.lines mkString s"$LF" -// val toolboxTree = -// try{ -// toolbox.parse(code) -// } catch { -// case e:scala.tools.reflect.ToolBoxError => throw new Exception(e.getMessage + ": " + code) -// } -// if (tree ne EmptyTree) assertEquals("using quasiquote or given tree"+"\n", code.trim, processEOL(showCode(tree))) -// else assertEquals("using toolbox parser", code.trim, processEOL(showCode(toolboxTree))) -// } + def assertResultCode(code: String)(parsedCode: String = "", typedCode: String = "", wrap: Boolean = false, printRoot: Boolean = false) = { + def toolboxTree(tree: => Tree) = try{ + tree + } catch { + case e:scala.tools.reflect.ToolBoxError => throw new Exception(e.getMessage + ": " + code) + } -// implicit class StrContextStripMarginOps(val stringContext: StringContext) extends util.StripMarginInterpolator -// } + def wrapCode(source: String) = { + val context = sm""" + |trait PrintersContext { + | class baz extends scala.annotation.StaticAnnotation; + | class foo1[A, B] extends scala.annotation.StaticAnnotation; + | class foo2[A, B](a: scala.Int)(b: scala.Int) extends scala.annotation.StaticAnnotation; + | class foo3[Af, Bf](a: scala.Int)(b: scala.Float, c: PrintersContext.this.foo1[Af, Bf]) extends scala.annotation.StaticAnnotation; + | trait A1; + | trait B1; + |${source.trim.lines map {" " + _} mkString s"$LF"} + |}""" -// import PrinterHelper._ + if (wrap) context.trim() else source.trim + } -// trait BasePrintTests { -// @Test def testIdent = assertPrintedCode("*", Ident("*")) + val parsedTree = toolboxTree(toolbox.parse(wrapCode(code))) + if (!parsedCode.isEmpty()) + assertEquals("using toolbox parser" + LF, wrapCode(parsedCode), normalizeEOL(showCode(parsedTree))) + if (!typedCode.isEmpty()) { + val typedTree = toolboxTree(toolbox.typecheck(parsedTree)) + assertEquals("using toolbox typechecker" + LF, wrapCode(typedCode), normalizeEOL(showCode(typedTree, printRootPkg = printRoot))) + } + } -// @Test def testConstant1 = assertPrintedCode("\"*\"", Literal(Constant("*"))) + def assertTreeCode(tree: Tree)(code: String) = { + assertEquals("using quasiquote or given tree"+LF, code.trim, normalizeEOL(showCode(tree))) + } -// @Test def testConstant2 = assertPrintedCode("42", Literal(Constant(42))) + def assertPrintedCode(source: String, checkTypedTree: Boolean = true, wrapCode: Boolean = false) = { + if (checkTypedTree) + assertResultCode(source)(source, source, wrapCode) + else assertResultCode(source)(parsedCode = source, wrap = wrapCode) + } -// @Test def testConstantFloat = assertPrintedCode("42.0F", Literal(Constant(42f))) - -// @Test def testConstantDouble = assertPrintedCode("42.0", Literal(Constant(42d))) - -// @Test def testConstantLong = assertPrintedCode("42L", Literal(Constant(42l))) - -// @Test def testOpExpr = assertPrintedCode("(5).+(4)") - -// @Test def testName1 = assertPrintedCode("class test") - -// @Test def testName2 = assertPrintedCode("class *") - -// @Test def testName4 = assertPrintedCode("class `a*`") - -// @Test def testName5 = assertPrintedCode("val :::: = 1") - -// @Test def testName6 = assertPrintedCode("val `::::t` = 1") - -// @Test def testName7 = assertPrintedCode("""class \/""") - -// @Test def testName8 = assertPrintedCode("""class \\\\""") - -// @Test def testName9 = assertPrintedCode("""class test_\/""") - -// @Test def testName10 = assertPrintedCode("""class `*_*`""") - -// @Test def testName11 = assertPrintedCode("""class `a_*`""") - -// @Test def testName12 = assertPrintedCode("""class `*_a`""") - -// @Test def testName13 = assertPrintedCode("""class a_a""") - -// @Test def testName14 = assertPrintedCode("val x$11 = 5") - -// @Test def testName15 = assertPrintedCode("class `[]`") - -// @Test def testName16 = assertPrintedCode("class `()`") - -// @Test def testName17 = assertPrintedCode("class `{}`") - -// @Test def testName18 = assertPrintedCode("class <>") - -// @Test def testName19 = assertPrintedCode("""class `class`""") - -// @Test def testName20 = assertPrintedCode("""class `test name`""") - -// @Test def testIfExpr1 = assertPrintedCode(sm""" -// |if (a) -// | ((expr1): Int) -// |else -// | ((expr2): Int)""") - -// @Test def testIfExpr2 = assertPrintedCode(sm""" -// |(if (a) -// | { -// | expr1; -// | () -// | } -// |else -// | { -// | expr2; -// | () -// | }).toString""") - -// @Test def testIfExpr3 = assertPrintedCode(sm""" -// |(if (a) -// | { -// | expr1; -// | () -// | } -// |else -// | { -// | expr2; -// | () -// | }).method1().method2()""") - -// //val x = true && true && false.! -// @Test def testBooleanExpr1 = assertPrintedCode("val x = true.&&(true).&&(false.!)") - -// //val x = true && !(true && false) -// @Test def testBooleanExpr2 = assertPrintedCode("val x = true.&&(true.&&(false).`unary_!`)") - -// @Test def testNewExpr1 = assertPrintedCode("new foo()") - -// //new foo { test } -// @Test def testNewExpr2 = assertPrintedCode(sm""" -// |{ -// | final class $$anon extends foo { -// | test -// | }; -// | new $$anon() -// |}""") - -// @Test def testNewExpr3 = assertPrintedCode("new foo[t]()") - -// @Test def testNewExpr4 = assertPrintedCode("new foo(x)") - -// @Test def testNewExpr5 = assertPrintedCode("new foo[t](x)") - -// //new foo[t](x) { () } -// @Test def testNewExpr6 = assertPrintedCode(sm""" -// |{ -// | final class $$anon extends foo[t](x) { -// | () -// | }; -// | new $$anon() -// |}""") - -// //new foo with bar -// @Test def testNewExpr7 = assertPrintedCode(sm""" -// |{ -// | final class $$anon extends foo with bar; -// | new $$anon() -// |}""") - -// //new { anonymous } -// @Test def testNewExpr8 = assertPrintedCode(sm""" -// |{ -// | final class $$anon { -// | anonymous -// | }; -// | new $$anon() -// |}""") - -// //new { val early = 1 } with Parent[Int] { body } -// @Test def testNewExpr9 = assertPrintedCode(sm""" -// |{ -// | final class $$anon extends { -// | val early = 1 -// | } with Parent[Int] { -// | body -// | }; -// | new $$anon() -// |}""") - -// //new Foo { self => } -// @Test def testNewExpr10 = assertPrintedCode(sm""" -// |{ -// | final class $$anon extends Foo { self => -// | -// | }; -// | new $$anon() -// |}""") - -// @Test def testReturn = assertPrintedCode("def test: Int = return 42") - -// @Test def testFunc1 = assertPrintedCode("List(1, 2, 3).map(((i: Int) => i.-(1)))") - -// //val sum: Seq[Int] => Int = _ reduceLeft (_+_) -// @Test def testFunc2 = assertPrintedCode("val sum: _root_.scala.Function1[Seq[Int], Int] = ((x$1) => x$1.reduceLeft(((x$2, x$3) => x$2.+(x$3))))") - -// //List(1, 2, 3) map (_ - 1) -// @Test def testFunc3 = assertPrintedCode("List(1, 2, 3).map(((x$1) => x$1.-(1)))") - -// @Test def testImport1 = assertPrintedCode("import scala.collection.mutable") - -// @Test def testImport2 = assertPrintedCode("import java.lang.{String=>Str}") - -// @Test def testImport3 = assertPrintedCode("import java.lang.{String=>Str, Object=>_, _}") - -// @Test def testImport4 = assertPrintedCode("import scala.collection._") -// } - -// trait ClassPrintTests { -// @Test def testClass = assertPrintedCode("class *") - -// @Test def testClassWithBody = assertPrintedCode(sm""" -// |class X { -// | def y = "test" -// |}""") - -// @Test def testClassWithPublicParams = assertPrintedCode("class X(val x: Int, val s: String)") - -// @Test def testClassWithParams1 = assertPrintedCode("class X(x: Int, s: String)") - -// @Test def testClassWithParams2 = assertPrintedCode("class X(@test x: Int, s: String)") - -// @Test def testClassWithParams3 = assertPrintedCode("class X(implicit x: Int, s: String)") - -// @Test def testClassWithParams4 = assertPrintedCode("class X(implicit @test x: Int, s: String)") - -// @Test def testClassWithParams5 = assertPrintedCode("class X(override private[this] val x: Int, s: String) extends Y") - -// @Test def testClassWithParams6 = assertPrintedCode("class X(@test1 override private[this] val x: Int, @test2(param1 = 7) s: String) extends Y") - -// @Test def testClassWithParams7 = assertPrintedCode("class X protected (val x: Int, val s: String)") - -// @Test def testClassWithParams8 = assertPrintedCode("class X(var x: Int)") - -// @Test def testClassWithParams9 = assertPrintedCode("class X(var x: Int*)") - -// @Test def testClassWithByNameParam = assertPrintedCode("class X(x: => Int)") - -// @Test def testClassWithDefault = assertPrintedCode("class X(var x: Int = 5)") - -// @Test def testClassWithParams10 = assertPrintedCode("class X(protected[zzz] var x: Int)") - -// @Test def testClassWithParams11 = assertPrintedCode("class X(override var x: Int) extends F(x) with E(x)") - -// @Test def testClassWithParams12 = assertPrintedCode("class X(val y: Int)()(var z: Double)") - -// @Test def testClassWithImplicitParams = assertPrintedCode("class X(var i: Int)(implicit val d: Double, var f: Float)") - -// @Test def testClassWithEarly = assertPrintedCode(sm""" -// |class X(var i: Int) extends { -// | val a: String = i; -// | type B -// |} with Y""") - -// @Test def testClassWithThrow1 = assertPrintedCode(sm""" -// |class Throw1 { -// | throw new Exception("exception!") -// |}""") - -// @Test def testClassWithThrow2 = assertPrintedCode(sm""" -// |class Throw2 { -// | var msg = " "; -// | val e = new Exception(msg); -// | throw e -// |}""") - -// /* -// class Test { -// val (a, b) = (1, 2) -// } -// */ -// @Test def testClassWithAssignmentWithTuple1 = assertPrintedCode(sm""" -// |class Test { -// | private[this] val x$$1 = (scala.Tuple2(1, 2): @scala.unchecked) match { -// | case scala.Tuple2((a @ _), (b @ _)) => scala.Tuple2(a, b) -// | }; -// | val a = x$$1._1; -// | val b = x$$1._2 -// |}""") - -// /* -// class Test { -// val (a, b) = (1).->(2) -// } -// */ -// @Test def testClassWithAssignmentWithTuple2 = assertPrintedCode(sm""" -// |class Test { -// | private[this] val x$$1 = ((1).->(2): @scala.unchecked) match { -// | case scala.Tuple2((a @ _), (b @ _)) => scala.Tuple2(a, b) -// | }; -// | val a = x$$1._1; -// | val b = x$$1._2 -// |}""") - -// /* -// class Test { -// val List(one, three, five) = List(1,3,5) -// } -// */ -// @Test def testClassWithPatternMatchInAssignment = assertPrintedCode(sm""" -// |class Test { -// | private[this] val x$$1 = (List(1, 3, 5): @scala.unchecked) match { -// | case List((one @ _), (three @ _), (five @ _)) => scala.Tuple3(one, three, five) -// | }; -// | val one = x$$1._1; -// | val three = x$$1._2; -// | val five = x$$1._3 -// |}""") - -// //class A(l: List[_]) -// @Test def testClassWithExistentialParameter1 = assertPrintedCode(sm""" -// |class Test(l: (List[_$$1] forSome { -// | type _$$1 -// |}))""") - -// @Test def testClassWithExistentialParameter2 = assertPrintedCode(sm""" -// |class B(l: (List[T] forSome { -// | type T -// |}))""") - -// @Test def testClassWithCompoundTypeTree = assertPrintedCode(sm""" -// |{ -// | trait A; -// | trait B; -// | abstract class C(val a: A with B) { -// | def method(x: A with B with C { -// | val x: Float -// | }): A with B -// | }; -// | () -// |}""") - -// @Test def testClassWithSelectFromTypeTree = assertPrintedCode(sm""" -// |{ -// | trait A { -// | type T -// | }; -// | class B(t: (A)#T); -// | () -// |}""") - -// @Test def testImplicitClass = assertPrintedCode("implicit class X(protected[zzz] var x: Int)") - -// @Test def testAbstractClass = assertPrintedCode("abstract class X(protected[zzz] var x: Int)") - -// @Test def testCaseClassWithParams1 = assertPrintedCode("case class X(x: Int, s: String)") - -// @Test def testCaseClassWithParams2 = assertPrintedCode("case class X(protected val x: Int, s: String)") - -// @Test def testCaseClassWithParams3 = assertPrintedCode("case class X(implicit x: Int, s: String)") - -// @Test def testCaseClassWithParams4 = assertPrintedCode("case class X(override val x: Int, s: String) extends Y") - -// @Test def testCaseClassWithBody = assertPrintedCode(sm""" -// |case class X() { -// | def y = "test" -// |}""") - -// @Test def testLocalClass = assertPrintedCode(sm""" -// |def test = { -// | class X(var a: Int) { -// | def y = "test" -// | }; -// | new X(5) -// |}""") - -// @Test def testLocalCaseClass = assertPrintedCode(sm""" -// |def test = { -// | case class X(var a: Int) { -// | def y = "test" -// | }; -// | new X(5) -// |}""") - -// @Test def testSuperInClass = assertPrintedCode(sm""" -// |{ -// | trait Root { -// | def r = "Root" -// | }; -// | class X extends Root { -// | def superX = super.r -// | }; -// | class Y extends X with Root { -// | class Inner { -// | val myY = Y.super.r -// | }; -// | def fromX = super[X].r; -// | def fromRoot = super[Root].r -// | }; -// | () -// |}""") - -// @Test def testThisInClass = assertPrintedCode(sm""" -// |class Outer { -// | class Inner { -// | val outer = Root.this -// | }; -// | val self = this -// |}""") - -// @Test def testCaseClassWithParamsAndBody = assertPrintedCode(sm""" -// |case class X(x: Int, s: String) { -// | def y = "test" -// |}""") - -// @Test def testObject = assertPrintedCode("object *") - -// @Test def testObjectWithBody = assertPrintedCode(sm""" -// |object X { -// | def y = "test" -// |}""") - -// @Test def testObjectWithEarly1 = assertPrintedCode(sm""" -// |object X extends { -// | val early: T = v -// |} with Bar""") - -// @Test def testObjectWithEarly2 = assertPrintedCode(sm""" -// |object X extends { -// | val early: T = v; -// | type EarlyT = String -// |} with Bar""") - -// @Test def testObjectWithSelf = assertPrintedCode(sm""" -// |object Foo extends Foo { self => -// | body -// |}""") - -// @Test def testObjectInh = assertPrintedCode("private[Y] object X extends Bar with Baz") - -// @Test def testObjectWithPatternMatch1 = assertPrintedCode(sm""" -// |object PM1 { -// | List(1, 2) match { -// | case (i @ _) => i -// | } -// |}""") - -// @Test def testObjectWithPatternMatch2 = assertPrintedCode(sm""" -// |object PM2 { -// | List(1, 2).map({ -// | case (i @ _) if i.>(5) => i -// | }) -// |}""") - -// //case i: Int => i -// @Test def testObjectWithPatternMatch3 = assertPrintedCode(sm""" -// |object PM3 { -// | List(1, 2).map({ -// | case (i @ ((_): Int)) => i -// | }) -// |}""") - -// //case a @ (i: Int) => i -// @Test def testObjectWithPatternMatch4 = assertPrintedCode(sm""" -// |object PM4 { -// | List(1, 2).map({ -// | case (a @ (i @ ((_): Int))) => i -// | }) -// |}""") - -// @Test def testObjectWithPatternMatch5 = assertPrintedCode(sm""" -// |object PM5 { -// | List(1, 2).map({ -// | case _ => 42 -// | }) -// |}""") - -// @Test def testObjectWithPatternMatch6 = assertPrintedCode(sm""" -// |object PM6 { -// | List(1, 2) match { -// | case ::((x @ _), (xs @ _)) => x -// | } -// |}""") - -// @Test def testObjectWithPatternMatch7 = assertPrintedCode(sm""" -// |object PM7 { -// | List(1, 2).map({ -// | case (0| 1) => true -// | case _ => false -// | }) -// |}""") - -// @Test def testObjectWithPatternMatch8 = assertPrintedCode(sm""" -// |object PM8 { -// | "abcde".toList match { -// | case Seq((car @ _), _*) => car -// | } -// |}""") - -// @Test def testObjectWithPatternMatch9 = assertPrintedCode(sm""" -// |{ -// | object Extractor { -// | def unapply(i: Int) = Some(i) -// | }; -// | object PM9 { -// | 42 match { -// | case (a @ Extractor((i @ _))) => i -// | } -// | }; -// | () -// |}""") - -// @Test def testObjectWithPartialFunc = assertPrintedCode(sm""" -// |object Test { -// | def partFuncTest[A, B](e: Either[A, B]): scala.Unit = e match { -// | case Right(_) => () -// | } -// |}""") - -// @Test def testObjectWithTry = assertPrintedCode(sm""" -// |object Test { -// | import java.io; -// | var file: PrintStream = null; -// | try { -// | val out = new FileOutputStream("myfile.txt"); -// | file = new PrintStream(out) -// | } catch { -// | case (ioe @ ((_): IOException)) => println("ioe") -// | case (e @ ((_): Exception)) => println("e") -// | } finally println("finally") -// |}""") -// } - -// trait TraitPrintTests { -// @Test def testTrait = assertPrintedCode("trait *") - -// @Test def testTraitWithBody = assertPrintedCode(sm""" -// |trait X { -// | def y = "test" -// |}""") - -// @Test def testTraitWithSelfTypeAndBody = assertPrintedCode(sm""" -// |trait X { self: Order => -// | def y = "test" -// |}""") - -// @Test def testTraitWithSelf1 = assertPrintedCode(sm""" -// |trait X { self => -// | def y = "test" -// |}""") - -// @Test def testTraitWithSelf2 = assertPrintedCode(sm""" -// |trait X { self: Foo with Bar => -// | val x: Int = 1 -// |}""") - -// @Test def testTraitTypeParams = assertPrintedCode("trait X[A, B]") - -// @Test def testTraitWithBody2 = assertPrintedCode(sm""" -// |trait X { -// | def foo: scala.Unit; -// | val bar: Baz -// |}""") - -// @Test def testTraitWithInh = assertPrintedCode("trait X extends A with B") - -// @Test def testTraitWithEarly1 = assertPrintedCode(sm""" -// |trait X extends { -// | val x: Int = 1 -// |} with Any""") - -// @Test def testTraitWithEarly2 = assertPrintedCode(sm""" -// |trait X extends { -// | val x: Int = 0; -// | type Foo = Bar -// |} with Y""") - -// @Test def testTraitWithEarly3 = assertPrintedCode(sm""" -// |trait X extends { -// | val x: Int = 5; -// | val y: Double = 4.0; -// | type Foo; -// | type XString = String -// |} with Y""") - -// @Test def testTraitWithEarly4 = assertPrintedCode(sm""" -// |trait X extends { -// | val x: Int = 5; -// | val y: Double = 4.0; -// | type Foo; -// | type XString = String -// |} with Y { -// | val z = 7 -// |}""") - -// @Test def testTraitWithEarly5 = assertPrintedCode(sm""" -// |trait X extends { -// | override protected[this] val x: Int = 5; -// | val y: Double = 4.0; -// | private type Foo; -// | private[ee] type XString = String -// |} with Y { -// | val z = 7 -// |}""") - -// @Test def testTraitWithSingletonTypeTree = assertPrintedCode(sm""" -// |trait Test { -// | def testReturnSingleton(): this.type -// |}""") - -// @Test def testTraitWithThis = assertPrintedCode(sm""" -// |trait Test { _ : X with Y => -// | -// |}""", q"trait Test { this: X with Y => }") - -// @Test def testTraitWithWhile1 = assertPrintedCode(sm""" -// |trait Test { -// | while (true.!=(false)) -// | println("testing...") -// | -// |}""") - -// @Test def testTraitWithWhile2 = assertPrintedCode(sm""" -// |trait Test { -// | while (true) -// | { -// | println("testing..."); -// | println("testing...") -// | } -// | -// |}""") - -// @Test def testTraitWithDoWhile1 = assertPrintedCode(sm""" -// |trait Test { -// | do -// | println("testing...") -// | while (true) -// |}""") - -// @Test def testTraitWithTypes = assertPrintedCode(sm""" -// |trait Test { -// | type A = Int; -// | type B >: Nothing <: AnyRef; -// | protected type C >: Nothing; -// | type D <: AnyRef -// |}""") -// } - -// trait ValAndDefPrintTests { -// @Test def testVal1 = assertPrintedCode("val a: Unit = null") - -// @Test def testVal2 = assertPrintedCode("val * : Unit = null") - -// @Test def testVal3 = assertPrintedCode("val a_ : Unit = null") - -// @Test def testDef1 = assertPrintedCode("def a: Unit = null") - -// @Test def testDef2 = assertPrintedCode("def * : Unit = null") - -// @Test def testDef3 = assertPrintedCode("def a_(x: Int): Unit = null") - -// @Test def testDef4 = assertPrintedCode("def a_ : Unit = null") - -// @Test def testDef5 = assertPrintedCode("def a_(* : Int): Unit = null") - -// @Test def testDef6 = assertPrintedCode("def a_(b_ : Int): Unit = null") - -// @Test def testDef7 = assertPrintedCode(sm""" -// |{ -// | def test1 = (); -// | def test2() = () -// |}""", -// Block( -// DefDef(NoMods, newTermName("test1"), Nil, Nil, EmptyTree, Literal(Constant(()))), -// DefDef(NoMods, newTermName("test2"), Nil, Nil :: Nil, EmptyTree, Literal(Constant(()))) -// ) -// ) - -// @Test def testDef8 = { -// val arg = ValDef(Modifiers(Flag.IMPLICIT) , newTermName("a"), -// AppliedTypeTree(Ident(newTypeName("R")), List(Ident(newTypeName("X")))), EmptyTree) - -// //def m[X](implicit a: R[X]) = () -// val tree = DefDef(NoMods, newTermName("test"), TypeDef(NoMods, newTypeName("X"), Nil, EmptyTree) :: Nil, -// List(List(arg)), EmptyTree, Literal(Constant(()))) - -// assertPrintedCode("def test[X](implicit a: R[X]) = ()", tree) -// } - -// @Test def testDefWithParams1 = assertPrintedCode("def foo(x: Int*) = null") - -// @Test def testDefWithParams2 = assertPrintedCode("def foo(x: Int)(y: Int = 1) = null") - -// @Test def testDefWithTypeParams1 = assertPrintedCode("def foo[A, B, C](x: A)(y: Int = 1): C = null") - -// @Test def testDefWithTypeParams2 = assertPrintedCode("def foo[A, B <: Bar] = null") - -// @Test def testDefWithAnn1 = assertPrintedCode("@annot def foo = null") - -// @Test def testDefWithAnn2 = assertPrintedCode("@a(x) def foo = null") - -// @Test def testDefWithAnn3 = assertPrintedCode("@Foo[A, B] def foo = null") - -// @Test def testDefWithAnn4 = assertPrintedCode("@Foo(a)(b)(x, y) def foo = null") - -// @Test def testDefWithAnn5 = assertPrintedCode("@Foo[A, B](a)(b) @Bar def foo(x: Int) = null") - -// @Test def testDefWithAnn6 = assertPrintedCode("@test1(new test2()) def foo = 42") - -// @Test def testDefWithAnn7 = assertPrintedCode("@`t*` def foo = 42") - -// @Test def testDefWithAnn8 = assertPrintedCode("@throws(classOf[Exception]) def foo = throw new Exception()") - -// @Test def testAnnotated1 = assertPrintedCode("def foo = 42: @test1") - -// @Test def testAnnotated2 = assertPrintedCode("""def foo = 42: @test1(42, z = "5")""") - -// @Test def testAnnotated3 = assertPrintedCode("def foo = (42: @test1): @test2(new test1())") - -// @Test def testAnnotated4 = assertPrintedCode("""def foo = 42: @test1(4, "testing")(4.2)""") - -// @Test def testAnnotated5 = assertPrintedCode("""def foo = (42: @test1(4, "testing")(4.2)): @test2(1, "bar")(3.14)""") - -// @Test def testAnnotated6 = assertPrintedCode("def foo = ((42: @test1): @test2(new test1())): @test3(1)(2, 3)(4)") - -// @Test def testAnnotated7 = assertPrintedCode(sm""" -// |(x: @unchecked) match { -// | case ((_): Int) => true -// | case _ => false -// |}""") - -// @Test def testAnnotated8 = assertPrintedCode(sm""" -// |((x: @unchecked): @test1(1, "testing")(3.14)) match { -// | case _ => true -// |}""") -// } - -// trait PackagePrintTests { -// @Test def testPackage1 = assertPrintedCode(sm""" -// |package foo.bar { -// | -// |}""") - -// @Test def testPackage2 = assertPrintedCode(sm""" -// |package foo { -// | class C -// | -// | object D -// |}""") - -// //package object foo extends a with b -// @Test def testPackage3 = assertPrintedCode(sm""" -// |package foo { -// | object `package` extends a with b -// |}""") - -// //package object foo { def foo; val x = 1 } -// @Test def testPackage4 = assertPrintedCode(sm""" -// |package foo { -// | object `package` { -// | def foo: scala.Unit; -// | val x = 1 -// | } -// |}""") - -// //package object foo extends { val x = 1; type I = Int } with Any -// @Test def testPackage5 = assertPrintedCode(sm""" -// |package foo { -// | object `package` extends { -// | val x = 1; -// | type I = Int -// | } with Any -// |}""") -// } - -// trait QuasiTreesPrintTests { -// @Test def testQuasiIdent = assertPrintedCode("*", q"*") - -// @Test def testQuasiVal = assertPrintedCode("val * : Unit = null", q"val * : Unit = null") - -// @Test def testQuasiDef = assertPrintedCode("def * : Unit = null", q"def * : Unit = null") - -// @Test def testQuasiTrait = assertPrintedCode("trait *", q"trait *") - -// @Test def testQuasiClass = assertPrintedCode("class *", q"class *") - -// @Test def testQuasiClassWithPublicParams = assertPrintedCode( "class X(val x: Int, val s: String)", q"class X(val x: Int, val s:String)" ) - -// @Test def testQuasiClassWithParams = assertPrintedCode("class X(x: Int, s: String)", q"class X(x: Int, s:String)") - -// @Test def testQuasiObject = assertPrintedCode("object *", q"object *") - -// @Test def testQuasiObjectWithBody = assertPrintedCode(sm""" -// |object X { -// | def y = "test" -// |}""", q"""object X{ def y = "test" }""") - -// @Test def testQuasiClassWithBody = assertPrintedCode(sm""" -// |class X { -// | def y = "test" -// |}""", q"""class X{ def y = "test" }""") - -// @Test def testQuasiTraitWithBody = assertPrintedCode(sm""" -// |trait X { -// | def y = "test" -// |}""", q"""trait X{ def y = "test" }""") - -// @Test def testQuasiTraitWithSelfTypeAndBody = assertPrintedCode(sm""" -// |trait X { self: Order => -// | def y = "test" -// |}""", q"""trait X{ self: Order => def y = "test" }""") - -// @Test def testQuasiTraitWithSelf = assertPrintedCode(sm""" -// |trait X { self => -// | def y = "test" -// |}""", q"""trait X{ self => def y = "test" }""") - -// @Test def testQuasiCaseClassWithBody = assertPrintedCode(sm""" -// |case class X() { -// | def y = "test" -// |}""", q"""case class X() { def y = "test" }""") - -// @Test def testQuasiCaseClassWithParamsAndBody = assertPrintedCode(sm""" -// |case class X(x: Int, s: String) { -// | def y = "test" -// |}""", q"""case class X(x: Int, s: String){ def y = "test" }""") -// }
\ No newline at end of file + implicit class StrContextStripMarginOps(val stringContext: StringContext) extends util.StripMarginInterpolator +} + +import PrinterHelper._ + +trait BasePrintTests { + @Test def testIdent = assertTreeCode(Ident("*"))("*") + + @Test def testConstant1 = assertTreeCode(Literal(Constant("*")))("\"*\"") + + @Test def testConstant2 = assertTreeCode(Literal(Constant(42)))("42") + + @Test def testConstantFloat = assertTreeCode(Literal(Constant(42f)))("42.0F") + + @Test def testConstantDouble = assertTreeCode(Literal(Constant(42d)))("42.0") + + @Test def testConstantLong = assertTreeCode(Literal(Constant(42l)))("42L") + + @Test def testOpExpr = assertPrintedCode("(5).+(4)", checkTypedTree = false) + + @Test def testName1 = assertPrintedCode("class test") + + @Test def testName2 = assertPrintedCode("class *") + + @Test def testName4 = assertPrintedCode("class `a*`") + + @Test def testName5 = assertPrintedCode("val :::: = 1") + + @Test def testName6 = assertPrintedCode("val `::::t` = 1") + + @Test def testName7 = assertPrintedCode("""class \/""") + + @Test def testName8 = assertPrintedCode("""class \\\\""") + + @Test def testName9 = assertPrintedCode("""class test_\/""") + + @Test def testName10 = assertPrintedCode("""class `*_*`""") + + @Test def testName11 = assertPrintedCode("""class `a_*`""") + + @Test def testName12 = assertPrintedCode("""class `*_a`""") + + @Test def testName13 = assertPrintedCode("""class a_a""") + + @Test def testName14 = assertPrintedCode("val x$11 = 5") + + @Test def testName15 = assertPrintedCode("class `[]`") + + @Test def testName16 = assertPrintedCode("class `()`") + + @Test def testName17 = assertPrintedCode("class `{}`") + + @Test def testName18 = assertPrintedCode("class <>") + + @Test def testName19 = assertPrintedCode("""class `class`""") + + @Test def testName20 = assertPrintedCode("""class `test name`""") + + @Test def testIfExpr1 = assertResultCode(code = sm""" + |val a = 1 + |if (a > 1) + | a: Int + |else + | (a.toString): String + """)( + parsedCode = sm""" + |val a = 1; + |if (a.>(1)) + | ((a): Int) + |else + | ((a.toString): String)""", + typedCode=sm""" + |val a = 1; + |if (PrintersContext.this.a.>(1)) + | ((PrintersContext.this.a): scala.Int) + |else + | ((PrintersContext.this.a.toString()): scala.Predef.String) + """, wrap = true) + + @Test def testIfExpr2 = assertPrintedCode(sm""" + |class A { + | (if (true) + | { + | false; + | () + | } + |else + | { + | true; + | () + | }).toString() + |}""") + + @Test def testIfExpr3 = assertPrintedCode(sm""" + |class A { + | (if (true) + | { + | false; + | () + | } + |else + | { + | true; + | () + | }).toString().hashCode() + |}""") + + //val x = true && true && false.! + @Test def testBooleanExpr1 = assertPrintedCode("val x = true.&&(true).&&(false.`unary_!`)", checkTypedTree = false) + + //val x = true && !(true && false) + @Test def testBooleanExpr2 = assertPrintedCode("val x = true.&&(true.&&(false).`unary_!`)", checkTypedTree = false) + + @Test def testNewExpr1 = assertResultCode( + code = sm""" + |class foo + |new foo() + |""")( + parsedCode = sm""" + |class foo; + |new foo()""", + typedCode = sm""" + |class foo; + |new PrintersContext.this.foo() + |""", + wrap = true) + + @Test def testNewExpr2 = assertResultCode( + code = sm""" + |class foo + |new foo { "test" } + |""")( + parsedCode = sm""" + |class foo; + |{ + | final class $$anon extends foo { + | "test" + | }; + | new $$anon() + |}""", + typedCode = sm""" + |class foo; + |{ + | final class $$anon extends PrintersContext.this.foo { + | "test" + | }; + | new $$anon() + |}""", + wrap = true) + + @Test def testNewExpr3 = assertPrintedCode(sm""" + |{ + | class foo[t]; + | new foo[scala.Int]() + |}""") + + @Test def testNewExpr4 = assertPrintedCode(sm""" + |{ + | class foo(x: scala.Int); + | val x = 5; + | new foo(x) + |}""") + + @Test def testNewExpr5 = assertPrintedCode(sm""" + |{ + | class foo[t](x: scala.Int); + | val x = 5; + | new foo[scala.Predef.String](x) + |}""") + + //new foo[t](x) { () } + @Test def testNewExpr6 = assertResultCode( + code = sm""" + |class foo[t](x: Int) + |new foo[String](3) { () } + |""")( + parsedCode = sm""" + |{ + | class foo[t](x: Int); + | { + | final class $$anon extends foo[String](3) { + | () + | }; + | new $$anon() + | } + |}""", + typedCode = sm""" + |{ + | class foo[t](x: scala.Int); + | { + | final class $$anon extends foo[scala.Predef.String](3) { + | () + | }; + | new $$anon() + | } + |}""") + + //new foo with bar + @Test def testNewExpr7 = assertPrintedCode(sm""" + |{ + | trait foo; + | trait bar; + | { + | final class $$anon extends foo with bar; + | new $$anon() + | } + |}""") + + //new { anonymous } + @Test def testNewExpr8 = assertPrintedCode(sm""" + |{ + | final class $$anon { + | 5 + | }; + | new $$anon() + |}""") + + //new { val early = 1 } with Parent[Int] { body } + @Test def testNewExpr9 = assertPrintedCode(sm""" + |{ + | class Parent[t]; + | { + | final class $$anon extends { + | val early = 1 + | } with Parent[scala.Int] { + | "testNewExpr" + | }; + | new $$anon() + | } + |}""") + + //new Foo { self => } + @Test def testNewExpr10 = assertPrintedCode(sm""" + |{ + | class Foo; + | { + | final class $$anon extends Foo { self => + | + | }; + | new $$anon() + | } + |}""") + + @Test def testReturn = assertPrintedCode("def test: scala.Int = return 42") + + @Test def testFunc1 = assertResultCode( + code = "List(1, 2, 3).map((i: Int) => i - 1)")( + parsedCode = "List(1, 2, 3).map(((i: Int) => i.-(1)))", + typedCode = sm"scala.collection.immutable.List.apply(1, 2, 3).map(((i: scala.Int) => i.-(1)))(scala.collection.immutable.List.canBuildFrom)") + + @Test def testFunc2 = assertResultCode( + code = "val sum: Seq[Int] => Int = _ reduceLeft (_+_)")( + parsedCode = "val sum: _root_.scala.Function1[Seq[Int], Int] = ((x$1) => x$1.reduceLeft(((x$2, x$3) => x$2.+(x$3))))", + typedCode = "val sum: _root_.scala.Function1[scala.`package`.Seq[scala.Int], scala.Int] = ((x$1) => x$1.reduceLeft(((x$2, x$3) => x$2.+(x$3))))") + + @Test def testFunc3 = assertResultCode( + code = "List(1, 2, 3) map (_ - 1)")( + parsedCode = "List(1, 2, 3).map(((x$1) => x$1.-(1))) ", + typedCode = "scala.collection.immutable.List.apply(1, 2, 3).map(((x$1) => x$1.-(1)))(scala.collection.immutable.List.canBuildFrom)") + + @Test def testFunc4 = assertResultCode( + code = "val x: String => Int = ((str: String) => 1)")( + parsedCode = "val x: _root_.scala.Function1[String, Int] = ((str: String) => 1)", + typedCode = " val x: _root_.scala.Function1[_root_.scala.Predef.String, _root_.scala.Int] = ((str: _root_.scala.Predef.String) => 1)", printRoot = true) + + @Test def testAssign1 = assertPrintedCode("(f.v = 5).toString", checkTypedTree = false) + + @Test def testAssign2 = assertPrintedCode("(f.v = 5)(2)", checkTypedTree = false) + + @Test def testImport1 = assertPrintedCode("import scala.collection.mutable") + + @Test def testImport2 = assertPrintedCode("import java.lang.{String=>Str}") + + @Test def testImport3 = assertPrintedCode("import java.lang.{String=>Str, Object=>_, _}") + + @Test def testImport4 = assertPrintedCode("import scala.collection._") +} + +trait ClassPrintTests { + @Test def testClass = assertPrintedCode("class *") + + @Test def testClassWithBody = assertPrintedCode(sm""" + |class X { + | def y = "test" + |}""") + + @Test def testClassWithPublicParams = assertPrintedCode("class X(val x: scala.Int, val s: scala.Predef.String)") + + @Test def testClassWithParams1 = assertPrintedCode("class X(x: scala.Int, s: scala.Predef.String)") + + @Test def testClassWithParams2 = assertPrintedCode("class X(@test x: Int, s: String)", checkTypedTree = false) + + @Test def testClassWithParams3 = assertPrintedCode("class X(implicit x: Int, s: String)", checkTypedTree = false) + + @Test def testClassWithParams4 = assertPrintedCode("class X(implicit @unchecked x: Int, s: String)", checkTypedTree = false) + + @Test def testClassWithParams5 = assertPrintedCode(sm""" + |{ + | class Y { + | val x = 5 + | }; + | class X(override private[this] val x: scala.Int, s: scala.Predef.String) extends Y; + | () + |}""") + + @Test def testClassWithParams6 = assertPrintedCode("class X(@test1 override private[this] val x: Int, @test2(param1 = 7) s: String) extends Y", checkTypedTree = false) + + @Test def testClassWithParams7 = assertPrintedCode("class X protected (val x: scala.Int, val s: scala.Predef.String)") + + @Test def testClassWithParams8 = assertPrintedCode("class X(var x: scala.Int)") + + @Test def testClassWithParams9 = assertPrintedCode("def test(x: scala.Int*) = 5") + + @Test def testClassWithByNameParam = assertPrintedCode("class X(x: => scala.Int)") + + @Test def testClassWithDefault = assertPrintedCode(sm""" + |{ + | class X(var x: scala.Int = 5); + | () + |}""") + + @Test def testClassWithParams10 = assertPrintedCode("class X(protected[zzz] var x: Int)", checkTypedTree = false) + + @Test def testClassWithParams11 = assertPrintedCode(sm""" + |{ + | class F(x: scala.Int); + | trait E { + | var x: scala.Int + | }; + | class X(override var x: scala.Int = 5) extends F(x) with E; + | () + |}""") + + @Test def testClassWithParams12 = assertPrintedCode("class X(val y: scala.Int)()(var z: scala.Double)") + + @Test def testClassWithImplicitParams = assertPrintedCode("class X(var i: scala.Int)(implicit val d: scala.Double, var f: scala.Float)") + + @Test def testClassWithEarly = assertPrintedCode(sm""" + |class X(var i: scala.Int) extends { + | val a = i; + | type B + |} with scala.Serializable""") + + @Test def testClassWithThrow1 = assertPrintedCode(sm""" + |class Throw1 { + | throw new scala.`package`.Exception("exception!") + |}""") + + @Test def testClassWithThrow2 = assertPrintedCode(sm""" + |class Throw2 { + | var msg = " "; + | val e = new scala.`package`.Exception(Throw2.this.msg); + | throw Throw2.this.e + |}""") + + /* + class Test { + val (a, b) = (1, 2) + } + */ + @Test def testClassWithAssignmentWithTuple1 = assertPrintedCode(sm""" + |class Test { + | private[this] val x$$1 = (scala.Tuple2.apply(1, 2): @scala.unchecked) match { + | case scala.Tuple2((a @ _), (b @ _)) => scala.Tuple2.apply(a, b) + | }; + | val a = Test.this.x$$1._1; + | val b = Test.this.x$$1._2 + |}""") + + @Test def testClassWithAssignmentWithTuple2 = assertResultCode( + code = sm""" + |class Test { + | val (a, b) = (1).->(2) + |}""")( + parsedCode = sm""" + |class Test { + | private[this] val x$$1 = ((1).->(2): @scala.unchecked) match { + | case scala.Tuple2((a @ _), (b @ _)) => scala.Tuple2(a, b) + | }; + | val a = x$$1._1; + | val b = x$$1._2 + |}""", + typedCode = sm""" + |class Test { + | private[this] val x$$1 = (scala.Predef.ArrowAssoc(1).->(2): @scala.unchecked) match { + | case scala.Tuple2((a @ _), (b @ _)) => scala.Tuple2.apply(a, b) + | }; + | val a = Test.this.x$$1._1; + | val b = Test.this.x$$1._2 + |}""") + + /* + class Test { + val List(one, three, five) = List(1,3,5) + } + */ + @Test def testClassWithPatternMatchInAssignment = assertPrintedCode(sm""" + |class Test { + | private[this] val x$$1 = (scala.collection.immutable.List.apply(1, 3, 5): @scala.unchecked) match { + | case scala.collection.immutable.List((one @ _), (three @ _), (five @ _)) => scala.Tuple3.apply(one, three, five) + | }; + | val one = Test.this.x$$1._1; + | val three = Test.this.x$$1._2; + | val five = Test.this.x$$1._3 + |}""") + + //class A(l: List[_]) + @Test def testClassWithExistentialParameter1 = assertPrintedCode(sm""" + |class Test(l: (scala.`package`.List[_$$1] forSome { + | type _$$1 + |}))""") + + @Test def testClassWithExistentialParameter2 = assertPrintedCode(sm""" + |class B(l: (scala.`package`.List[T] forSome { + | type T + |}))""") + + @Test def testClassWithCompoundTypeTree = assertPrintedCode(sm""" + |{ + | trait A; + | trait B; + | abstract class C(val a: A with B) { + | def method(x: A with B with C { + | val x: scala.Float + | }): A with B + | }; + | () + |}""") + + @Test def testClassWithSelectFromTypeTree = assertPrintedCode(sm""" + |{ + | trait A { + | type T + | }; + | class B(t: (A)#T); + | () + |}""") + + @Test def testImplicitClass = assertPrintedCode(sm""" + |{ + | implicit class X(protected[this] var x: scala.Int); + | () + |}""", + checkTypedTree = true) + + @Test def testAbstractClass = assertPrintedCode("abstract class X(protected[this] var x: scala.Int)") + + @Test def testCaseClassWithParams1 = assertPrintedCode(sm""" + |{ + | case class X(x: scala.Int, s: scala.Predef.String); + | () + |}""") + + @Test def testCaseClassWithParams2 = assertPrintedCode(sm""" + |{ + | case class X(protected val x: scala.Int, s: scala.Predef.String); + | () + |}""") + + @Test def testCaseClassWithParams3 = assertPrintedCode(sm""" + |{ + | case class X(implicit x: scala.Int, s: scala.Predef.String); + | () + |}""") + + @Test def testCaseClassWithParams4 = assertPrintedCode(sm""" + |{ + | trait V { + | val x: scala.Int + | }; + | case class X(override val x: scala.Int, s: scala.Predef.String) extends scala.Cloneable; + | () + |}""") + + @Test def testCaseClassWithBody = assertPrintedCode(sm""" + |{ + | case class X() { + | def y = "test" + | }; + | () + |}""") + + @Test def testLocalClass = assertPrintedCode(sm""" + |def test = { + | class X(var a: scala.Int) { + | def y = "test" + | }; + | new X(5) + |}""") + + @Test def testLocalCaseClass = assertPrintedCode(sm""" + |def test = { + | case class X(var a: scala.Int) { + | def y = "test" + | }; + | new X(5) + |}""") + + @Test def testSuperInClass = assertPrintedCode(sm""" + |{ + | trait Root { + | def r = "Root" + | }; + | class X extends Root { + | def superX = super.r + | }; + | class Y extends X with Root { + | class Inner { + | val myY = Y.super.r + | }; + | def fromX = super[X].r; + | def fromRoot = super[Root].r + | }; + | () + |}""") + + @Test def testThisInClass = assertPrintedCode(sm""" + |class Outer { + | class Inner { + | val outer = Outer.this + | }; + | val self = this + |}""") + + @Test def testCaseClassWithParamsAndBody = assertPrintedCode(sm""" + |{ + | case class X(var x: scala.Int, var s: scala.Predef.String) { + | def y = "test" + | }; + | () + |}""") + + @Test def testObject = assertPrintedCode("object *") + + @Test def testObjectWithBody = assertPrintedCode(sm""" + |object X { + | def y = "test" + |}""") + + @Test def testObjectWithEarly1 = assertPrintedCode(sm""" + |object X extends { + | val early: scala.Int = 42 + |} with scala.Serializable""") + + @Test def testObjectWithEarly2 = assertPrintedCode(sm""" + |object X extends { + | val early: scala.Int = 42; + | type EarlyT = scala.Predef.String + |} with scala.Serializable""") + + @Test def testObjectWithSelf = assertPrintedCode(sm""" + |object Foo extends scala.Serializable { self => + | 42 + |}""") + + @Test def testObjectInh = assertPrintedCode(sm""" + |trait Y { + | private[Y] object X extends scala.Serializable with scala.Cloneable + |}""") + + @Test def testObjectWithPatternMatch1 = assertPrintedCode(sm""" + |object PM1 { + | scala.collection.immutable.List.apply(1, 2) match { + | case (i @ _) => i + | } + |}""") + + @Test def testObjectWithPatternMatch2 = assertResultCode( + code = sm""" + |object PM2 { + | List(1, 2).map { + | case i if i > 5 => i + | } + |}""")( + parsedCode = sm""" + |object PM2 { + | List(1, 2).map({ + | case (i @ _) if i.>(5) => i + | }) + |}""") + /* + typedCode = sm""" + |object PM2 { + | scala.collection.immutable.List.apply(1, 2).map(((x0$$1) => x0$$1 match { + | case (i @ _) if i.>(5) => i + | }))(scala.collection.immutable.List.canBuildFrom) + |}""") + * + */ + + @Test def testObjectWithPatternMatch3 = assertResultCode( + code = sm""" + |object PM3 { + | List(1, 2).map { + | case i: Int => i + | } + |}""")( + parsedCode = sm""" + |object PM3 { + | List(1, 2).map({ + | case (i @ ((_): Int)) => i + | }) + |}""") + /* + typedCode = sm""" + |object PM3 { + | scala.collection.immutable.List.apply(1, 2).map(((x0$$2) => x0$$2 match { + | case (i @ ((_): scala.Int)) => i + | }))(scala.collection.immutable.List.canBuildFrom) + |}""") + * + */ + + @Test def testObjectWithPatternMatch4 = assertResultCode( + code = sm""" + |object PM4 { + | List(1, 2).map { + | case _ => 42 + | } + |}""")( + parsedCode = sm""" + |object PM4 { + | List(1, 2).map({ + | case _ => 42 + | }) + |}""") + /* + typedCode = sm""" + |object PM4 { + | scala.collection.immutable.List.apply(1, 2).map(((x0$$3) => x0$$3 match { + | case _ => 42 + | }))(scala.collection.immutable.List.canBuildFrom) + |}""") + * + */ + + @Test def testObjectWithPatternMatch5 = assertResultCode( + code = sm""" + |object PM5 { + | List(1, 2) match { + | case x :: xs => x + | } + |}""")( + parsedCode = sm""" + |object PM5 { + | List(1, 2) match { + | case ::((x @ _), (xs @ _)) => x + | } + |}""", + typedCode = sm""" + |object PM5 { + | scala.collection.immutable.List.apply(1, 2) match { + | case scala.`package`.::((x @ _), (xs @ _)) => x + | } + |}""") + + @Test def testObjectWithPatternMatch6 = assertResultCode( + code = sm""" + |object PM6 { + | List(1, 2).map { + | case (0 | 1) => true + | case _ => false + | } + |}""")( + parsedCode = sm""" + |object PM6 { + | List(1, 2).map({ + | case (0| 1) => true + | case _ => false + | }) + |}""") + /* + typedCode = sm""" + |object PM6 { + | scala.collection.immutable.List.apply(1, 2).map(((x0$$4) => x0$$4 match { + | case (0| 1) => true + | case _ => false + | }))(scala.collection.immutable.List.canBuildFrom) + |}""" + * + */ + + @Test def testObjectWithPatternMatch7 = assertPrintedCode(sm""" + |object PM7 { + | scala.Predef.augmentString("abcde").toList match { + | case scala.collection.Seq((car @ _), _*) => car + | } + |}""") + + @Test def testObjectWithPatternMatch8 = assertPrintedCode(sm""" + |{ + | object Extractor { + | def unapply(i: scala.Int) = scala.Some.apply(i) + | }; + | object PM9 { + | 42 match { + | case (a @ Extractor((i @ _))) => i + | } + | }; + | () + |}""") + + @Test def testObjectWithPartialFunc = assertPrintedCode(sm""" + |object Test { + | def partFuncTest[A, B](e: scala.`package`.Either[A, B]): scala.Unit = e match { + | case scala.`package`.Right(_) => () + | } + |}""") + + @Test def testObjectWithTry = assertResultCode( + code = sm""" + |object Test { + | import java.io._; + | var file: PrintStream = null; + | try { + | val out = new FileOutputStream("myfile.txt"); + | file = new PrintStream(out) + | } catch { + | case ioe: IOException => println("ioe") + | case e: Exception => println("e") + | } finally println("finally") + |}""")( + parsedCode = sm""" + |object Test { + | import java.io._; + | var file: PrintStream = null; + | try { + | val out = new FileOutputStream("myfile.txt"); + | file = new PrintStream(out) + | } catch { + | case (ioe @ ((_): IOException)) => println("ioe") + | case (e @ ((_): Exception)) => println("e") + | } finally println("finally") + |}""", + typedCode = sm""" + |object Test { + | import java.io._; + | var file: java.io.PrintStream = null; + | try { + | val out = new java.io.FileOutputStream("myfile.txt"); + | Test.this.`file_=`(new java.io.PrintStream(out)) + | } catch { + | case (ioe @ ((_): java.io.IOException)) => scala.Predef.println("ioe") + | case (e @ ((_): scala.`package`.Exception)) => scala.Predef.println("e") + | } finally scala.Predef.println("finally") + |}""") +} + +trait TraitPrintTests { + @Test def testTrait = assertPrintedCode("trait *") + + @Test def testTraitWithBody = assertPrintedCode(sm""" + |trait X { + | def y = "test" + |}""") + + @Test def testTraitWithSelfTypeAndBody = assertPrintedCode(sm""" + |trait X { self: scala.Cloneable => + | def y = "test" + |}""") + + @Test def testTraitWithSelf1 = assertPrintedCode(sm""" + |trait X { self => + | def y = "test" + |}""") + + @Test def testTraitWithSelf2 = assertPrintedCode(sm""" + |trait X { self: scala.Cloneable with scala.Serializable => + | val x: scala.Int = 1 + |}""") + + @Test def testTraitTypeParams = assertPrintedCode("trait X[A, B]") + + @Test def testTraitWithBody2 = assertPrintedCode(sm""" + |trait X { + | def foo: scala.Unit; + | val bar: scala.Predef.String + |}""") + + @Test def testTraitWithInh = assertPrintedCode("trait X extends scala.Cloneable with scala.Serializable") + + @Test def testTraitWithEarly1 = assertPrintedCode(sm""" + |trait X extends { + | val x: Int = 1 + |} with AnyRef""", checkTypedTree = false) + + @Test def testTraitWithEarly2 = assertPrintedCode(sm""" + |trait X extends { + | val x: scala.Int = 0; + | type Foo = scala.Unit + |} with scala.Cloneable""") + + @Test def testTraitWithEarly3 = assertPrintedCode(sm""" + |trait X extends { + | val x: scala.Int = 5; + | val y: scala.Double = 4.0; + | type Foo; + | type XString = scala.Predef.String + |} with scala.Serializable""") + + @Test def testTraitWithEarly4 = assertPrintedCode(sm""" + |trait X extends { + | val x: scala.Int = 5; + | val y: scala.Double = 4.0; + | type Foo; + | type XString = scala.Predef.String + |} with scala.Serializable { + | val z = 7 + |}""") + + @Test def testTraitWithSingletonTypeTree = assertPrintedCode(sm""" + |trait Test { + | def testReturnSingleton(): Test.this.type + |}""") + + @Test def testTraitWithThis = assertTreeCode(q"trait Test { this: X with Y => }")(sm""" + |trait Test { _ : X with Y => + | + |}""") + + @Test def testTraitWithWhile1 = assertPrintedCode(sm""" + |trait Test { + | while (false) + | scala.Predef.println("testing...") + | + |}""") + + @Test def testTraitWithWhile2 = assertPrintedCode(sm""" + |trait Test { + | while (true) + | { + | scala.Predef.println("testing..."); + | scala.Predef.println("testing...") + | } + | + |}""") + + @Test def testTraitWithDoWhile1 = assertPrintedCode(sm""" + |trait Test { + | do + | scala.Predef.println("testing...") + | while (true) + |}""") + + @Test def testTraitWithTypes = assertResultCode( + code = sm""" + |trait Test { + | type A = Int; + | type B >: Nothing <: AnyRef; + | protected type C >: Nothing; + | type D <: AnyRef + |}""")( + parsedCode = sm""" + |trait Test { + | type A = Int; + | type B >: Nothing <: AnyRef; + | protected type C >: Nothing; + | type D <: AnyRef + |}""", + typedCode = sm""" + |trait Test { + | type A = scala.Int; + | type B <: scala.AnyRef; + | protected type C; + | type D <: scala.AnyRef + |}""") +} + +trait ValAndDefPrintTests { + @Test def testVal1 = assertPrintedCode("val a: scala.Unit = ()") + + @Test def testVal2 = assertPrintedCode("val * : scala.Unit = ()") + + @Test def testVal3 = assertPrintedCode("val a_ : scala.Unit = ()") + + @Test def testDef1 = assertPrintedCode("def a = ()") + + @Test def testDef2 = assertPrintedCode("def * : scala.Unit = ()") + + @Test def testDef3 = assertPrintedCode("def a_(x: scala.Int): scala.Unit = ()") + + @Test def testDef4 = assertPrintedCode("def a_ : scala.Unit = ()") + + @Test def testDef5 = assertPrintedCode("def a_(* : scala.Int): scala.Unit = ()") + + @Test def testDef6 = assertPrintedCode("def a_(b_ : scala.Int) = ()") + + @Test def testDef7 = assertTreeCode{ + Block( + DefDef(NoMods, newTermName("test1"), Nil, Nil, EmptyTree, Literal(Constant(()))), + DefDef(NoMods, newTermName("test2"), Nil, Nil :: Nil, EmptyTree, Literal(Constant(()))) + ) + }(sm""" + |{ + | def test1 = (); + | def test2() = () + |}""") + + @Test def testDef8 = { + val arg = ValDef(Modifiers(Flag.IMPLICIT) , newTermName("a"), + AppliedTypeTree(Ident(newTypeName("R")), List(Ident(newTypeName("X")))), EmptyTree) + + //def m[X](implicit a: R[X]) = () + val tree = DefDef(NoMods, newTermName("test"), TypeDef(NoMods, newTypeName("X"), Nil, EmptyTree) :: Nil, + List(List(arg)), EmptyTree, Literal(Constant(()))) + + assertTreeCode(tree)("def test[X](implicit a: R[X]) = ()") + } + + @Test def testDef9 = assertPrintedCode("def a(x: scala.Int)(implicit z: scala.Double, y: scala.Float): scala.Unit = ()") + + @Test def testDefWithLazyVal1 = assertResultCode( + code = "def a = { lazy val test: Int = 42 }")( + parsedCode = sm""" + |def a = { + | lazy val test: Int = 42; + | () + |} + """, + typedCode = sm""" + |def a = { + | lazy val test: scala.Int = 42; + | () + |}""") + + @Test def testDefWithLazyVal2 = assertPrintedCode(sm""" + |def a = { + | lazy val test = { + | scala.Predef.println(); + | scala.Predef.println() + | }; + | () + |}""") + + @Test def testDefWithParams1 = assertPrintedCode("def foo(x: scala.Int*) = ()") + + @Test def testDefWithParams2 = assertPrintedCode(sm""" + |{ + | def foo(x: scala.Int)(y: scala.Int = 1) = (); + | () + |}""") + + @Test def testDefWithTypeParams1 = assertPrintedCode(sm""" + |{ + | def foo[A, B, C](x: A)(y: scala.Int = 1): C = ().asInstanceOf[C]; + | () + |}""") + + @Test def testDefWithTypeParams2 = assertPrintedCode("def foo[A, B <: scala.AnyVal] = ()") + + @Test def testDefWithAnn1 = assertPrintedCode("@annot def foo = null", checkTypedTree = false) + + @Test def testDefWithAnn2 = assertPrintedCode("@a(x) def foo = null", checkTypedTree = false) + + @Test def testDefWithAnn3 = assertPrintedCode("@Foo[A, B] def foo = null", checkTypedTree = false) + + @Test def testDefWithAnn4 = assertPrintedCode("@Foo(a)(b)(x, y) def foo = null", checkTypedTree = false) + + @Test def testDefWithAnn5 = assertPrintedCode("@Foo[A, B](a)(b) @Bar def foo(x: Int) = null", checkTypedTree = false) + + @Test def testDefWithAnn6 = assertPrintedCode("@test1(new test2()) def foo = 42", checkTypedTree = false) + + @Test def testDefWithAnn7 = assertPrintedCode("@`t*` def foo = 42", checkTypedTree = false) + + @Test def testDefWithAnn8 = assertPrintedCode("@throws(classOf[Exception]) def foo = throw new Exception()", checkTypedTree = false) + + @Test def testAnnotated1 = assertResultCode( + code = "def foo = 42: @baz")( + parsedCode = "def foo = 42: @baz", + typedCode = "def foo = (42: @baz)", + wrap = true) + + @Test def testAnnotated2 = assertResultCode( + code = "def foo = 42: @foo2[A1, B1](4)(2)")( + parsedCode = "def foo = 42: @foo2[A1, B1](4)(2)", + typedCode = "def foo = (42: @foo2[A1, B1](4)(2))", + wrap = true) + + @Test def testAnnotated3 = assertResultCode( + code = "def foo = (42: @foo1[A1, B1]): @foo2[A1, B1](4)(2)")( + parsedCode = "def foo = (42: @foo1[A1, B1]): @foo2[A1, B1](4)(2)", + typedCode = "def foo = ((42: @foo1[A1, B1]): @foo2[A1, B1](4)(2))", + wrap = true) + + @Test def testAnnotated4 = assertResultCode( + code = "def foo = 42: @foo3[A1, B1](4)(2.0F, new foo1[A1, B1]())")( + parsedCode = "def foo = 42: @foo3[A1, B1](4)(2.0F, new foo1[A1, B1]())", + typedCode = "def foo = (42: @foo3[A1, B1](4)(2.0F, new foo1[A1, B1]()))", + wrap = true) + + @Test def testAnnotated5 = assertPrintedCode(sm""" + |{ + | val x = 5; + | (x: @unchecked) match { + | case ((_): scala.Int) => true + | case _ => false + | } + |}""") + + @Test def testAnnotated8 = assertPrintedCode(sm""" + |{ + | val x = 5; + | ((x: @unchecked): @foo3(4)(2.0F, new foo1[A1, B1]())) match { + | case _ => true + | } + |}""", wrapCode = true) +} + +trait PackagePrintTests { + @Test def testPackage1 = assertPrintedCode(sm""" + |package foo.bar { + | + |}""", checkTypedTree = false) + + @Test def testPackage2 = assertPrintedCode(sm""" + |package foo { + | class C + | + | object D + |}""", checkTypedTree = false) + + //package object foo extends a with b + @Test def testPackage3 = assertPrintedCode(sm""" + |package foo { + | object `package` extends a with b + |}""", checkTypedTree = false) + + //package object foo { def foo; val x = 1 } + @Test def testPackage4 = assertPrintedCode(sm""" + |package foo { + | object `package` { + | def foo: scala.Unit = (); + | val x = 1 + | } + |}""", checkTypedTree = false) + + //package object foo extends { val x = 1; type I = Int } with Any + @Test def testPackage5 = assertPrintedCode(sm""" + |package foo { + | object `package` extends { + | val x = 1; + | type I = Int + | } with AnyRef + |}""", checkTypedTree = false) +} + +trait QuasiTreesPrintTests { + @Test def testQuasiIdent = assertTreeCode(q"*")("*") + + @Test def testQuasiVal = assertTreeCode(q"val * : Unit = null")("val * : Unit = null") + + @Test def testQuasiDef = assertTreeCode(q"def * : Unit = null")("def * : Unit = null") + + @Test def testQuasiTrait = assertTreeCode(q"trait *")("trait *") + + @Test def testQuasiClass = assertTreeCode(q"class *")("class *") + + @Test def testQuasiClassWithPublicParams = assertTreeCode(q"class X(val x: Int, val s:String)")("class X(val x: Int, val s: String)") + + @Test def testQuasiClassWithParams = assertTreeCode(q"class X(x: Int, s:String)")("class X(x: Int, s: String)") + + @Test def testQuasiObject = assertTreeCode(q"object *")("object *") + + @Test def testQuasiObjectWithBody = assertTreeCode(q"""object X{ def y = "test" }""")(sm""" + |object X { + | def y = "test" + |}""") + + @Test def testQuasiClassWithBody = assertTreeCode(q"""class X{ def y = "test" }""")(sm""" + |class X { + | def y = "test" + |}""") + + @Test def testQuasiTraitWithBody = assertTreeCode(q"""trait X{ def y = "test" }""")(sm""" + |trait X { + | def y = "test" + |}""") + + @Test def testQuasiTraitWithSelfTypeAndBody = assertTreeCode(q"""trait X{ self: Order => def y = "test" }""")(sm""" + |trait X { self: Order => + | def y = "test" + |}""") + + @Test def testQuasiTraitWithSelf = assertTreeCode(q"""trait X{ self => def y = "test" }""")(sm""" + |trait X { self => + | def y = "test" + |}""") + + @Test def testQuasiCaseClassWithBody = assertTreeCode(q"""case class X() { def y = "test" }""")(sm""" + |case class X() { + | def y = "test" + |}""") + + @Test def testQuasiCaseClassWithParamsAndBody = assertTreeCode(q"""case class X(x: Int, s: String){ def y = "test" }""")(sm""" + |case class X(x: Int, s: String) { + | def y = "test" + |}""") +}
\ No newline at end of file diff --git a/test/scaladoc/resources/SI-8144.scala b/test/scaladoc/resources/SI-8144.scala new file mode 100644 index 0000000000..7b225acb32 --- /dev/null +++ b/test/scaladoc/resources/SI-8144.scala @@ -0,0 +1,17 @@ +package some.pack + +class SomeType(arg: String) { + + type TypeAlias = String + + def >@<(): TypeAlias = "Tricky method name" + + def >#<(): Int = 1 + +} + +object SomeType { + + val someVal = "Some arbitrary companion object value" + +} diff --git a/test/scaladoc/resources/SI-8514.scala b/test/scaladoc/resources/SI-8514.scala new file mode 100644 index 0000000000..4c5476604b --- /dev/null +++ b/test/scaladoc/resources/SI-8514.scala @@ -0,0 +1,10 @@ +package a { + class DeveloperApi extends scala.annotation.StaticAnnotation + + /** Some doc here */ + @DeveloperApi + class A + + @DeveloperApi + class B +} diff --git a/test/scaladoc/run/t8407.check b/test/scaladoc/run/t8407.check new file mode 100644 index 0000000000..06c860b3eb --- /dev/null +++ b/test/scaladoc/run/t8407.check @@ -0,0 +1,4 @@ +newSource:4: warning: not found: type $NotFound + * @usecase def zipWithIndex: $NotFound + ^ +Done. diff --git a/test/scaladoc/run/t8407.scala b/test/scaladoc/run/t8407.scala new file mode 100644 index 0000000000..2df9f4f1ac --- /dev/null +++ b/test/scaladoc/run/t8407.scala @@ -0,0 +1,20 @@ +import scala.tools.nsc.doc.model._ +import scala.tools.partest.ScaladocModelTest + +object Test extends ScaladocModelTest { + override def code = """ +class C { + /** + * @usecase def zipWithIndex: $NotFound + * + */ + def zipWithIndex: Int = ??? +} + """ + + def scaladocSettings = "" + + def testModel(root: Package) = { + // just testing that it doesn't error out. + } +} diff --git a/test/scaladoc/scalacheck/HtmlFactoryTest.scala b/test/scaladoc/scalacheck/HtmlFactoryTest.scala index 56328ea875..ef70e0bf21 100644 --- a/test/scaladoc/scalacheck/HtmlFactoryTest.scala +++ b/test/scaladoc/scalacheck/HtmlFactoryTest.scala @@ -149,7 +149,6 @@ object Test extends Properties("HtmlFactory") { result } - def shortComments(root: scala.xml.Node) = XMLUtil.stripGroup(root).descendant.flatMap { case e: scala.xml.Elem => { @@ -417,7 +416,7 @@ object Test extends Properties("HtmlFactory") { checkText("SI_5054_q1.scala")( (None,"""def test(): Int""", true) //Disabled because the full signature is now displayed - //(None,"""def test(implicit lost: Int): Int""", false) + //(None, """def test(implicit lost: Int): Int""", false) ) property("SI-5054: Use cases should keep their flags - final should not be lost") = @@ -564,7 +563,7 @@ object Test extends Properties("HtmlFactory") { property("Comment inheritance: Correct explicit inheritance for override") = checkText("explicit-inheritance-override.scala")( (Some("InheritDocDerived"), - """def function[T](arg1: T, arg2: String): Double + """def function[T](arg1: T, arg2: String): Double Starting line Starting line The base comment. And another sentence... @@ -591,7 +590,7 @@ object Test extends Properties("HtmlFactory") { property("Comment inheritance: Correct explicit inheritance for usecase") = checkText("explicit-inheritance-usecase.scala")( (Some("UseCaseInheritDoc"), - """def function[T](arg1: T, arg2: String): Double + """def function[T](arg1: T, arg2: String): Double [use case] Starting line [use case] Starting line The base comment. And another sentence... @@ -740,5 +739,78 @@ object Test extends Properties("HtmlFactory") { case node: scala.xml.Node => true case _ => false } + + property("SI-8514: No inconsistencies") = + checkText("SI-8514.scala")( + (Some("a/package"), + """class A extends AnyRef + Some doc here + Some doc here + Annotations @DeveloperApi() + """, true), + (Some("a/package"), + """class B extends AnyRef + Annotations @DeveloperApi() + """, true) + ) + } + + // SI-8144 + { + implicit class AttributesAwareNode(val node: NodeSeq) { + + def \@(attrName: String): String = + node \ ("@" + attrName) text + + def \@(attrName: String, attrValue: String): NodeSeq = + node filter { _ \ ("@" + attrName) exists (_.text == attrValue) } + } + + implicit class AssertionAwareNode(node: scala.xml.NodeSeq) { + + def assertTypeLink(expectedUrl: String): Boolean = { + val linkElement: NodeSeq = node \\ "div" \@ ("id", "definition") \\ "span" \@ ("class", "permalink") \ "a" + linkElement \@ "href" == expectedUrl && linkElement \@ "target" == "_top" + } + + def assertMemberLink(group: String)(memberName: String, expectedUrl: String): Boolean = { + val linkElement: NodeSeq = node \\ "div" \@ ("id", group) \\ "li" \@ ("name", memberName) \\ "span" \@ ("class", "permalink") \ "a" + linkElement \@ "href" == expectedUrl && linkElement \@ "target" == "_top" + } + + } + + val files = createTemplates("SI-8144.scala") + + def check(pagePath: String)(f: NodeSeq => org.scalacheck.Prop): org.scalacheck.Prop = + files(pagePath) match { + case node: scala.xml.Node => f(XMLUtil.stripGroup(node)) + case _ => false + } + + property("SI-8144: Members' permalink - package") = check("some/package.html") { node => + ("type link" |: node.assertTypeLink("../index.html#some.package")) && + ("member: some.pack" |: node.assertMemberLink("values")("some.pack", "../index.html#some.package@pack")) + } + + property("SI-8144: Members' permalink - inner package") = check("some/pack/package.html") { node => + ("type link" |: node.assertTypeLink("../../index.html#some.pack.package")) && + ("member: SomeType (object)" |: node.assertMemberLink("values")("some.pack.SomeType", "../../index.html#some.pack.package@SomeType")) && + ("member: SomeType (class)" |: node.assertMemberLink("types")("some.pack.SomeType", "../../index.html#some.pack.package@SomeTypeextendsAnyRef")) + } + + property("SI-8144: Members' permalink - companion object") = check("some/pack/SomeType$.html") { node => + ("type link" |: node.assertTypeLink("../../index.html#some.pack.SomeType$")) && + ("member: someVal" |: node.assertMemberLink("allMembers")("some.pack.SomeType#someVal", "../../index.html#some.pack.SomeType$@someVal:String")) + } + + property("SI-8144: Members' permalink - class") = check("some/pack/SomeType.html") { node => + ("type link" |: node.assertTypeLink("../../index.html#some.pack.SomeType")) && + ("constructor " |: node.assertMemberLink("constructors")("some.pack.SomeType#<init>", "../../index.html#some.pack.SomeType@<init>(arg:String):some.pack.SomeType")) && + ( "member: type TypeAlias" |: node.assertMemberLink("types")("some.pack.SomeType.TypeAlias", "../../index.html#some.pack.SomeType@TypeAlias=String")) && + ( "member: def >#<():Int " |: node.assertMemberLink("values")("some.pack.SomeType#>#<", "../../index.html#some.pack.SomeType@>#<():Int")) && + ( "member: def >@<():TypeAlias " |: node.assertMemberLink("values")("some.pack.SomeType#>@<", "../../index.html#some.pack.SomeType@>@<():SomeType.this.TypeAlias")) + } + } } |