diff --git a/scala/scala.bzl b/scala/scala.bzl index 10fb4669d..892ba706f 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -330,7 +330,7 @@ def _lib(ctx, non_macro_lib): texp = _collect_jars(ctx.attr.exports) scalaattr = struct(outputs = rule_outputs, transitive_runtime_deps = rjars, - transitive_compile_exports = texp.compiletime + cjars, + transitive_compile_exports = texp.compiletime, transitive_runtime_exports = texp.runtime ) runfiles = ctx.runfiles( diff --git a/test/A.scala b/test/A.scala index 7e8f9f212..de5e15dd7 100644 --- a/test/A.scala +++ b/test/A.scala @@ -4,4 +4,4 @@ object A { def main(args: Array[String]) { println("4 8 15 16 23 42") } -} \ No newline at end of file +} diff --git a/test/BUILD b/test/BUILD index e667bccba..faa2fa6a4 100644 --- a/test/BUILD +++ b/test/BUILD @@ -65,7 +65,8 @@ scala_library( deps = [ "OtherJavaLib", "OtherLib", - "MacroTest" + "MacroTest", + "Exported" ], ) @@ -87,31 +88,10 @@ scala_repl( name = "HelloLibTestRepl", deps = [":HelloLibTest"]) -scala_library( - name = "a", - srcs = ["A.scala"] -) - -scala_library( - name = "b", - exports = [":a"], -) - -scala_library( - name = "c", - deps = [":b"], -) - -scala_library( - name = "d", - deps = [":c"], - srcs = ["D.scala"], -) - scala_library( name = "OtherLib", srcs = ["OtherLib.scala"], - exports = ["ExportOnly"], # test of exported target + deps = ["ExportOnly"], ) # Test of library without src diff --git a/test/D.scala b/test/D.scala index 15c6e3fef..0b758990c 100644 --- a/test/D.scala +++ b/test/D.scala @@ -4,4 +4,4 @@ object D { def main(args: Array[String]) { A.main(args) } -} \ No newline at end of file +} diff --git a/test/HelloLibTest.scala b/test/HelloLibTest.scala index 6f925fb1a..fcb983546 100644 --- a/test/HelloLibTest.scala +++ b/test/HelloLibTest.scala @@ -22,7 +22,7 @@ object TestUtil { class ScalaSuite extends FlatSpec { "HelloLib" should "call scala" in { - assert(HelloLib.getOtherLibMessage("hello").equals("hello scala!")) + assert(HelloLib.getOtherLibMessage("hello").equals("hello you all, everybody. I am Runtime")) } } diff --git a/test/OtherLib.scala b/test/OtherLib.scala index e6e21a7b3..cf012134c 100644 --- a/test/OtherLib.scala +++ b/test/OtherLib.scala @@ -16,9 +16,5 @@ package scala.test // It is just to show how a Scala library can depend on another Scala library. object OtherLib { - def getMessage(): String = { - // This won't compile because Exported is exported, not a dep: - // Exported.message - "scala!" - } + def getMessage(): String = Exported.message } diff --git a/test/src/main/scala/scala/test/disappearing_class/ClassProvider.scala b/test/src/main/scala/scala/test/disappearing_class/ClassProvider.scala index 53a8d45b8..1485333bb 100644 --- a/test/src/main/scala/scala/test/disappearing_class/ClassProvider.scala +++ b/test/src/main/scala/scala/test/disappearing_class/ClassProvider.scala @@ -1,8 +1,3 @@ package scala.test -object ClassProvider { - def dissappearingClassMethod: String = "testContents" -} - - object BackgroundNoise{} diff --git a/test/src/main/scala/scala/test/twitter_scrooge/BUILD b/test/src/main/scala/scala/test/twitter_scrooge/BUILD index cd79723ee..c51a5312f 100644 --- a/test/src/main/scala/scala/test/twitter_scrooge/BUILD +++ b/test/src/main/scala/scala/test/twitter_scrooge/BUILD @@ -50,6 +50,7 @@ scala_library( name = "justscrooge1", srcs = ["JustScrooge1.scala"], deps = [":scrooge1"], + exports = [":scrooge1"] ) scala_library( @@ -68,6 +69,7 @@ scala_library( name = "justscrooge3", srcs = ["JustScrooge3.scala"], deps = [":scrooge3"], + exports = [":scrooge3"], ) scala_library( @@ -107,7 +109,7 @@ scala_binary( scala_library( name = "allscrooges", - deps = [ + exports = [ ":scrooge1", ":scrooge2_a", ":scrooge2_b", @@ -120,4 +122,4 @@ scala_binary( srcs = ["JustScrooge1.scala"], deps = [":allscrooges"], main_class = "scala.test.twitter_scrooge.JustScrooge1", -) \ No newline at end of file +) diff --git a/test/src/main/scala/scala/test/disappearing_class/BUILD b/test_expect_failure/disappearing_class/BUILD similarity index 100% rename from test/src/main/scala/scala/test/disappearing_class/BUILD rename to test_expect_failure/disappearing_class/BUILD diff --git a/test_expect_failure/disappearing_class/ClassProvider.scala b/test_expect_failure/disappearing_class/ClassProvider.scala new file mode 100644 index 000000000..53a8d45b8 --- /dev/null +++ b/test_expect_failure/disappearing_class/ClassProvider.scala @@ -0,0 +1,8 @@ +package scala.test + +object ClassProvider { + def dissappearingClassMethod: String = "testContents" +} + + +object BackgroundNoise{} diff --git a/test/src/main/scala/scala/test/disappearing_class/UsesClass.scala b/test_expect_failure/disappearing_class/UsesClass.scala similarity index 100% rename from test/src/main/scala/scala/test/disappearing_class/UsesClass.scala rename to test_expect_failure/disappearing_class/UsesClass.scala diff --git a/test_expect_failure/transitive/java_to_scala/A.scala b/test_expect_failure/transitive/java_to_scala/A.scala new file mode 100644 index 000000000..4e60b7d6f --- /dev/null +++ b/test_expect_failure/transitive/java_to_scala/A.scala @@ -0,0 +1,7 @@ +package example + +object A { + def foo { + println("hi") + } +} diff --git a/test_expect_failure/transitive/java_to_scala/BUILD b/test_expect_failure/transitive/java_to_scala/BUILD new file mode 100644 index 000000000..4ee822e9c --- /dev/null +++ b/test_expect_failure/transitive/java_to_scala/BUILD @@ -0,0 +1,24 @@ +load("//scala:scala.bzl", "scala_library", "scala_export_to_java") + +scala_library( + name = "a", + srcs = ["A.scala"] +) + +scala_export_to_java( + name = "b", + exports = [":a"], + runtime_deps = [] +) + +java_library( + name = "c", + srcs = ["C.java"], + deps = [":b"], +) + +java_library( + name = "d", + srcs = ["D.java"], + deps = [":c"], +) diff --git a/test_expect_failure/transitive/java_to_scala/C.java b/test_expect_failure/transitive/java_to_scala/C.java new file mode 100644 index 000000000..58ac0701a --- /dev/null +++ b/test_expect_failure/transitive/java_to_scala/C.java @@ -0,0 +1,3 @@ +package example; + +public class C {} diff --git a/test_expect_failure/transitive/java_to_scala/D.java b/test_expect_failure/transitive/java_to_scala/D.java new file mode 100644 index 000000000..bdaf613de --- /dev/null +++ b/test_expect_failure/transitive/java_to_scala/D.java @@ -0,0 +1,7 @@ +package example; + +public class D { + public static void main(String[] args) { + A.foo(); + } +} diff --git a/test_expect_failure/transitive/scala_to_java/A.java b/test_expect_failure/transitive/scala_to_java/A.java new file mode 100644 index 000000000..f9c50664e --- /dev/null +++ b/test_expect_failure/transitive/scala_to_java/A.java @@ -0,0 +1,7 @@ +package example; + +public class A { + public static void foo() { + System.out.println("yeah?"); + } +} diff --git a/test_expect_failure/transitive/scala_to_java/BUILD b/test_expect_failure/transitive/scala_to_java/BUILD new file mode 100644 index 000000000..3bc111586 --- /dev/null +++ b/test_expect_failure/transitive/scala_to_java/BUILD @@ -0,0 +1,22 @@ +load("//scala:scala.bzl", "scala_library") + +java_library( + name = "a", + srcs = ["A.java"] +) + +scala_library( + name = "b", + exports = [":a"], +) + +scala_library( + name = "c", + deps = [":b"], +) + +scala_library( + name = "d", + deps = [":c"], + srcs = ["D.scala"], +) diff --git a/test_expect_failure/transitive/scala_to_java/D.scala b/test_expect_failure/transitive/scala_to_java/D.scala new file mode 100644 index 000000000..a53fafc47 --- /dev/null +++ b/test_expect_failure/transitive/scala_to_java/D.scala @@ -0,0 +1,7 @@ +package example + +object D { + def main(args: Array[String]) { + A.foo + } +} diff --git a/test_expect_failure/transitive/scala_to_scala/A.scala b/test_expect_failure/transitive/scala_to_scala/A.scala new file mode 100644 index 000000000..4e60b7d6f --- /dev/null +++ b/test_expect_failure/transitive/scala_to_scala/A.scala @@ -0,0 +1,7 @@ +package example + +object A { + def foo { + println("hi") + } +} diff --git a/test_expect_failure/transitive/scala_to_scala/BUILD b/test_expect_failure/transitive/scala_to_scala/BUILD new file mode 100644 index 000000000..09764ef1a --- /dev/null +++ b/test_expect_failure/transitive/scala_to_scala/BUILD @@ -0,0 +1,22 @@ +load("//scala:scala.bzl", "scala_library") + +scala_library( + name = "a", + srcs = ["A.scala"] +) + +scala_library( + name = "b", + exports = [":a"], +) + +scala_library( + name = "c", + deps = [":b"], +) + +scala_library( + name = "d", + deps = [":c"], + srcs = ["D.scala"], +) diff --git a/test_expect_failure/transitive/scala_to_scala/D.scala b/test_expect_failure/transitive/scala_to_scala/D.scala new file mode 100644 index 000000000..a53fafc47 --- /dev/null +++ b/test_expect_failure/transitive/scala_to_scala/D.scala @@ -0,0 +1,7 @@ +package example + +object D { + def main(args: Array[String]) { + A.foo + } +} diff --git a/test_run.sh b/test_run.sh index 12d209b99..3d5a281d7 100755 --- a/test_run.sh +++ b/test_run.sh @@ -3,13 +3,13 @@ set -e test_disappearing_class() { - git checkout test/src/main/scala/scala/test/disappearing_class/ClassProvider.scala - bazel build test/src/main/scala/scala/test/disappearing_class:uses_class - echo -e "package scala.test\n\nobject BackgroundNoise{}" > test/src/main/scala/scala/test/disappearing_class/ClassProvider.scala + git checkout test_expect_failure/disappearing_class/ClassProvider.scala + bazel build test_expect_failure/disappearing_class:uses_class + echo -e "package scala.test\n\nobject BackgroundNoise{}" > test_expect_failure/disappearing_class/ClassProvider.scala set +e - bazel build test/src/main/scala/scala/test/disappearing_class:uses_class + bazel build test_expect_failure/disappearing_class:uses_class RET=$? - git checkout test/src/main/scala/scala/test/disappearing_class/ClassProvider.scala + git checkout test_expect_failure/disappearing_class/ClassProvider.scala if [ $RET -eq 0 ]; then echo "Class caching at play. This should fail" exit 1 @@ -18,14 +18,39 @@ test_disappearing_class() { } test_build_is_identical() { - bazel build test/... + bazel build test/... md5sum bazel-bin/test/*.jar > hash1 bazel clean - bazel build test/... + bazel build test/... md5sum bazel-bin/test/*.jar > hash2 diff hash1 hash2 } +test_transitive_deps() { + set +e + + bazel build test_expect_failure/transitive/scala_to_scala/... + if [ $? -eq 0 ]; then + echo "'bazel build test_expect_failure/transitive/scala_to_scala/...' should have failed." + exit 1 + fi + + bazel build test_expect_failure/transitive/java_to_scala/... + if [ $? -eq 0 ]; then + echo "'bazel build test_expect_failure/transitive/java_to_scala/...' should have failed." + exit 1 + fi + + bazel build test_expect_failure/transitive/scala_to_java/... + if [ $? -eq 0 ]; then + echo "'bazel build test_transitive_deps/scala_to_java/...' should have failed." + exit 1 + fi + + set -e + exit 0 +} + test_repl() { echo "import scala.test._; HelloLib.printMessage(\"foo\")" | bazel-bin/test/HelloLibRepl | grep "foo scala" && echo "import scala.test._; TestUtil.foo" | bazel-bin/test/HelloLibTestRepl | grep "bar" && @@ -43,5 +68,6 @@ bazel build test/... \ && (find -L ./bazel-testlogs -iname "*.xml" | xargs -n1 xmllint > /dev/null) \ && test_disappearing_class \ && test_build_is_identical \ + && test_transitive_deps \ && test_repl \ && echo "all good" diff --git a/twitter_scrooge/twitter_scrooge.bzl b/twitter_scrooge/twitter_scrooge.bzl index ea903a970..677162762 100644 --- a/twitter_scrooge/twitter_scrooge.bzl +++ b/twitter_scrooge/twitter_scrooge.bzl @@ -74,7 +74,7 @@ def _assert_set_is_subset(left, right): missing += [l] if len(missing) > 0: fail('scrooge_srcjar target must depend on scrooge_srcjar targets sufficient to ' + - 'cover the transitive graph of thrift files. Uncovered sources: ' + missing) + 'cover the transitive graph of thrift files. Uncovered sources: ' + str(missing)) def _path_newline(data): return '\n'.join([f.path for f in data]) @@ -201,23 +201,25 @@ scrooge_scala_srcjar = rule( ) def scrooge_scala_library(name, deps=[], remote_jars=[], jvm_flags=[], visibility=None): - scrooge_scala_srcjar( - name = name + '_srcjar', - deps = deps, - remote_jars = remote_jars, - visibility = visibility, - ) - scala_library( - name = name, - deps = remote_jars + [ - name + '_srcjar', - "@libthrift//jar", - "@scrooge_core//jar", - ], - exports = [ - "@libthrift//jar", - "@scrooge_core//jar", - ], - jvm_flags = jvm_flags, - visibility = visibility, - ) + srcjar = name + '_srcjar' + scrooge_scala_srcjar( + name = srcjar, + deps = deps, + remote_jars = remote_jars, + visibility = visibility, + ) + + scala_library( + name = name, + deps = deps + remote_jars + [ + srcjar, + "@libthrift//jar", + "@scrooge_core//jar" + ], + exports = deps + remote_jars + [ + "@libthrift//jar", + "@scrooge_core//jar", + ], + jvm_flags = jvm_flags, + visibility = visibility, + )