[BT] Implement classpath snapshotting in the Build Tools API

#KT-57565 In Progress
This commit is contained in:
Alexander.Likhachev
2023-07-31 13:52:38 +02:00
committed by Space Team
parent 329fd6be45
commit 83c53b7ce3
10 changed files with 213 additions and 13 deletions
@@ -9,7 +9,7 @@ public final class org/jetbrains/kotlin/buildtools/api/CompilationResult : java/
public abstract interface class org/jetbrains/kotlin/buildtools/api/CompilationService {
public static final field Companion Lorg/jetbrains/kotlin/buildtools/api/CompilationService$Companion;
public abstract fun calculateClasspathSnapshot (Ljava/io/File;)Lorg/jetbrains/kotlin/buildtools/api/jvm/ClasspathEntrySnapshot;
public abstract fun calculateClasspathSnapshot (Ljava/io/File;Lorg/jetbrains/kotlin/buildtools/api/jvm/ClassSnapshotGranularity;)Lorg/jetbrains/kotlin/buildtools/api/jvm/ClasspathEntrySnapshot;
public abstract fun compileJvm (Lorg/jetbrains/kotlin/buildtools/api/ProjectId;Lorg/jetbrains/kotlin/buildtools/api/CompilerExecutionStrategyConfiguration;Lorg/jetbrains/kotlin/buildtools/api/jvm/JvmCompilationConfiguration;Ljava/util/List;Ljava/util/List;)Lorg/jetbrains/kotlin/buildtools/api/CompilationResult;
public abstract fun finishProjectCompilation (Lorg/jetbrains/kotlin/buildtools/api/ProjectId;)V
public static fun loadImplementation (Ljava/lang/ClassLoader;)Lorg/jetbrains/kotlin/buildtools/api/CompilationService;
@@ -82,6 +82,10 @@ public final class org/jetbrains/kotlin/buildtools/api/SourcesChanges$Unknown :
public static final field INSTANCE Lorg/jetbrains/kotlin/buildtools/api/SourcesChanges$Unknown;
}
public abstract interface class org/jetbrains/kotlin/buildtools/api/jvm/AccessibleClassSnapshot : org/jetbrains/kotlin/buildtools/api/jvm/ClassSnapshot {
public abstract fun getClassAbiHash ()J
}
public abstract interface class org/jetbrains/kotlin/buildtools/api/jvm/ClassSnapshot {
}
@@ -93,7 +97,7 @@ public final class org/jetbrains/kotlin/buildtools/api/jvm/ClassSnapshotGranular
}
public abstract interface class org/jetbrains/kotlin/buildtools/api/jvm/ClasspathEntrySnapshot {
public abstract fun getClassSnapshots ()Ljava/util/LinkedHashMap;
public abstract fun getClassSnapshots ()Ljava/util/Map;
public abstract fun saveSnapshot (Ljava/io/File;)V
}
@@ -115,6 +119,9 @@ public abstract interface class org/jetbrains/kotlin/buildtools/api/jvm/Classpat
public abstract fun useProjectDir (Ljava/io/File;)Lorg/jetbrains/kotlin/buildtools/api/jvm/ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration;
}
public abstract interface class org/jetbrains/kotlin/buildtools/api/jvm/InaccessibleClassSnapshot : org/jetbrains/kotlin/buildtools/api/jvm/ClassSnapshot {
}
public abstract interface class org/jetbrains/kotlin/buildtools/api/jvm/IncrementalCompilationApproachParameters {
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.buildtools.api
import org.jetbrains.kotlin.buildtools.api.jvm.ClassSnapshotGranularity
import org.jetbrains.kotlin.buildtools.api.jvm.ClasspathEntrySnapshot
import org.jetbrains.kotlin.buildtools.api.jvm.JvmCompilationConfiguration
import java.io.File
@@ -28,7 +29,7 @@ public interface CompilationService {
/**
* TODO KT-57565
*/
public fun calculateClasspathSnapshot(classpathEntry: File): ClasspathEntrySnapshot
public fun calculateClasspathSnapshot(classpathEntry: File, granularity: ClassSnapshotGranularity): ClasspathEntrySnapshot
/**
* Provides a default [CompilerExecutionStrategyConfiguration] allowing to use it as is or customizing for specific requirements.
@@ -15,7 +15,7 @@ import java.io.File
*/
@ExperimentalBuildToolsApi
public interface ClasspathEntrySnapshot {
public val classSnapshots: LinkedHashMap<String, ClassSnapshot>
public val classSnapshots: Map<String, ClassSnapshot>
public fun saveSnapshot(path: File)
}
@@ -26,6 +26,18 @@ public interface ClasspathEntrySnapshot {
* This interface is not intended to be implemented by the API consumers.
*/
@ExperimentalBuildToolsApi
public interface ClassSnapshot {
// ... TODO: KT-57565, it will expose some part of org.jetbrains.kotlin.incremental.classpathDiff.ClassSnapshot hierarchy
public sealed interface ClassSnapshot
/**
* [ClassSnapshot] of an inaccessible class.
*
* A class is inaccessible if it can't be referenced from other source files (and therefore any changes in an inaccessible class will not
* require recompilation of other source files).
*/
@ExperimentalBuildToolsApi
public interface InaccessibleClassSnapshot : ClassSnapshot
@ExperimentalBuildToolsApi
public interface AccessibleClassSnapshot : ClassSnapshot {
public val classAbiHash: Long
}
@@ -13,13 +13,18 @@ dependencies {
compileOnly(project(":kotlin-daemon-client"))
compileOnly(project(":compiler:incremental-compilation-impl"))
compileOnly(project(":kotlin-compiler-runner-unshaded"))
compileOnly(intellijCore())
runtimeOnly(project(":kotlin-compiler-embeddable"))
runtimeOnly(project(":kotlin-compiler-runner"))
}
publish()
standardPublicJars()
runtimeJar(rewriteDefaultJarDepsToShadedCompiler {
from(mainSourceSet.output)
})
sourcesJar()
javadocJar()
kotlin {
compilerOptions {
@@ -0,0 +1,13 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.buildtools.internal
import org.jetbrains.kotlin.buildtools.api.jvm.AccessibleClassSnapshot
import org.jetbrains.kotlin.buildtools.api.jvm.InaccessibleClassSnapshot
class AccessibleClassSnapshotImpl(override val classAbiHash: Long) : AccessibleClassSnapshot
object InaccessibleClassSnapshotImpl : InaccessibleClassSnapshot
@@ -0,0 +1,31 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.buildtools.internal
import org.jetbrains.kotlin.buildtools.api.jvm.ClassSnapshot
import org.jetbrains.kotlin.buildtools.api.jvm.ClasspathEntrySnapshot
import org.jetbrains.kotlin.incremental.classpathDiff.AccessibleClassSnapshot
import org.jetbrains.kotlin.incremental.classpathDiff.ClasspathEntrySnapshotExternalizer
import org.jetbrains.kotlin.incremental.classpathDiff.InaccessibleClassSnapshot
import org.jetbrains.kotlin.incremental.storage.saveToFile
import java.io.File
class ClasspathEntrySnapshotImpl(
private val origin: org.jetbrains.kotlin.incremental.classpathDiff.ClasspathEntrySnapshot,
) :
ClasspathEntrySnapshot {
override val classSnapshots: Map<String, ClassSnapshot>
get() = origin.classSnapshots.mapValues {
when (val snapshot = it.value) {
is AccessibleClassSnapshot -> AccessibleClassSnapshotImpl(snapshot.classAbiHash)
is InaccessibleClassSnapshot -> InaccessibleClassSnapshotImpl
}
}
override fun saveSnapshot(path: File) {
ClasspathEntrySnapshotExternalizer.saveToFile(path, origin)
}
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.buildtools.internal
import org.jetbrains.kotlin.build.report.metrics.DoNothingBuildMetricsReporter
import org.jetbrains.kotlin.buildtools.api.*
import org.jetbrains.kotlin.buildtools.api.jvm.*
import org.jetbrains.kotlin.cli.common.ExitCode
@@ -18,6 +19,7 @@ import org.jetbrains.kotlin.daemon.client.BasicCompilerServicesWithResultsFacade
import org.jetbrains.kotlin.daemon.common.CompilerId
import org.jetbrains.kotlin.daemon.common.configureDaemonJVMOptions
import org.jetbrains.kotlin.daemon.common.filterExtractProps
import org.jetbrains.kotlin.incremental.classpathDiff.ClasspathEntrySnapshotter
import java.io.File
import java.net.URLClassLoader
import java.util.concurrent.ConcurrentHashMap
@@ -36,9 +38,8 @@ private fun getCurrentClasspath() = (CompilationServiceImpl::class.java.classLoa
internal object CompilationServiceImpl : CompilationService {
private val buildIdToSessionFlagFile: MutableMap<ProjectId, File> = ConcurrentHashMap()
override fun calculateClasspathSnapshot(classpathEntry: File): ClasspathEntrySnapshot {
TODO("Calculating classpath snapshots via the Build Tools API is not yet implemented: KT-57565")
}
override fun calculateClasspathSnapshot(classpathEntry: File, granularity: ClassSnapshotGranularity) =
ClasspathEntrySnapshotImpl(ClasspathEntrySnapshotter.snapshot(classpathEntry, granularity, DoNothingBuildMetricsReporter))
override fun makeCompilerExecutionStrategyConfiguration() = CompilerExecutionStrategyConfigurationImpl()