Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 8 additions & 27 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ lazy val V =
val scipBindings = "0.8.0"
val scalaXml = "2.1.0"
val moped = "0.2.0"
val gradle = "7.0"
val gradle = "8.10"
val scala213 = "2.13.13"
val scalameta = "4.9.3"
val kotlinVersion = "2.2.0"
Expand Down Expand Up @@ -432,14 +432,7 @@ lazy val semanticdbKotlincMinimized = project
// Setting javaHome to Some(<current JVM home>) flips
// ZincUtil.compilers/JavaTools.directOrFork from direct → fork.
javaHome := Some(file(System.getProperty("java.home"))),
Compile / javacOptions ++=
Seq(
"-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
"-J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
"-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED",
"-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
"-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED"
),
Compile / javacOptions ++= javacModuleOptions,
// Attach the assembled kotlinc fat-jar to the compile classpath.
// sbt-kotlin-plugin's AnalyzingKotlinCompiler partitions the classpath:
// any jar containing META-INF/services/org.jetbrains.kotlin.compiler.plugin*
Expand Down Expand Up @@ -516,14 +509,7 @@ lazy val minimizedSettings = List[Def.Setting[_]](
// Fork javac so it receives real file paths instead of sbt's `vf://` virtual-file URIs
// (see the comment on `semanticdbKotlincMinimized` for the long story).
javaHome := Some(file(System.getProperty("java.home"))),
Compile / javacOptions ++=
Seq(
"-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
"-J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
"-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED",
"-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
"-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED"
),
Compile / javacOptions ++= javacModuleOptions,
javacOptions +=
List(
s"-Xplugin:semanticdb",
Expand All @@ -542,16 +528,11 @@ lazy val minimized = project
.disablePlugins(JavaFormatterPlugin)

def javacModuleOptions = List(
"-J--add-exports",
"-Jjdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
"-J--add-exports",
"-Jjdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
"-J--add-exports",
"-Jjdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED",
"-J--add-exports",
"-Jjdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
"-J--add-exports",
"-Jjdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED"
"-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
"-J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
"-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED",
"-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
"-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED"
)

lazy val unit = project
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ import com.sourcegraph.scip_java.BuildInfo
import org.gradle.api.DefaultTask
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.provider.Property
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.tasks.SourceSetContainer
Expand All @@ -23,7 +21,6 @@ class SemanticdbGradlePlugin extends Plugin[Project] {
import Logging._

override def apply(project: Project): Unit = {
val gradle = new GradleVersion(project.getGradle().getGradleVersion())
project.afterEvaluate { project =>
project.getRepositories().add(project.getRepositories().mavenCentral())
project.getRepositories().add(project.getRepositories().mavenLocal())
Expand Down Expand Up @@ -106,60 +103,16 @@ class SemanticdbGradlePlugin extends Plugin[Project] {
.getTasks()
.withType(classOf[JavaCompile])
.configureEach { task =>
// If we run on JDK 17, we need to add special flags to the JVM
// to allow access to the compiler.

// JDK 17 support was only introduced in 7.3 so
// we don't need to do it for earlier versions
// https://docs.gradle.org/current/userguide/compatibility.html
if (!gradle.is3 && !gradle.is2 && !gradle.is5 && !gradle.is6) {
type JavaCompiler = {
type Metadata = {
type LangVersion = {
def asInt(): Int
}
def getLanguageVersion(): LangVersion
}
def getMetadata(): Metadata
}

type HasCompilerProperty = {
def getJavaCompiler(): Property[JavaCompiler]
}

val toolchainCompiler = Option(
task
.asInstanceOf[HasCompilerProperty]
.getJavaCompiler()
.getOrNull()
).map(_.getMetadata().getLanguageVersion().asInt())

val host = System
.getProperty("java.version")
.split("\\.")
.headOption
.map(_.toInt)

toolchainCompiler
.orElse(host)
.foreach { version =>
if (version >= 17) {
val newValue = task.getOptions().getForkOptions()
val jvmArgs =
BuildInfo
.javacModuleOptions
.map(_.stripPrefix("-J"))
.asJava

newValue.getJvmArgs() match {
case null =>
newValue.setJvmArgs(jvmArgs)
case other =>
newValue.getJvmArgs().addAll(jvmArgs)

}
}
}
// Add --add-exports JVM args so our compiler plugin can access
// javac internals. Required on JDK 17+ (JEP 403), no-op on 11-16.
val forkOptions = task.getOptions().getForkOptions()
val jvmArgs =
BuildInfo.javacModuleOptions.map(_.stripPrefix("-J")).asJava
forkOptions.getJvmArgs() match {
case null =>
forkOptions.setJvmArgs(jvmArgs)
case _ =>
forkOptions.getJvmArgs().addAll(jvmArgs)
}

task.getOptions().setFork(true)
Expand Down Expand Up @@ -280,28 +233,6 @@ class SemanticdbGradlePlugin extends Plugin[Project] {

}

class GradleVersion(ver: String) {
override def toString(): String = s"[GradleVersion: $ver]"
def is7 = ver.startsWith("7.")
def is8 = ver.startsWith("8.")
def is6 = ver.startsWith("6.")
// 6.7 introduced toolchains support https://blog.gradle.org/java-toolchains
// And javaCompiler property
def is6_7_plus = {
ver match {
case s"6.$x.$y" if x.toInt >= 7 =>
true
case s"6.$x" if x.toInt >= 7 =>
true
case _ =>
false
}
}
def is5 = ver.startsWith("5.")
def is3 = ver.startsWith("3.")
def is2 = ver.startsWith("2.")
}

class WriteDependencies extends DefaultTask {
import Logging._

Expand Down Expand Up @@ -329,8 +260,6 @@ class WriteDependencies extends DefaultTask {
path
}

val gradle = new GradleVersion(project.getGradle().getGradleVersion())

// List the project itself as a dependency so that we can assign project name/version to symbols that are defined in this project.
// The code below is roughly equivalent to the following with Groovy:
// deps += "$publication.groupId $publication.artifactId $publication.version $sourceSets.main.output.classesDirectory"
Expand Down Expand Up @@ -411,16 +340,10 @@ class WriteDependencies extends DefaultTask {
}
}

def canBeResolved(conf: Configuration) =
if (gradle.is2)
!conf.isEmpty()
else
conf.isCanBeResolved()

project
.getConfigurations()
.forEach { conf =>
if (canBeResolved(conf)) {
if (conf.isCanBeResolved()) {
try {
val resolved = conf.getResolvedConfiguration()
resolved
Expand Down
82 changes: 11 additions & 71 deletions tests/buildTools/src/test/scala/tests/GradleBuildToolSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ package tests
import tests.Tool._

class Gradle_8_BuildToolSuite extends GradleBuildToolSuite(Gradle8)
class Gradle_7_BuildToolSuite extends GradleBuildToolSuite(Gradle7)
class Gradle_6_BuildToolSuite extends GradleBuildToolSuite(Gradle6)
class Gradle_5_BuildToolSuite extends GradleBuildToolSuite(Gradle5)

abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
extends GradleBuildToolSuiteBase(gradle) {
Expand Down Expand Up @@ -39,8 +36,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
- build/generated/sources/annotationProcessor/java/main/test/ImmutableWorkflowOptions.java.semanticdb
- /META-INF/semanticdb/src/main/java/WorkflowOptions.java.semanticdb
*/
expectedSemanticdbFiles = 2,
gradleVersions = List(Gradle8, Gradle7, Gradle6)
expectedSemanticdbFiles = 2
)

checkGradleBuild(
Expand Down Expand Up @@ -71,8 +67,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
""".stripMargin,
// See comment about immutable annotation processor above,
// it explains why we expecte 2 semanticdb files
expectedSemanticdbFiles = 2,
gradleVersions = List(Gradle8, Gradle7, Gradle6)
expectedSemanticdbFiles = 2
)

checkGradleBuild(
Expand Down Expand Up @@ -100,12 +95,9 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
|public abstract class ExampleClass {}
""".stripMargin,
expectedSemanticdbFiles = 1,
gradleVersions = List(Gradle8, Gradle7, Gradle6),
expectedPackages = "maven:com.sourcegraph:example-library:1.1"
)

// This is the most basic test for Java support
// We run it for an extended list of Gradle versions
checkGradleBuild(
"basic",
"""|/build.gradle
Expand Down Expand Up @@ -152,9 +144,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
| }
| }
|""".stripMargin,
expectedSemanticdbFiles = 2,
// Only add this test on Gradle 5 in the gradle 6 suite
gradleVersions = List(Gradle8, Gradle7, Gradle6, Gradle5)
expectedSemanticdbFiles = 2
)

allJava.foreach { java =>
Expand All @@ -170,8 +160,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
|/src/main/java/Example.java
|public class Example {}
|""".stripMargin,
expectedSemanticdbFiles = 1,
gradleVersions = List(Gradle8, Gradle7, Gradle6)
expectedSemanticdbFiles = 1
)
}

Expand Down Expand Up @@ -209,8 +198,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
|/src/main/java/Example.java
|public class Example {}
|""".stripMargin,
expectedSemanticdbFiles = 2,
gradleVersions = List(Gradle8, Gradle7, Gradle6)
expectedSemanticdbFiles = 2
)

checkGradleBuild(
Expand All @@ -225,8 +213,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
|<hello/>
|""".stripMargin,
expectedSemanticdbFiles = 2,
extraArguments = List("--build-tool", "gradle"),
gradleVersions = List(Gradle8, Gradle7, Gradle6)
extraArguments = List("--build-tool", "gradle")
)

checkGradleBuild(
Expand All @@ -239,8 +226,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
|public class ExampleSuite {}
|""".stripMargin,
expectedSemanticdbFiles = 1,
extraArguments = List("--", "compileJava"),
gradleVersions = List(Gradle8, Gradle7, Gradle6)
extraArguments = List("--", "compileJava")
)

checkGradleBuild(
Expand All @@ -265,8 +251,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
|package foo
|class ExampleSuite {}
|""".stripMargin,
expectedSemanticdbFiles = 4,
gradleVersions = List(Gradle8)
expectedSemanticdbFiles = 4
)

checkGradleBuild(
Expand Down Expand Up @@ -311,8 +296,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
|maven:org.jetbrains.kotlin:kotlin-stdlib:1.6.20
|maven:org.jetbrains:annotations:13.0
|maven:org.slf4j:slf4j-api:1.7.36
|""".stripMargin,
gradleVersions = List(Gradle8, Gradle7, Gradle6)
|""".stripMargin
)

List("11", "17").foreach { java =>
Expand All @@ -333,53 +317,10 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
|package foo
|object Example {}
|""".stripMargin,
expectedSemanticdbFiles = 1,
gradleVersions = List(Gradle8)
expectedSemanticdbFiles = 1
)
}

/*
* TODO: Fixing this test for Kotlin 2.1 proved to be difficult.
There are some related deprecations in https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-compatibility-guide.html#kotlin-2-0-0-and-later
but the test doesn't behave as expected.
*/
// List("jvm()" -> 4, "jvm { withJava() }" -> 4).foreach {
// case (jvmSettings, expectedSemanticdbFiles) =>
// checkGradleBuild(
// s"kotlin-multiplatform-$jvmSettings",
// s"""|/build.gradle
// |plugins {
// | id 'org.jetbrains.kotlin.multiplatform' version '2.2.0'
// |}
// |repositories {
// | mavenCentral()
// |}
// |kotlin {
// | ${jvmSettings}
// |}
// |/gradle.properties
// |kotlin.mpp.stability.nowarn=true
// |kotlin.jvm.target.validation.mode=ignore
// |/src/jvmMain/java/foo/ExampleJ.java
// |package foo;
// |public class ExampleJ {} // ignored by multiplatform
// |/src/jvmMain/kotlin/foo/Example.kt
// |package foo
// |object Example {}
// |/src/jvmTest/java/foo/ExampleJSuite.java
// |package foo;
// |class ExampleJSuite {} // ignored by multiplatform
// |/src/commonTest/kotlin/foo/ExampleJvmSuite.kt
// |package foo
// |class ExampleJvmSuite {}
// |""".stripMargin,
// expectedSemanticdbFiles = expectedSemanticdbFiles,
// // Older Kotlin gradle plugins don't support Gradle 8:
// // https://youtrack.jetbrains.com/issue/KT-55704/Cannot-use-TaskAction-annotation-on-method-AbstractKotlinCompile.execute-error-while-using-Gradle-8.0-rc-with-KGP-1.5.32
// gradleVersions = List(Gradle7, Gradle8)
// )
// }

// Regression test: projects that lazily register custom source sets (e.g. intTest)
// with a Java toolchain would fail because the eager `.all {}` API in the plugin
// caused the javaCompiler property to be finalized before Gradle finished
Expand Down Expand Up @@ -409,8 +350,7 @@ abstract class GradleBuildToolSuite(gradle: Tool.Gradle)
|/src/intTest/java/ExampleIntTest.java
|public class ExampleIntTest {}
|""".stripMargin,
expectedSemanticdbFiles = 1,
gradleVersions = List(Gradle8, Gradle7)
expectedSemanticdbFiles = 1
)

}
Loading
Loading