Skip to content

Commit a2b971d

Browse files
Minimal implementation of compiler utils for Scala 3 Dependency Analyzer tests.
Dependency Analyzer uses TestUtil to run compiler. For Scala 3 these utils have to be rewritten to work with new compiler.
1 parent 75701d0 commit a2b971d

File tree

7 files changed

+207
-102
lines changed

7 files changed

+207
-102
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
load(":analyzer_test.bzl", "analyzer_tests")
1+
load(":analyzer_test.bzl", "tests")
22

3-
analyzer_tests()
3+
tests()
Lines changed: 6 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,9 @@
1-
load("//scala:scala.bzl", "scala_test")
1+
load(":analyzer_test_scala_2.bzl", "analyzer_tests_scala_2")
2+
load(":analyzer_test_scala_3.bzl", "analyzer_tests_scala_3")
23
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_MAJOR_VERSION")
34

4-
def analyzer_tests():
5+
def tests():
56
if SCALA_MAJOR_VERSION.startswith("2"):
6-
common_jvm_flags = [
7-
"-Dplugin.jar.location=$(execpath //third_party/dependency_analyzer/src/main:dependency_analyzer)",
8-
"-Dscala.library.location=$(rootpath @io_bazel_rules_scala_scala_library)",
9-
"-Dscala.reflect.location=$(rootpath @io_bazel_rules_scala_scala_reflect)",
10-
]
11-
12-
scala_test(
13-
name = "ast_used_jar_finder_test",
14-
size = "small",
15-
srcs = [
16-
"io/bazel/rulesscala/dependencyanalyzer/AstUsedJarFinderTest.scala",
17-
],
18-
jvm_flags = common_jvm_flags,
19-
deps = [
20-
"//src/java/io/bazel/rulesscala/io_utils",
21-
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
22-
"//third_party/dependency_analyzer/src/main:scala_version",
23-
"//third_party/utils/src/test:test_util",
24-
"@io_bazel_rules_scala_scala_compiler",
25-
"@io_bazel_rules_scala_scala_library",
26-
"@io_bazel_rules_scala_scala_reflect",
27-
],
28-
)
29-
30-
scala_test(
31-
name = "scala_version_test",
32-
size = "small",
33-
srcs = [
34-
"io/bazel/rulesscala/dependencyanalyzer/ScalaVersionTest.scala",
35-
],
36-
deps = [
37-
"//third_party/dependency_analyzer/src/main:scala_version",
38-
"@io_bazel_rules_scala_scala_library",
39-
"@io_bazel_rules_scala_scala_reflect",
40-
],
41-
)
42-
43-
scala_test(
44-
name = "scalac_dependency_test",
45-
size = "small",
46-
srcs = [
47-
"io/bazel/rulesscala/dependencyanalyzer/ScalacDependencyTest.scala",
48-
],
49-
jvm_flags = common_jvm_flags,
50-
unused_dependency_checker_mode = "off",
51-
deps = [
52-
"//src/java/io/bazel/rulesscala/io_utils",
53-
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
54-
"//third_party/utils/src/test:test_util",
55-
"@io_bazel_rules_scala_scala_compiler",
56-
"@io_bazel_rules_scala_scala_library",
57-
"@io_bazel_rules_scala_scala_reflect",
58-
],
59-
)
60-
61-
scala_test(
62-
name = "strict_deps_test",
63-
size = "small",
64-
srcs = [
65-
"io/bazel/rulesscala/dependencyanalyzer/StrictDepsTest.scala",
66-
],
67-
jvm_flags = common_jvm_flags + [
68-
"-Dguava.jar.location=$(rootpath @com_google_guava_guava_21_0_with_file//jar)",
69-
"-Dapache.commons.jar.location=$(location @org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file)",
70-
],
71-
unused_dependency_checker_mode = "off",
72-
deps = [
73-
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
74-
"//third_party/utils/src/test:test_util",
75-
"@com_google_guava_guava_21_0_with_file//jar",
76-
"@io_bazel_rules_scala_scala_compiler",
77-
"@io_bazel_rules_scala_scala_library",
78-
"@io_bazel_rules_scala_scala_reflect",
79-
"@org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file",
80-
],
81-
)
82-
83-
scala_test(
84-
name = "unused_dependency_checker_test",
85-
size = "small",
86-
srcs = [
87-
"io/bazel/rulesscala/dependencyanalyzer/UnusedDependencyCheckerTest.scala",
88-
],
89-
jvm_flags = common_jvm_flags + [
90-
"-Dapache.commons.jar.location=$(location @org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file)",
91-
],
92-
unused_dependency_checker_mode = "off",
93-
deps = [
94-
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
95-
"//third_party/utils/src/test:test_util",
96-
"@io_bazel_rules_scala_scala_compiler",
97-
"@io_bazel_rules_scala_scala_library",
98-
"@io_bazel_rules_scala_scala_reflect",
99-
"@org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file",
100-
],
101-
)
7+
analyzer_tests_scala_2()
8+
else:
9+
analyzer_tests_scala_3()
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
load("//scala:scala.bzl", "scala_test")
2+
3+
def analyzer_tests_scala_2():
4+
common_jvm_flags = [
5+
"-Dplugin.jar.location=$(execpath //third_party/dependency_analyzer/src/main:dependency_analyzer)",
6+
"-Dscala.library.location=$(rootpath @io_bazel_rules_scala_scala_library)",
7+
"-Dscala.reflect.location=$(rootpath @io_bazel_rules_scala_scala_reflect)",
8+
]
9+
10+
scala_test(
11+
name = "ast_used_jar_finder_test",
12+
size = "small",
13+
srcs = [
14+
"io/bazel/rulesscala/dependencyanalyzer/AstUsedJarFinderTest.scala",
15+
],
16+
jvm_flags = common_jvm_flags,
17+
deps = [
18+
"//src/java/io/bazel/rulesscala/io_utils",
19+
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
20+
"//third_party/dependency_analyzer/src/main:scala_version",
21+
"//third_party/utils/src/test:test_util",
22+
"@io_bazel_rules_scala_scala_compiler",
23+
"@io_bazel_rules_scala_scala_library",
24+
"@io_bazel_rules_scala_scala_reflect",
25+
],
26+
)
27+
28+
scala_test(
29+
name = "scala_version_test",
30+
size = "small",
31+
srcs = [
32+
"io/bazel/rulesscala/dependencyanalyzer/ScalaVersionTest.scala",
33+
],
34+
deps = [
35+
"//third_party/dependency_analyzer/src/main:scala_version",
36+
"@io_bazel_rules_scala_scala_library",
37+
"@io_bazel_rules_scala_scala_reflect",
38+
],
39+
)
40+
41+
scala_test(
42+
name = "scalac_dependency_test",
43+
size = "small",
44+
srcs = [
45+
"io/bazel/rulesscala/dependencyanalyzer/ScalacDependencyTest.scala",
46+
],
47+
jvm_flags = common_jvm_flags,
48+
unused_dependency_checker_mode = "off",
49+
deps = [
50+
"//src/java/io/bazel/rulesscala/io_utils",
51+
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
52+
"//third_party/utils/src/test:test_util",
53+
"@io_bazel_rules_scala_scala_compiler",
54+
"@io_bazel_rules_scala_scala_library",
55+
"@io_bazel_rules_scala_scala_reflect",
56+
],
57+
)
58+
59+
scala_test(
60+
name = "strict_deps_test",
61+
size = "small",
62+
srcs = [
63+
"io/bazel/rulesscala/dependencyanalyzer/StrictDepsTest.scala",
64+
],
65+
jvm_flags = common_jvm_flags + [
66+
"-Dguava.jar.location=$(rootpath @com_google_guava_guava_21_0_with_file//jar)",
67+
"-Dapache.commons.jar.location=$(location @org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file)",
68+
],
69+
unused_dependency_checker_mode = "off",
70+
deps = [
71+
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
72+
"//third_party/utils/src/test:test_util",
73+
"@com_google_guava_guava_21_0_with_file//jar",
74+
"@io_bazel_rules_scala_scala_compiler",
75+
"@io_bazel_rules_scala_scala_library",
76+
"@io_bazel_rules_scala_scala_reflect",
77+
"@org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file",
78+
],
79+
)
80+
81+
scala_test(
82+
name = "unused_dependency_checker_test",
83+
size = "small",
84+
srcs = [
85+
"io/bazel/rulesscala/dependencyanalyzer/UnusedDependencyCheckerTest.scala",
86+
],
87+
jvm_flags = common_jvm_flags + [
88+
"-Dapache.commons.jar.location=$(location @org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file)",
89+
],
90+
unused_dependency_checker_mode = "off",
91+
deps = [
92+
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
93+
"//third_party/utils/src/test:test_util",
94+
"@io_bazel_rules_scala_scala_compiler",
95+
"@io_bazel_rules_scala_scala_library",
96+
"@io_bazel_rules_scala_scala_reflect",
97+
"@org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file",
98+
],
99+
)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
load("@io_bazel_rules_scala//scala:scala.bzl", "scala_test")
2+
3+
def analyzer_tests_scala_3():
4+
common_jvm_flags = [
5+
"-Dplugin.jar.location=$(execpath //third_party/dependency_analyzer/src/main:dependency_analyzer)",
6+
"-Dscala.library.location=$(rootpath @io_bazel_rules_scala_scala_library)",
7+
# Scala 2 standard library is required for compilation.
8+
# Without it compilation fails with error:
9+
# class dotty.tools.dotc.core.Symbols$NoSymbol$ cannot be cast to class dotty.tools.dotc.core.Symbols$ClassSymbol
10+
"-Dscala.library2.location=$(rootpath @io_bazel_rules_scala_scala_library_2)",
11+
]
12+
13+
scala_test(
14+
name = "test_that_tests_run",
15+
size = "small",
16+
jvm_flags = common_jvm_flags,
17+
srcs = [
18+
"io/bazel/rulesscala/dependencyanalyzer3/CompileTest.scala",
19+
],
20+
deps = [
21+
"//scala/private/toolchain_deps:scala_compile_classpath",
22+
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
23+
"//third_party/utils/src/test:test_util",
24+
"@io_bazel_rules_scala_scala_library",
25+
"@io_bazel_rules_scala_scala_library_2",
26+
],
27+
)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.bazel.rulesscala.dependencyanalyzer
2+
3+
import org.scalatest.funsuite.AnyFunSuite
4+
import io.bazel.rulesscala.utils.Scala3CompilerUtils
5+
6+
class CompileTest extends AnyFunSuite {
7+
8+
test("Util compiles valid code") {
9+
val scalaCode = "class Foo { }"
10+
val messages = Scala3CompilerUtils.runCompiler(scalaCode)
11+
12+
assert(messages.isEmpty, "No messages must be reported when valid code is compiled")
13+
}
14+
15+
test("Util returns errors on invalid code") {
16+
val scalaCode = "!@#"
17+
val messages = Scala3CompilerUtils.runCompiler(scalaCode)
18+
19+
assert(
20+
messages.exists(_.message.contains("Illegal start of toplevel definition")),
21+
"Error must be reported when valid code is compiled"
22+
)
23+
}
24+
}

third_party/utils/src/test/BUILD

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
load("//scala:scala.bzl", "scala_library")
2+
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_MAJOR_VERSION")
23

34
licenses(["notice"]) # 3-clause BSD
45

56
scala_library(
67
name = "test_util",
7-
srcs = [
8+
srcs = ([
89
"io/bazel/rulesscala/utils/JavaCompileUtil.scala",
910
"io/bazel/rulesscala/utils/TestUtil.scala",
10-
],
11+
] if SCALA_MAJOR_VERSION.startswith("2") else [
12+
"io/bazel/rulesscala/utils/Scala3CompilerUtils.scala",
13+
]),
1114
visibility = ["//visibility:public"],
1215
deps = [
1316
"//scala/private/toolchain_deps:scala_compile_classpath",
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package io.bazel.rulesscala.utils
2+
3+
import dotty.tools.dotc.Compiler
4+
import dotty.tools.dotc.core.Contexts._
5+
import dotty.tools.dotc.reporting.{Diagnostic, StoreReporter}
6+
import dotty.tools.dotc.util.SourceFile
7+
8+
import java.nio.file.Paths
9+
10+
object Scala3CompilerUtils {
11+
def runCompiler(
12+
code: String,
13+
extraClasspath: List[String] = List.empty,
14+
): List[Diagnostic] = {
15+
val reporter = new TestReporter()
16+
17+
implicit val context: FreshContext = (new ContextBase).initialCtx.fresh.setReporter(reporter)
18+
19+
val fullClassPath = context.settings.classpath.value :: extraClasspath ::: builtinClasspaths.filterNot(_.isEmpty)
20+
21+
context.setSetting(context.settings.classpath, fullClassPath.mkString(":"))
22+
23+
val compiler = new Compiler()
24+
val run = compiler.newRun
25+
run.compileSources(SourceFile.virtual("scala_compiler_util_run_code.scala", code, maybeIncomplete = false) :: Nil)
26+
27+
reporter.storedInfos
28+
}
29+
30+
private lazy val builtinClasspaths: List[String] =
31+
pathOf("scala.library.location") :: pathOf("scala.library2.location") :: Nil
32+
33+
private def pathOf(jvmFlag: String) = {
34+
val jar = System.getProperty(jvmFlag)
35+
val libPath = Paths.get(baseDir, jar).toAbsolutePath
36+
libPath.toString
37+
}
38+
39+
private lazy val baseDir = System.getProperty("user.dir")
40+
}
41+
42+
class TestReporter extends StoreReporter(null) {
43+
def storedInfos: List[Diagnostic] = if (infos != null) infos.toList else List()
44+
}

0 commit comments

Comments
 (0)