Skip to content

Commit c0a30a2

Browse files
authored
Check annotation path (#584)
* Add semanticdb to annotationProcessor path if it's used Tests: * Run docker jobs in parallel * Parallelise Gradle suites by gradle version * Add an explicit test for annotation processors
1 parent d16df28 commit c0a30a2

File tree

5 files changed

+151
-78
lines changed

5 files changed

+151
-78
lines changed

.github/workflows/ci.yml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,21 @@ jobs:
4545
run: sbt cli/docker
4646

4747
- run: |
48+
4849
set -eu
49-
for REPO in circe/circe indeedeng/proctor
50-
do
50+
check_repo() {
51+
REPO=$1
5152
mkdir -p .repos/$REPO
5253
git clone https://github.com/$REPO.git .repos/$REPO
5354
5455
docker run -v $PWD/.repos/$REPO:/sources -w /sources sourcegraph/scip-java:latest scip-java index
5556
file .repos/$REPO/index.scip || (echo "$REPO SCIP index doesn't exist!"; exit 1)
56-
done
57+
}
58+
59+
sudo apt install parallel
60+
export -f check_repo
61+
62+
parallel -j4 check_repo ::: circe/circe indeedeng/iwf-java-sdk
5763
5864
bazel:
5965
runs-on: ubuntu-latest

semanticdb-gradle-plugin/src/main/scala/SemanticdbGradlePlugin.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,21 @@ class SemanticdbGradlePlugin extends Plugin[Project] {
5959
triggers += "compileJava"
6060
triggers += "compileTestJava"
6161

62+
val hasAnnotationPath = {
63+
val apConfig = project
64+
.getConfigurations()
65+
.getByName("annotationProcessor")
66+
if (apConfig.isCanBeResolved()) {
67+
apConfig.getDependencies().size() > 0
68+
} else
69+
false
70+
}
71+
6272
val compilerPluginAdded =
6373
try {
6474
project.getDependencies().add("compileOnly", javacDep)
75+
if (hasAnnotationPath)
76+
project.getDependencies().add("annotationProcessor", javacDep)
6577
project.getDependencies().add("testCompileOnly", javacDep)
6678
true
6779
} catch {

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

Lines changed: 57 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,54 @@
11
package tests
22

3-
import java.nio.file.Files
4-
import java.nio.file.StandardOpenOption
3+
import tests.GradleBuildToolSuite._
54

6-
import munit.TestOptions
7-
8-
class GradleBuildToolSuite extends BaseBuildToolSuite {
5+
class Gradle_8_BuildToolSuite extends GradleBuildToolSuite(List(Gradle8))
6+
class Gradle_7_BuildToolSuite extends GradleBuildToolSuite(List(Gradle7))
7+
class Gradle_6_BuildToolSuite extends GradleBuildToolSuite(List(Gradle67))
8+
class Gradle_5_BuildToolSuite extends GradleBuildToolSuite(List(Gradle5))
99

10+
object GradleBuildToolSuite {
1011
val Gradle8 = "8.1.1"
1112
val Gradle7 = "7.6.1"
1213
val Gradle67 = "6.7" // Introduced toolchains
1314
val Gradle5 = "5.6.4"
15+
}
1416

15-
val allGradle = List(Gradle8, Gradle7, Gradle67)
17+
abstract class GradleBuildToolSuite(allGradle: List[String])
18+
extends GradleBuildToolSuiteBase(allGradle) {
1619
val allJava = List("8", "11", "17")
1720

18-
def gradleVersion(version: String): List[String] = {
19-
createEmptyBuildScript()
20-
List("gradle", "wrapper", "--gradle-version", version)
21-
}
22-
23-
def createEmptyBuildScript(): Unit = {
24-
val script = workingDirectory.resolve("build.gradle")
25-
Files.createDirectories(script.getParent)
26-
Files.write(
27-
script,
28-
Array.emptyByteArray,
29-
StandardOpenOption.TRUNCATE_EXISTING,
30-
StandardOpenOption.CREATE
31-
)
32-
}
33-
34-
def checkGradleBuild(
35-
title: TestOptions,
36-
setup: String,
37-
gradleVersions: List[String] = allGradle,
38-
expectedSemanticdbFiles: Int = 0,
39-
expectedPackages: String = "",
40-
extraArguments: List[String] = Nil
41-
) = {
42-
gradleVersions.foreach { gradleV =>
43-
{
44-
val testName = title.withName(title.name + s"-gradle$gradleV")
45-
checkBuild(
46-
if (gradleV.startsWith("6.") || gradleV.startsWith("5."))
47-
testName.tag(Java8Only)
48-
else
49-
testName,
50-
setup,
51-
expectedSemanticdbFiles = expectedSemanticdbFiles,
52-
expectedPackages = expectedPackages,
53-
initCommand = gradleVersion(gradleV),
54-
extraArguments = extraArguments
55-
)
56-
}
57-
}
58-
}
21+
checkGradleBuild(
22+
"annotation-path",
23+
"""|/build.gradle
24+
|plugins {
25+
| id 'java'
26+
|}
27+
|repositories {
28+
| // Use Maven Central for resolving dependencies.
29+
| mavenCentral()
30+
|}
31+
|dependencies {
32+
| compileOnly 'org.immutables:value:2.9.2'
33+
| annotationProcessor 'org.immutables:value:2.9.2'
34+
|}
35+
|/src/main/java/WorkflowOptions.java
36+
|package test;
37+
|import org.immutables.value.Value;
38+
|import java.util.Optional;
39+
|@Value.Immutable
40+
|public abstract class WorkflowOptions {
41+
| public abstract Optional<String> getWorkflowIdReusePolicy();
42+
|}
43+
""".stripMargin,
44+
/*
45+
An immutable version will be generated along with the original class:
46+
- build/generated/sources/annotationProcessor/java/main/test/ImmutableWorkflowOptions.java.semanticdb
47+
- /META-INF/semanticdb/src/main/java/WorkflowOptions.java.semanticdb
48+
*/
49+
expectedSemanticdbFiles = 2,
50+
gradleVersions = List(Gradle8, Gradle7, Gradle67)
51+
)
5952

6053
// This is the most basic test for Java/Scala support
6154
// We run it for an extended list of Gradle versions
@@ -110,25 +103,10 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
110103
|case class Howdy(a: Int)
111104
|""".stripMargin,
112105
expectedSemanticdbFiles = 3,
113-
gradleVersions = allGradle :+ Gradle5
106+
// Only add this test on Gradle 5 in the gradle 6 suite
107+
gradleVersions = List(Gradle8, Gradle7, Gradle67, Gradle5)
114108
)
115109

116-
List("3.3", "2.2.1").foreach { version =>
117-
checkBuild(
118-
s"legacy-$version".tag(Java8Only),
119-
s"""|/build.gradle
120-
|apply plugin: 'java'
121-
|/src/main/java/Example.java
122-
|public class Example {}
123-
|/src/test/java/ExampleSuite.java
124-
|public class ExampleSuite {}
125-
|""".stripMargin,
126-
expectedSemanticdbFiles = 2,
127-
initCommand = gradleVersion(version)
128-
// NOTE(olafur): no packages because we use more modern APIs.
129-
)
130-
}
131-
132110
allJava.foreach { java =>
133111
checkGradleBuild(
134112
if (java == "8")
@@ -145,7 +123,8 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
145123
|/src/main/java/Example.java
146124
|public class Example {}
147125
|""".stripMargin,
148-
expectedSemanticdbFiles = 1
126+
expectedSemanticdbFiles = 1,
127+
gradleVersions = List(Gradle8, Gradle7, Gradle67)
149128
)
150129
}
151130

@@ -161,7 +140,8 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
161140
|<hello/>
162141
|""".stripMargin,
163142
expectedSemanticdbFiles = 2,
164-
extraArguments = List("--build-tool", "gradle")
143+
extraArguments = List("--build-tool", "gradle"),
144+
gradleVersions = List(Gradle8, Gradle7, Gradle67)
165145
)
166146

167147
checkGradleBuild(
@@ -174,10 +154,11 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
174154
|public class ExampleSuite {}
175155
|""".stripMargin,
176156
expectedSemanticdbFiles = 1,
177-
extraArguments = List("--", "compileJava")
157+
extraArguments = List("--", "compileJava"),
158+
gradleVersions = List(Gradle8, Gradle7, Gradle67)
178159
)
179160

180-
checkBuild(
161+
checkGradleBuild(
181162
"playframework".tag(Java8Only),
182163
"""|/build.gradle
183164
|plugins {
@@ -226,10 +207,10 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
226207
|""".stripMargin,
227208
expectedSemanticdbFiles =
228209
2, // Two files because `conf/routes` generates a Java file.
229-
initCommand = gradleVersion("6.8")
210+
gradleVersions = List(Gradle67)
230211
)
231212

232-
checkBuild(
213+
checkGradleBuild(
233214
"checkerframework".tag(Java8Only),
234215
"""|/build.gradle
235216
|plugins {
@@ -251,8 +232,8 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
251232
|package foo;
252233
|public class ExampleSuite {}
253234
|""".stripMargin,
254-
2,
255-
initCommand = gradleVersion("6.8.3")
235+
expectedSemanticdbFiles = 2,
236+
gradleVersions = List(Gradle67)
256237
)
257238

258239
checkGradleBuild(
@@ -280,9 +261,9 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
280261
|package foo
281262
|class ExampleSuite {}
282263
|""".stripMargin,
283-
expectedSemanticdbFiles = 4
264+
expectedSemanticdbFiles = 4,
265+
gradleVersions = List(Gradle8, Gradle7, Gradle67)
284266
)
285-
286267
checkGradleBuild(
287268
"kotlin",
288269
"""|/build.gradle
@@ -351,7 +332,8 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
351332
|maven:org.jetbrains.kotlin:kotlin-stdlib:1.6.20
352333
|maven:org.jetbrains:annotations:13.0
353334
|maven:org.slf4j:slf4j-api:1.7.36
354-
|""".stripMargin
335+
|""".stripMargin,
336+
gradleVersions = List(Gradle8, Gradle7, Gradle67)
355337
)
356338

357339
List("8", "11").foreach { java =>
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package tests
2+
3+
import java.nio.file.Files
4+
import java.nio.file.StandardOpenOption
5+
6+
import munit.TestOptions
7+
8+
abstract class GradleBuildToolSuiteBase(val allGradle: List[String])
9+
extends BaseBuildToolSuite {
10+
11+
def gradleVersion(version: String): List[String] = {
12+
createEmptyBuildScript()
13+
List("gradle", "wrapper", "--gradle-version", version)
14+
}
15+
16+
def createEmptyBuildScript(): Unit = {
17+
val script = workingDirectory.resolve("build.gradle")
18+
Files.createDirectories(script.getParent)
19+
Files.write(
20+
script,
21+
Array.emptyByteArray,
22+
StandardOpenOption.TRUNCATE_EXISTING,
23+
StandardOpenOption.CREATE
24+
)
25+
}
26+
27+
def checkGradleBuild(
28+
title: TestOptions,
29+
setup: String,
30+
gradleVersions: List[String],
31+
expectedSemanticdbFiles: Int = 0,
32+
expectedPackages: String = "",
33+
extraArguments: List[String] = Nil
34+
) = {
35+
gradleVersions
36+
.filter(allGradle.contains(_))
37+
.foreach { gradleV =>
38+
{
39+
val testName = title.withName(title.name + s"-gradle$gradleV")
40+
checkBuild(
41+
if (gradleV.startsWith("6.") || gradleV.startsWith("5."))
42+
testName.tag(Java8Only)
43+
else
44+
testName,
45+
setup,
46+
expectedSemanticdbFiles = expectedSemanticdbFiles,
47+
expectedPackages = expectedPackages,
48+
initCommand = gradleVersion(gradleV),
49+
extraArguments = extraArguments
50+
)
51+
}
52+
}
53+
}
54+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package tests
2+
3+
class LegacyGradleBuiltToolSuite
4+
extends GradleBuildToolSuiteBase(List("3.3", "2.2.1")) {
5+
checkGradleBuild(
6+
"legacy".tag(Java8Only),
7+
s"""|/build.gradle
8+
|apply plugin: 'java'
9+
|/src/main/java/Example.java
10+
|public class Example {}
11+
|/src/test/java/ExampleSuite.java
12+
|public class ExampleSuite {}
13+
|""".stripMargin,
14+
expectedSemanticdbFiles = 2,
15+
gradleVersions = allGradle
16+
// NOTE(olafur): no packages because we use more modern APIs.
17+
)
18+
19+
}

0 commit comments

Comments
 (0)