Skip to content

Commit 2a6cc1f

Browse files
authored
Merge pull request #351 from olafurpg/kotlin-gradle
Add support for Kotlin Gradle projects
2 parents a1a37d9 + f681907 commit 2a6cc1f

File tree

10 files changed

+146
-18
lines changed

10 files changed

+146
-18
lines changed

build.sbt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ lazy val V =
1818
def scala3 = "3.0.1"
1919
def metals = "0.10.6-M1"
2020
def scalameta = "4.4.26"
21-
def semanticdbKotlinc = "0.0.2"
21+
def semanticdbKotlinc = "0.1.0"
2222
def testcontainers = "0.39.3"
2323
def requests = "0.6.5"
2424
}
@@ -409,7 +409,8 @@ lazy val javaOnlySettings = List[Def.Setting[_]](
409409
lazy val testSettings = List(
410410
(publish / skip) := true,
411411
autoScalaLibrary := true,
412-
testFrameworks := List(new TestFramework("munit.Framework")),
412+
testFrameworks := List(TestFrameworks.MUnit),
413+
testOptions ++= List(Tests.Argument(TestFrameworks.MUnit, "-b")),
413414
libraryDependencies ++=
414415
List(
415416
"org.scalameta" %% "munit" % "0.7.29",

lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleBuildTool.scala

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,20 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) {
8484
index.finalBuildCommand(
8585
List[Option[String]](
8686
Some("clean"),
87-
Some("compileTestJava"),
87+
if (toolchains.isJavaEnabled)
88+
Some("compileTestJava")
89+
else
90+
None,
8891
if (toolchains.isScalaEnabled)
8992
Some("compileTestScala")
93+
else
94+
None,
95+
if (toolchains.isKotlinEnabled)
96+
Some("compileTestKotlin")
97+
else
98+
None,
99+
if (toolchains.isKotlinMultiplatformEnabled)
100+
Some("compileTestKotlinJvm")
90101
else
91102
None
92103
).flatten
@@ -131,6 +142,7 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) {
131142
else
132143
""
133144
val dependenciesPath = targetroot.resolve("dependencies.txt")
145+
val kotlinSemanticdbVersion = BuildInfo.semanticdbKotlincVersion
134146
Files.deleteIfExists(dependenciesPath)
135147
val script =
136148
s"""|allprojects {
@@ -141,6 +153,9 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) {
141153
| boolean isScalaEnabled = project.plugins.any {
142154
| it.getClass().getName().endsWith("org.gradle.api.plugins.scala.ScalaPlugin")
143155
| }
156+
| boolean isKotlinEnabled = project.plugins.any {
157+
| it.getClass().getName().startsWith("org.jetbrains.kotlin.gradle.plugin")
158+
| }
144159
| if (isJavaEnabled) {
145160
| tasks.withType(JavaCompile) {
146161
| options.fork = true
@@ -179,6 +194,25 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) {
179194
| }
180195
| }
181196
| }
197+
| if (isKotlinEnabled) {
198+
| tasks.configureEach {
199+
| if (it.getClass().getName().contains("KotlinCompile")) {
200+
| try {
201+
| def semanticdbKotlincDependency = "com.sourcegraph:semanticdb-kotlinc:$kotlinSemanticdbVersion"
202+
| def semanticdbKotlinc = project.configurations.detachedConfiguration(dependencies.create(semanticdbKotlincDependency)).files[0]
203+
| kotlinOptions {
204+
| freeCompilerArgs << "-Xplugin=" + semanticdbKotlinc
205+
| freeCompilerArgs << "-P"
206+
| freeCompilerArgs << "plugin:semanticdb-kotlinc:sourceroot=$sourceroot"
207+
| freeCompilerArgs << "-P"
208+
| freeCompilerArgs << "plugin:semanticdb-kotlinc:targetroot=$targetroot"
209+
| }
210+
| } catch (Throwable e) {
211+
| e.printStackTrace()
212+
| }
213+
| }
214+
| }
215+
| }
182216
| }
183217
| task $lsifJavaDependencies {
184218
| def depsOut = java.nio.file.Paths.get('$dependenciesPath')
@@ -236,7 +270,7 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) {
236270
| }
237271
| return null
238272
|}
239-
| """.stripMargin
273+
|""".stripMargin
240274
Files.write(
241275
tmp.resolve("init-script.gradle"),
242276
script.getBytes(StandardCharsets.UTF_8)

lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleJavaToolchains.scala

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ case class GradleJavaToolchains(
1414
tool: GradleBuildTool,
1515
index: IndexCommand,
1616
gradleVersion: Option[String],
17+
isJavaEnabled: Boolean,
1718
isScalaEnabled: Boolean,
19+
isKotlinEnabled: Boolean,
20+
isKotlinMultiplatformEnabled: Boolean,
1821
gradleCommand: String,
1922
tmp: Path
2023
) {
@@ -56,7 +59,11 @@ object GradleJavaToolchains {
5659
): GradleJavaToolchains = {
5760
val scriptPath = tmp.resolve("java-toolchains.gradle")
5861
val toolchainsPath = tmp.resolve("java-toolchains.txt")
62+
val javaEnabledPath = tmp.resolve("java-enabled.txt")
5963
val scalaEnabledPath = tmp.resolve("scala-enabled.txt")
64+
val kotlinEnabledPath = tmp.resolve("kotlin-enabled.txt")
65+
val kotlinMultiplatformEnabledPath = tmp
66+
.resolve("kotlin-multiplatform-enabled.txt")
6067
val gradleVersionPath = tmp.resolve("gradle-version.txt")
6168
val taskName = "lsifDetectJavaToolchains"
6269
val script =
@@ -70,12 +77,21 @@ object GradleJavaToolchains {
7077
|} catch (Exception e) {
7178
| // Ignore errors.
7279
|}
80+
|
81+
|def lsifJavaAppendLine(path, line) {
82+
| java.nio.file.Files.write(
83+
| java.nio.file.Paths.get(path),
84+
| [line],
85+
| java.nio.file.StandardOpenOption.APPEND,
86+
| java.nio.file.StandardOpenOption.CREATE)
87+
|}
88+
|
7389
|allprojects {
7490
| task $taskName {
7591
| def toolchainsOut = java.nio.file.Paths.get('$toolchainsPath')
7692
| doLast {
77-
| tasks.withType(JavaCompile) {
78-
| try {
93+
| try {
94+
| tasks.withType(JavaCompile) {
7995
| def lines = new ArrayList<String>()
8096
| def path = javaCompiler.get().getExecutablePath()
8197
| def version = javaCompiler.get().getMetadata().getLanguageVersion().asInt()
@@ -85,19 +101,21 @@ object GradleJavaToolchains {
85101
| [line],
86102
| java.nio.file.StandardOpenOption.APPEND,
87103
| java.nio.file.StandardOpenOption.CREATE)
88-
| } catch (Exception e) {
89-
| // Ignore errors.
104+
| lsifJavaAppendLine(toolchainsOut, line)
90105
| }
106+
| } catch (Exception e) {
107+
| // Ignore errors.
91108
| }
92-
| boolean isScalaEnabled = project.plugins.any {
93-
| it.getClass().getName().endsWith("org.gradle.api.plugins.scala.ScalaPlugin")
94-
| }
95-
| if (isScalaEnabled) {
96-
| java.nio.file.Files.write(
97-
| java.nio.file.Paths.get('$scalaEnabledPath'),
98-
| ["true"],
99-
| java.nio.file.StandardOpenOption.APPEND,
100-
| java.nio.file.StandardOpenOption.CREATE)
109+
| project.plugins.each {
110+
| def name = it.getClass().getName()
111+
| if (name.endsWith("org.gradle.api.plugins.JavaPlugin"))
112+
| lsifJavaAppendLine('$javaEnabledPath', 'true')
113+
| if (name.endsWith("org.gradle.api.plugins.scala.ScalaPlugin"))
114+
| lsifJavaAppendLine('$scalaEnabledPath', 'true')
115+
| if (name.startsWith("org.jetbrains.kotlin.gradle.plugin"))
116+
| lsifJavaAppendLine('$kotlinEnabledPath', 'true')
117+
| if (name.equals("org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginWrapper"))
118+
| lsifJavaAppendLine('$kotlinMultiplatformEnabledPath', 'true')
101119
| }
102120
| }
103121
| }
@@ -131,7 +149,11 @@ object GradleJavaToolchains {
131149
tool,
132150
index,
133151
gradleVersion = gradleVersion,
152+
isJavaEnabled = Files.isRegularFile(javaEnabledPath),
134153
isScalaEnabled = Files.isRegularFile(scalaEnabledPath),
154+
isKotlinEnabled = Files.isRegularFile(kotlinEnabledPath),
155+
isKotlinMultiplatformEnabled = Files
156+
.isRegularFile(kotlinMultiplatformEnabledPath),
135157
gradleCommand = gradleCommand,
136158
tmp = tmp
137159
)

project/build.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
sbt.version=1.5.2
1+
sbt.version=1.5.5

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

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,4 +262,69 @@ class GradleBuildToolSuite extends BaseBuildToolSuite {
262262
4
263263
)
264264

265+
checkBuild(
266+
"kotlin",
267+
"""|/build.gradle
268+
|plugins {
269+
| id 'org.jetbrains.kotlin.jvm' version '1.5.31'
270+
|}
271+
|repositories {
272+
| mavenCentral()
273+
|}
274+
|/src/main/java/foo/JExample.java
275+
|package foo;
276+
|public class JExample {}
277+
|/src/main/kotlin/foo/Example.kt
278+
|package foo
279+
|object Example {}
280+
|/src/test/java/foo/JExampleSuite.java
281+
|package foo;
282+
|public class JExampleSuite {}
283+
|/src/test/kotlin/foo/ExampleSuite.kt
284+
|package foo
285+
|class ExampleSuite {}
286+
|""".stripMargin,
287+
4
288+
)
289+
290+
List("jvm()" -> 2, "jvm { withJava() }" -> 4).foreach {
291+
case (jvmSettings, expectedSemanticdbFiles) =>
292+
checkBuild(
293+
s"kotlin-multiplatform-$jvmSettings",
294+
s"""|/build.gradle
295+
|plugins {
296+
| id 'org.jetbrains.kotlin.multiplatform' version '1.5.31'
297+
|}
298+
|repositories {
299+
| mavenCentral()
300+
|}
301+
|kotlin {
302+
| ${jvmSettings}
303+
| sourceSets {
304+
| jvmTest {
305+
| dependencies {
306+
| implementation kotlin("test-junit")
307+
| }
308+
| }
309+
| }
310+
|}
311+
|/gradle.properties
312+
|kotlin.mpp.stability.nowarn=true
313+
|/src/jvmMain/java/foo/ExampleJ.java
314+
|package foo;
315+
|public class ExampleJ {} // ignored by multiplatform
316+
|/src/jvmMain/kotlin/foo/Example.kt
317+
|package foo
318+
|object Example {}
319+
|/src/jvmTest/java/foo/ExampleJSuite.java
320+
|package foo;
321+
|class ExampleJSuite {} // ignored by multiplatform
322+
|/src/commonTest/kotlin/foo/ExampleJvmSuite.kt
323+
|package foo
324+
|class ExampleJvmSuite {}
325+
|""".stripMargin,
326+
expectedSemanticdbFiles
327+
)
328+
}
329+
265330
}

tests/snapshots/src/main/generated/com/airbnb/epoxy/EpoxyRecyclerView.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,7 @@ open class EpoxyRecyclerView @JvmOverloads constructor(
11421142
}
11431143

11441144
companion object {
1145+
// ^^^^^^^^^ definition com/airbnb/epoxy/EpoxyRecyclerView#Companion#
11451146
private const val DEFAULT_ADAPTER_REMOVAL_DELAY_MS = 2000
11461147
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition com/airbnb/epoxy/EpoxyRecyclerView#Companion#DEFAULT_ADAPTER_REMOVAL_DELAY_MS.
11471148
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition com/airbnb/epoxy/EpoxyRecyclerView#Companion#getDEFAULT_ADAPTER_REMOVAL_DELAY_MS().

tests/snapshots/src/main/generated/com/airbnb/epoxy/EpoxyVisibilityTracker.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,6 +1085,7 @@ class EpoxyVisibilityTracker {
10851085
}
10861086

10871087
companion object {
1088+
// ^^^^^^^^^ definition com/airbnb/epoxy/EpoxyVisibilityTracker#Companion#
10881089
private const val TAG = "EpoxyVisibilityTracker"
10891090
// ^^^ definition com/airbnb/epoxy/EpoxyVisibilityTracker#Companion#TAG.
10901091
// ^^^ definition com/airbnb/epoxy/EpoxyVisibilityTracker#Companion#getTAG().

tests/snapshots/src/main/generated/com/airbnb/epoxy/ModelGroupHolder.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,7 @@ class ModelGroupHolder(private val modelGroupParent: ViewParent) : EpoxyHolder()
443443
}
444444

445445
companion object {
446+
// ^^^^^^^^^ definition com/airbnb/epoxy/ModelGroupHolder#Companion#
446447

447448
private val HELPER_ADAPTER = HelperAdapter()
448449
// ^^^^^^^^^^^^^^ definition com/airbnb/epoxy/ModelGroupHolder#Companion#HELPER_ADAPTER.

tests/snapshots/src/main/generated/com/airbnb/epoxy/preload/EpoxyModelPreloader.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ abstract class EpoxyModelPreloader<T : EpoxyModel<*>, U : ViewMetadata?, P : Pre
9595
)
9696

9797
companion object {
98+
// ^^^^^^^^^ definition com/airbnb/epoxy/preload/EpoxyModelPreloader#Companion#
9899

99100
/**
100101
* Helper to create a [EpoxyModelPreloader].

tests/snapshots/src/main/generated/com/airbnb/epoxy/preload/EpoxyPreloader.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ class EpoxyPreloader<P : PreloadRequestHolder> private constructor(
517517
}
518518

519519
companion object {
520+
// ^^^^^^^^^ definition com/airbnb/epoxy/preload/EpoxyPreloader#Companion#
520521

521522
/**
522523
*
@@ -709,6 +710,7 @@ class ViewData<out U : ViewMetadata?>(
709710
interface ViewMetadata {
710711
// ^^^^^^^^^^^^ definition com/airbnb/epoxy/preload/ViewMetadata#
711712
companion object {
713+
// ^^^^^^^^^ definition com/airbnb/epoxy/preload/ViewMetadata#Companion#
712714
fun getDefault(view: View): ViewMetadata? {
713715
// ^^^^^^^^^^ definition com/airbnb/epoxy/preload/ViewMetadata#Companion#getDefault().
714716
// ^^^^ definition com/airbnb/epoxy/preload/ViewMetadata#Companion#getDefault().(view)

0 commit comments

Comments
 (0)