Skip to content

Commit 8be9015

Browse files
author
Jaden Peterson
committed
Integrated dottyijar with the ruleset and wrote tests for it
1 parent 4e90f03 commit 8be9015

10 files changed

+140
-10
lines changed

scala/private/common_attributes.bzl

+5
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ common_attrs.update({
7878
executable = True,
7979
cfg = "exec",
8080
),
81+
"_dottyijar": attr.label(
82+
cfg = "exec",
83+
default = "//src/scala/io/bazel/rules_scala/dottyijar",
84+
executable = True,
85+
),
8186
})
8287

8388
implicit_deps = {

scala/private/phases/phase_compile.bzl

+29-10
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@ def phase_compile_library(ctx, p):
4141
return _phase_compile_default(ctx, p, args)
4242

4343
def phase_compile_library_for_plugin_bootstrapping(ctx, p):
44+
is_scala_2 = ctx.toolchains["@io_bazel_rules_scala//scala:toolchain_type"].scala_version.startswith("2.")
45+
4446
args = struct(
45-
buildijar = ctx.attr.build_ijar,
47+
buildijar = ctx.attr.build_ijar and is_scala_2,
4648
)
4749
return _phase_compile_default(ctx, p, args)
4850

@@ -102,13 +104,11 @@ def phase_compile_common(ctx, p):
102104
return _phase_compile_default(ctx, p)
103105

104106
def _phase_compile_default(ctx, p, _args = struct()):
105-
buildijar_default_value = True if ctx.toolchains["@io_bazel_rules_scala//scala:toolchain_type"].scala_version.startswith("2.") else False
106-
107107
return _phase_compile(
108108
ctx,
109109
p,
110110
_args.srcjars if hasattr(_args, "srcjars") else depset(),
111-
_args.buildijar if hasattr(_args, "buildijar") else buildijar_default_value,
111+
not hasattr(_args, "buildijar") or _args.buildijar,
112112
_args.implicit_junit_deps_needed_for_java_compilation if hasattr(_args, "implicit_junit_deps_needed_for_java_compilation") else [],
113113
unused_dependency_checker_ignored_targets = _args.unused_dependency_checker_ignored_targets if hasattr(_args, "unused_dependency_checker_ignored_targets") else [],
114114
)
@@ -228,12 +228,7 @@ def _compile_or_empty(
228228

229229
# build ijar if needed
230230
if buildijar:
231-
ijar = java_common.run_ijar(
232-
ctx.actions,
233-
jar = ctx.outputs.jar,
234-
target_label = ctx.label,
235-
java_toolchain = specified_java_compile_toolchain(ctx),
236-
)
231+
ijar = _build_ijar(ctx)
237232
else:
238233
# macro code needs to be available at compile-time,
239234
# so set ijar == jar
@@ -266,6 +261,30 @@ def _compile_or_empty(
266261
merged_provider = merged_provider,
267262
)
268263

264+
def _build_ijar(ctx):
265+
if ctx.toolchains["@io_bazel_rules_scala//scala:toolchain_type"].scala_version.startswith("2."):
266+
return java_common.run_ijar(
267+
ctx.actions,
268+
jar = ctx.outputs.jar,
269+
target_label = ctx.label,
270+
java_toolchain = specified_java_compile_toolchain(ctx),
271+
)
272+
273+
output = ctx.actions.declare_file("{}-ijar.jar".format(ctx.label.name))
274+
arguments = ctx.actions.args()
275+
arguments.add(ctx.outputs.jar)
276+
arguments.add(output)
277+
278+
ctx.actions.run(
279+
arguments = [arguments],
280+
executable = ctx.executable._dottyijar,
281+
inputs = [ctx.outputs.jar],
282+
mnemonic = "DottyIjar",
283+
outputs = [output],
284+
)
285+
286+
return output
287+
269288
def _build_nosrc_jar(ctx):
270289
resources = [s + ":" + t for t, s in _resource_paths(ctx.files.resources, ctx.attr.resource_strip_prefix)]
271290

test/dottyijar/BUILD

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
load("//scala:scala.bzl", "scala_binary", "scala_library")
2+
3+
scala_library(
4+
name = "private-members",
5+
srcs = ["PrivateMembers.scala"],
6+
scala_version = "3.6.2",
7+
tags = ["manual"],
8+
)
9+
10+
scala_binary(
11+
name = "private-members-dependent",
12+
srcs = ["PrivateMembersDependent.scala"],
13+
main_class = "dottyijar.Main",
14+
scala_version = "3.6.2",
15+
tags = ["manual"],
16+
deps = [":private-members"],
17+
)
18+
19+
scala_library(
20+
name = "definition-values",
21+
srcs = ["DefinitionValues.scala"],
22+
scala_version = "3.6.2",
23+
tags = ["manual"],
24+
)
25+
26+
scala_library(
27+
name = "definition-values-dependent",
28+
srcs = ["DefinitionValuesDependent.scala"],
29+
main_class = "dottyijar.Main",
30+
scala_version = "3.6.2",
31+
tags = ["manual"],
32+
deps = [":definition-values"],
33+
)
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package dottyijar
2+
3+
object DefinitionValues {
4+
val greeting: String = s"Hello, Bob!"
5+
}
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package dottyijar
2+
3+
object DefinitionValues {
4+
val greeting: String = s"Hello, Bob!".replace("Bob", "Alice")
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package dottyijar
2+
3+
object Main {
4+
def main(arguments: Array[String]): Unit = println(DefinitionValues.greeting)
5+
}

test/dottyijar/PrivateMembers1.scala

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package dottyijar
2+
3+
object PrivateMembers {
4+
private val privateField = ()
5+
private lazy val privateLazyField = ()
6+
7+
val publicField = ()
8+
lazy val publicLazyField = ()
9+
10+
private def privateMethod: Unit = {}
11+
12+
def publicMethod: Unit = {}
13+
}

test/dottyijar/PrivateMembers2.scala

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package dottyijar
2+
3+
object PrivateMembers {
4+
val publicField = ()
5+
lazy val publicLazyField = ()
6+
7+
def publicMethod: Unit = {}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package dottyijar
2+
3+
object Main {
4+
def main(arguments: Array[String]): Unit = println(PrivateMembers.publicField)
5+
}

test/shell/test_dottyijar.sh

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# shellcheck source=./test_runner.sh
2+
dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
3+
. "${dir}"/test_runner.sh
4+
. "${dir}"/test_helper.sh
5+
runner=$(get_test_runner "${1:-local}")
6+
7+
ijar_invariant() {
8+
cp "test/dottyijar/$3" "test/dottyijar/$2"
9+
trap "rm 'test/dottyijar/$2'" EXIT
10+
11+
bazel build "//test/dottyijar:$1-dependent"
12+
13+
ijar1_path="$(mktemp)"
14+
15+
cp "bazel-bin/test/dottyijar/$1-ijar.jar" "$ijar1_path"
16+
17+
cp "test/dottyijar/$4" "test/dottyijar/$2"
18+
bazel build "//test/dottyijar:$1-dependent"
19+
20+
diff "$ijar1_path" "bazel-bin/test/dottyijar/$1-ijar.jar"
21+
}
22+
23+
ijar_invariant_to_private_members() {
24+
ijar_invariant private-members PrivateMembers.scala PrivateMembers1.scala PrivateMembers2.scala
25+
}
26+
27+
ijar_invariant_to_definition_values() {
28+
ijar_invariant definition-values DefinitionValues.scala DefinitionValues1.scala DefinitionValues2.scala
29+
}
30+
31+
$runner ijar_invariant_to_private_members
32+
$runner ijar_invariant_to_definition_values

0 commit comments

Comments
 (0)