Skip to content

Commit ed16cb2

Browse files
authored
Merge branch 'main' into setupJava
2 parents 313e777 + b23adf0 commit ed16cb2

File tree

10 files changed

+179
-15
lines changed

10 files changed

+179
-15
lines changed

.bazelversion

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.1.1
1+
5.2.0

.github/workflows/ci.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,21 @@ on:
66
pull_request:
77
jobs:
88
test:
9-
runs-on: ${{ matrix.os }}
9+
runs-on: ${{ matrix.os }}
1010
strategy:
11+
fail-fast: false
1112
matrix:
1213
# NOTE(olafurpg) Windows is not enabled because it times out due to reasons I don't understand.
1314
# os: [windows-latest, ubuntu-latest]
1415
os: [ubuntu-latest]
16+
java: [8, 17]
1517
steps:
1618
- uses: actions/checkout@v2
1719
- uses: actions/setup-java@v3
1820
with:
1921
distribution: 'temurin'
20-
java-version: 8
2122
cache: 'sbt'
23+
java-version: ${{ matrix.java }}
2224
- uses: actions/setup-go@v2
2325
with:
2426
go-version: "^1.13.1"

scip-java/src/main/scala/com/sourcegraph/scip_java/Embedded.scala

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import java.nio.file.Files
55
import java.nio.file.Path
66
import java.nio.file.StandardCopyOption
77

8+
import com.sourcegraph.scip_java.BuildInfo
89
import moped.reporters.Reporter
910
import os.CommandResult
1011

@@ -22,7 +23,12 @@ object Embedded {
2223

2324
private def javacErrorpath(tmp: Path) = tmp.resolve("errorpath.txt")
2425

25-
def customJavac(sourceroot: Path, targetroot: Path, tmp: Path): Path = {
26+
def customJavac(
27+
sourceroot: Path,
28+
targetroot: Path,
29+
tmp: Path,
30+
javaAtLeast17: Boolean
31+
): Path = {
2632
val bin = tmp.resolve("bin")
2733
val javac = bin.resolve("javac")
2834
val java = bin.resolve("java")
@@ -38,6 +44,11 @@ object Embedded {
3844
|""".stripMargin.getBytes(StandardCharsets.UTF_8)
3945
)
4046
val newJavacopts = tmp.resolve("javac_newarguments")
47+
val javacModuleOptions =
48+
if (javaAtLeast17)
49+
BuildInfo.javacModuleOptions.mkString(" ")
50+
else
51+
""
4152
val injectSemanticdbArguments = List[String](
4253
"java",
4354
s"-Dsemanticdb.errorpath=$errorpath",
@@ -62,9 +73,9 @@ object Embedded {
6273
|done
6374
|$injectSemanticdbArguments
6475
|if [ $${#LAUNCHER_ARGS[@]} -eq 0 ]; then
65-
| javac "@$$NEW_JAVAC_OPTS"
76+
| javac $javacModuleOptions "@$$NEW_JAVAC_OPTS"
6677
|else
67-
| javac "@$$NEW_JAVAC_OPTS" "$${LAUNCHER_ARGS[@]}"
78+
| javac $javacModuleOptions "@$$NEW_JAVAC_OPTS" "$${LAUNCHER_ARGS[@]}"
6879
|fi
6980
|""".stripMargin
7081
Files.write(javac, script.getBytes(StandardCharsets.UTF_8))

scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/GradleJavaCompiler.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,12 @@ case class GradleJavaCompiler(languageVersion: String, javacPath: Path) {
2727
pluginPath: Path
2828
): Path = {
2929
val home = tmp.resolve(s"1.$languageVersion")
30-
val javac = Embedded.customJavac(index.workingDirectory, targetroot, tmp)
30+
val javac = Embedded.customJavac(
31+
index.workingDirectory,
32+
targetroot,
33+
tmp,
34+
GradleJavaToolchains.isJavaAtLeast(languageVersion, "17")
35+
)
3136
val agent = Embedded.agentJar(tmp)
3237
val debugPath = GradleJavaCompiler.debugPath(tmp)
3338
val javacopts = targetroot.resolve("javacopts.txt")

scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/GradleJavaToolchains.scala

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import java.nio.charset.StandardCharsets
44
import java.nio.file.Files
55
import java.nio.file.Path
66

7+
import scala.annotation.tailrec
78
import scala.jdk.CollectionConverters._
89

910
import com.sourcegraph.scip_java.Embedded
@@ -14,6 +15,7 @@ case class GradleJavaToolchains(
1415
tool: GradleBuildTool,
1516
index: IndexCommand,
1617
gradleVersion: Option[String],
18+
javaVersion: Option[String],
1719
isJavaEnabled: Boolean,
1820
isScalaEnabled: Boolean,
1921
isKotlinEnabled: Boolean,
@@ -24,9 +26,22 @@ case class GradleJavaToolchains(
2426

2527
def isEmpty: Boolean = toolchains.isEmpty
2628

29+
def isJavaAtLeast(version: Int): Boolean = {
30+
val actualVersion = javaVersion.getOrElse(sys.props("java.version"))
31+
GradleJavaToolchains
32+
.isJavaAtLeast(actualVersion, math.max(version, 0).toString())
33+
}
34+
2735
def executableJavacPath(): Option[Path] = {
2836
if (toolchains.isEmpty) {
29-
Some(Embedded.customJavac(index.workingDirectory, tool.targetroot, tmp))
37+
Some(
38+
Embedded.customJavac(
39+
index.workingDirectory,
40+
tool.targetroot,
41+
tmp,
42+
isJavaAtLeast(17)
43+
)
44+
)
3045
} else {
3146
None
3247
}
@@ -62,6 +77,7 @@ object GradleJavaToolchains {
6277
val javaEnabledPath = tmp.resolve("java-enabled.txt")
6378
val scalaEnabledPath = tmp.resolve("scala-enabled.txt")
6479
val kotlinEnabledPath = tmp.resolve("kotlin-enabled.txt")
80+
val javaVersionPath = tmp.resolve("java-version.txt")
6581
val kotlinMultiplatformEnabledPath = tmp
6682
.resolve("kotlin-multiplatform-enabled.txt")
6783
val gradleVersionPath = tmp.resolve("gradle-version.txt")
@@ -75,6 +91,12 @@ object GradleJavaToolchains {
7591
| [gradle.gradleVersion],
7692
| java.nio.file.StandardOpenOption.TRUNCATE_EXISTING,
7793
| java.nio.file.StandardOpenOption.CREATE)
94+
| java.nio.file.Files.write(
95+
| java.nio.file.Paths.get(
96+
| java.net.URI.create('${javaVersionPath.toUri}')),
97+
| [System.getProperty("java.version")],
98+
| java.nio.file.StandardOpenOption.TRUNCATE_EXISTING,
99+
| java.nio.file.StandardOpenOption.CREATE)
78100
|} catch (Exception e) {
79101
| // Ignore errors.
80102
|}
@@ -146,11 +168,19 @@ object GradleJavaToolchains {
146168
None
147169
}
148170

171+
val javaVersion =
172+
if (Files.isRegularFile(javaVersionPath)) {
173+
Some(new String(Files.readAllBytes(javaVersionPath)).trim)
174+
} else {
175+
None
176+
}
177+
149178
GradleJavaToolchains(
150179
toolchains,
151180
tool,
152181
index,
153182
gradleVersion = gradleVersion,
183+
javaVersion = javaVersion,
154184
isJavaEnabled = Files.isRegularFile(javaEnabledPath),
155185
isScalaEnabled = Files.isRegularFile(scalaEnabledPath),
156186
isKotlinEnabled = Files.isRegularFile(kotlinEnabledPath),
@@ -160,4 +190,68 @@ object GradleJavaToolchains {
160190
tmp = tmp
161191
)
162192
}
193+
194+
// Copy-pasted from scala.util.Properties.isJavaAtLeast but makes the actual
195+
// version a parameterizeable instead of being hard-coded to
196+
// `Properties.javaVersionSpec`.
197+
def isJavaAtLeast(
198+
actualVersion: String,
199+
comparisonVersion: String
200+
): Boolean = {
201+
def versionOf(s: String, depth: Int): (Int, String) =
202+
s.indexOf('.') match {
203+
case 0 =>
204+
(-2, s.substring(1))
205+
case 1 if depth == 0 && s.charAt(0) == '1' =>
206+
val r0 = s.substring(2)
207+
val (v, r) = versionOf(r0, 1)
208+
val n =
209+
if (v > 8 || r0.isEmpty)
210+
-2
211+
else
212+
v // accept 1.8, not 1.9 or 1.
213+
(n, r)
214+
case -1 =>
215+
val n =
216+
if (!s.isEmpty)
217+
s.toInt
218+
else if (depth == 0)
219+
-2
220+
else
221+
0
222+
(n, "")
223+
case i =>
224+
val r = s.substring(i + 1)
225+
val n =
226+
if (depth < 2 && r.isEmpty)
227+
-2
228+
else
229+
s.substring(0, i).toInt
230+
(n, r)
231+
}
232+
@tailrec
233+
def compareVersions(s: String, v: String, depth: Int): Int = {
234+
if (depth >= 3)
235+
0
236+
else {
237+
val (sn, srest) = versionOf(s, depth)
238+
val (vn, vrest) = versionOf(v, depth)
239+
if (vn < 0)
240+
-2
241+
else if (sn < vn)
242+
-1
243+
else if (sn > vn)
244+
1
245+
else
246+
compareVersions(srest, vrest, depth + 1)
247+
}
248+
}
249+
250+
compareVersions(actualVersion, comparisonVersion, 0) match {
251+
case -2 =>
252+
throw new NumberFormatException(s"Not a version: $comparisonVersion")
253+
case i =>
254+
i >= 0
255+
}
256+
}
163257
}

scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/MavenBuildTool.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@ class MavenBuildTool(index: IndexCommand) extends BuildTool("Maven", index) {
3535
else {
3636
"mvn"
3737
}
38+
val start = System.nanoTime()
3839
val buildCommand = ListBuffer.empty[String]
3940
val executable = Embedded.customJavac(
4041
index.workingDirectory,
4142
index.finalTargetroot(defaultTargetroot),
42-
tmp
43+
tmp,
44+
GradleJavaToolchains.isJavaAtLeast(SystemJavaVersion.detect(), "11")
4345
)
4446
buildCommand ++=
4547
List(
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.sourcegraph.scip_java.buildtools
2+
3+
import java.nio.file.Files
4+
5+
import com.sourcegraph.scip_java.Embedded
6+
7+
object SystemJavaVersion {
8+
// Returns the output of `System.getProperty("java.version")` from a fresh JVM
9+
// instance using the system JVM installation. We can't use this process since
10+
// it may be running on a separate JVM process (that's the case when we run
11+
// `sbt test` in this build at least).
12+
def detect(): String = {
13+
val tmp = Files.createTempDirectory("java-version")
14+
val jar = Embedded.semanticdbJar(tmp)
15+
try {
16+
os.proc(
17+
"java",
18+
"-cp",
19+
jar.toString(),
20+
"com.sourcegraph.semanticdb_javac.PrintJavaVersion"
21+
)
22+
.call()
23+
.out
24+
.text()
25+
.trim()
26+
} finally {
27+
Files.deleteIfExists(jar)
28+
}
29+
}
30+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.sourcegraph.semanticdb_javac;
2+
3+
public class PrintJavaVersion {
4+
public static void main(String[] args) {
5+
System.out.print(System.getProperty("java.version"));
6+
}
7+
}

tests/buildTools/src/test/scala/tests/BaseBuildToolSuite.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import munit.Tag
1818
import munit.TestOptions
1919
import os.Shellable
2020

21+
object Java8Only extends munit.Tag("Java8Only")
22+
2123
abstract class BaseBuildToolSuite extends MopedSuite(ScipJava.app) {
2224
override def environmentVariables: Map[String, String] = sys.env
2325

@@ -26,6 +28,14 @@ abstract class BaseBuildToolSuite extends MopedSuite(ScipJava.app) {
2628
override def munitTestTransforms: List[TestTransform] =
2729
super.munitTestTransforms ++
2830
List(
31+
new TestTransform(
32+
"Java8Only",
33+
t =>
34+
if (Properties.isJavaAtLeast(9) && t.tags(Java8Only))
35+
t.tag(munit.Ignore)
36+
else
37+
t
38+
),
2939
new TestTransform(
3040
"SkipWindows",
3141
t =>

tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
2727
List("latest" -> "implementation", "4.0" -> "compile").foreach {
2828
case (version, config) =>
2929
checkBuild(
30-
s"basic-$version",
30+
if (version == "latest")
31+
"basic-latest"
32+
else
33+
s"basic-$version".tag(Java8Only),
3134
s"""|/build.gradle
3235
|apply plugin: 'java'
3336
|repositories {
@@ -55,7 +58,7 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
5558

5659
List("3.3", "2.2.1").foreach { version =>
5760
checkBuild(
58-
s"legacy-$version",
61+
s"legacy-$version".tag(Java8Only),
5962
s"""|/build.gradle
6063
|apply plugin: 'java'
6164
|/src/main/java/Example.java
@@ -90,7 +93,7 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
9093
)
9194

9295
checkBuild(
93-
"toolchains-6.7",
96+
"toolchains-6.7".tag(Java8Only),
9497
"""|/build.gradle
9598
|apply plugin: 'java'
9699
|java {
@@ -114,7 +117,7 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
114117
)
115118

116119
checkBuild(
117-
"toolchains-6.8",
120+
"toolchains-6.8".tag(Java8Only),
118121
"""|/build.gradle
119122
|apply plugin: 'java'
120123
|java {
@@ -158,7 +161,7 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
158161
)
159162

160163
checkBuild(
161-
"playframework",
164+
"playframework".tag(Java8Only),
162165
"""|/build.gradle
163166
|plugins {
164167
| id 'org.gradle.playframework' version '0.11'
@@ -209,7 +212,7 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
209212
)
210213

211214
checkBuild(
212-
"checkerframework",
215+
"checkerframework".tag(Java8Only),
213216
"""|/build.gradle
214217
|plugins {
215218
| id 'java'

0 commit comments

Comments
 (0)