diff options
Diffstat (limited to 'sbt-bridge/src/sbt-test/source-dependencies/value-class')
11 files changed, 88 insertions, 0 deletions
diff --git a/sbt-bridge/src/sbt-test/source-dependencies/value-class/build.sbt b/sbt-bridge/src/sbt-test/source-dependencies/value-class/build.sbt new file mode 100644 index 000000000..77cf9f18c --- /dev/null +++ b/sbt-bridge/src/sbt-test/source-dependencies/value-class/build.sbt @@ -0,0 +1 @@ +incOptions := incOptions.value.withRecompileAllFraction(1.0) diff --git a/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/A0.scala b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/A0.scala new file mode 100644 index 000000000..ad5bf4c56 --- /dev/null +++ b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/A0.scala @@ -0,0 +1 @@ +class A(val x: Int) diff --git a/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/A1.scala b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/A1.scala new file mode 100644 index 000000000..dbaa1c3f0 --- /dev/null +++ b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/A1.scala @@ -0,0 +1 @@ +class A(val x: Int) extends AnyVal diff --git a/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/B0.scala b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/B0.scala new file mode 100644 index 000000000..0dba978c3 --- /dev/null +++ b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/B0.scala @@ -0,0 +1,3 @@ +class B { + def foo(a: A): Int = 1 +} diff --git a/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/B1.scala b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/B1.scala new file mode 100644 index 000000000..c7b689c5e --- /dev/null +++ b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/B1.scala @@ -0,0 +1,3 @@ +class B { + def bar: A = new A(0) +} diff --git a/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/B2.scala b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/B2.scala new file mode 100644 index 000000000..fe1136389 --- /dev/null +++ b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/B2.scala @@ -0,0 +1,3 @@ +class B { + def bar(dummy: String)(dummy2: String): A = new A(0) +} diff --git a/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/C0.scala b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/C0.scala new file mode 100644 index 000000000..1fed7a120 --- /dev/null +++ b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/C0.scala @@ -0,0 +1,3 @@ +object C extends dotty.runtime.LegacyApp { + println(new B().foo(null)) +} diff --git a/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/C1.scala b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/C1.scala new file mode 100644 index 000000000..f10fe2d16 --- /dev/null +++ b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/C1.scala @@ -0,0 +1,3 @@ +object C extends dotty.runtime.LegacyApp { + println(new B().bar.x) +} diff --git a/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/C2.scala b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/C2.scala new file mode 100644 index 000000000..a0c5c6972 --- /dev/null +++ b/sbt-bridge/src/sbt-test/source-dependencies/value-class/changes/C2.scala @@ -0,0 +1,3 @@ +object C extends dotty.runtime.LegacyApp { + println(new B().bar("")("").x) +} diff --git a/sbt-bridge/src/sbt-test/source-dependencies/value-class/project/DottyInjectedPlugin.scala b/sbt-bridge/src/sbt-test/source-dependencies/value-class/project/DottyInjectedPlugin.scala new file mode 100644 index 000000000..3433779b6 --- /dev/null +++ b/sbt-bridge/src/sbt-test/source-dependencies/value-class/project/DottyInjectedPlugin.scala @@ -0,0 +1,17 @@ +import sbt._ +import Keys._ + +object DottyInjectedPlugin extends AutoPlugin { + override def requires = plugins.JvmPlugin + override def trigger = allRequirements + + override val projectSettings = Seq( + scalaVersion := "0.1-SNAPSHOT", + scalaOrganization := "ch.epfl.lamp", + scalacOptions += "-language:Scala2", + scalaBinaryVersion := "2.11", + autoScalaLibrary := false, + libraryDependencies ++= Seq("org.scala-lang" % "scala-library" % "2.11.5"), + scalaCompilerBridgeSource := ("ch.epfl.lamp" % "dotty-bridge" % "0.1.1-SNAPSHOT" % "component").sources() + ) +} diff --git a/sbt-bridge/src/sbt-test/source-dependencies/value-class/test b/sbt-bridge/src/sbt-test/source-dependencies/value-class/test new file mode 100644 index 000000000..268274bf6 --- /dev/null +++ b/sbt-bridge/src/sbt-test/source-dependencies/value-class/test @@ -0,0 +1,50 @@ +## Case 1: value class as parameter of method +$ copy-file changes/A0.scala src/main/scala/A.scala +$ copy-file changes/B0.scala src/main/scala/B.scala +$ copy-file changes/C0.scala src/main/scala/C.scala + +# A is a normal class. B.foo accepts a parameter of type A. C calls B.foo, giving it `null`. +> compile +> run + +# Make A a value class. +$ copy-file changes/A1.scala src/main/scala/A.scala + +# The code no longer compiles because B.foo no longer accepts `null` as an argument. +# This means that we have invalidated C.scala, as expected! +-> compile + + +## Case 2: value class as return type of method with no parameter lists +$ copy-file changes/A0.scala src/main/scala/A.scala +$ copy-file changes/B1.scala src/main/scala/B.scala +$ copy-file changes/C1.scala src/main/scala/C.scala + +# A is a normal class. B.bar takes no arguments and returns an instance of A. C calls B.bar. +> compile +> run + +# Make A a value class. +$ copy-file changes/A1.scala src/main/scala/A.scala + +# The code compiles. It will run iff C is recompiled because the signature of B.bar has changed, +# because A is now a value class. +> run + + +## Case 3: value class as return type of method with multiple parameter lists +$ copy-file changes/A0.scala src/main/scala/A.scala +$ copy-file changes/B2.scala src/main/scala/B.scala +$ copy-file changes/C2.scala src/main/scala/C.scala + +# A is a normal class. B.bar takes two dummy arguments and returns an instance of A. C calls B.bar("")(""). +> compile +> run + +# Make A a value class. +$ copy-file changes/A1.scala src/main/scala/A.scala + +# The code compiles. It will run iff C is recompiled because the signature of B.bar has changed, +# because A is now a value class. +> run + |