Skip to content

Commit 950cee5

Browse files
mazhukinevgeniySpace Team
authored and
Space Team
committed
[IC] Additional test cases for inlined lambda snapshotting
Test cases are disabled while implementation is in work. ^KT-62555 ^KT-75529 ^KT-74481
1 parent a0a8ca0 commit 950cee5

File tree

51 files changed

+608
-69
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+608
-69
lines changed

compiler/build-tools/kotlin-build-statistics/src/org/jetbrains/kotlin/build/report/metrics/BuildTime.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ enum class GradleBuildTime(private val parent: GradleBuildTime? = null, private
130130
LOAD_CONTENTS_OF_CLASSES(parent = SNAPSHOT_CLASSES, "Load contents of classes"),
131131
SNAPSHOT_KOTLIN_CLASSES(parent = SNAPSHOT_CLASSES, "Snapshot Kotlin classes"),
132132
SNAPSHOT_JAVA_CLASSES(parent = SNAPSHOT_CLASSES, "Snapshot Java classes"),
133+
SNAPSHOT_INLINED_CLASSES(parent = SNAPSHOT_CLASSES, "Snapshot inlined classes"),
133134
SAVE_CLASSPATH_ENTRY_SNAPSHOT(parent = CLASSPATH_ENTRY_SNAPSHOT_TRANSFORM, "Save classpath entry snapshot"),
134135
;
135136
// @formatter:on
@@ -148,10 +149,10 @@ enum class GradleBuildTime(private val parent: GradleBuildTime? = null, private
148149
override fun getName(): String = this.name
149150

150151
companion object {
151-
const val serialVersionUID = 2L
152+
const val serialVersionUID = 2121L // to avoid collision between release branch and mainline versions
152153

153154
val children by lazy {
154155
entries.filter { it.parent != null }.groupBy { it.parent }
155156
}
156157
}
157-
}
158+
}

compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/model/JvmModule.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class JvmModule(
2121
moduleDirectory: Path,
2222
dependencies: List<Dependency>,
2323
defaultStrategyConfig: CompilerExecutionStrategyConfiguration,
24+
private val snapshotConfig: SnapshotConfig,
2425
additionalCompilationArguments: List<String> = emptyList(),
2526
) : AbstractModule(
2627
project,
@@ -73,7 +74,8 @@ class JvmModule(
7374
private fun generateClasspathSnapshot(dependency: Dependency): Path {
7475
val snapshot = BaseTest.compilationService.calculateClasspathSnapshot(
7576
dependency.location.toFile(),
76-
ClassSnapshotGranularity.CLASS_MEMBER_LEVEL
77+
snapshotConfig.granularity,
78+
//snapshotConfig.useInlineLambdaSnapshotting, //TODO(KT-62555)
7779
)
7880
val hash = snapshot.classSnapshots.values
7981
.filterIsInstance<AccessibleClassSnapshot>()

compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/model/Project.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.buildtools.api.tests.compilation.model
77

88
import org.jetbrains.kotlin.buildtools.api.CompilerExecutionStrategyConfiguration
99
import org.jetbrains.kotlin.buildtools.api.ProjectId
10+
import org.jetbrains.kotlin.buildtools.api.jvm.ClassSnapshotGranularity
1011
import org.jetbrains.kotlin.buildtools.api.tests.BaseTest
1112
import org.jetbrains.kotlin.buildtools.api.tests.compilation.BaseCompilationTest
1213
import java.nio.file.Path
@@ -26,11 +27,20 @@ class Project(
2627
fun module(
2728
moduleName: String,
2829
dependencies: List<Module> = emptyList(),
30+
snapshotConfig: SnapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, false),
2931
additionalCompilationArguments: List<String> = emptyList(),
3032
): Module {
3133
val moduleDirectory = projectDirectory.resolve(moduleName)
3234
val sanitizedModuleName = moduleName.replace(invalidModuleNameCharactersRegex, "_")
33-
val module = JvmModule(this, sanitizedModuleName, moduleDirectory, dependencies, defaultStrategyConfig, additionalCompilationArguments)
35+
val module = JvmModule(
36+
project = this,
37+
moduleName = sanitizedModuleName,
38+
moduleDirectory = moduleDirectory,
39+
dependencies = dependencies,
40+
defaultStrategyConfig = defaultStrategyConfig,
41+
snapshotConfig = snapshotConfig,
42+
additionalCompilationArguments = additionalCompilationArguments
43+
)
3444
module.sourcesDirectory.createDirectories()
3545
val templatePath = Paths.get("src/main/resources/modules/$moduleName")
3646
assert(templatePath.isDirectory()) {
@@ -50,4 +60,4 @@ fun BaseCompilationTest.project(strategyConfig: CompilerExecutionStrategyConfigu
5060
action()
5161
endCompilationRound()
5262
}
53-
}
63+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
3+
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
4+
*/
5+
6+
package org.jetbrains.kotlin.buildtools.api.tests.compilation.model
7+
8+
import org.jetbrains.kotlin.buildtools.api.jvm.ClassSnapshotGranularity
9+
10+
/**
11+
* Configures how classpath snapshots are done for module's dependencies
12+
*/
13+
data class SnapshotConfig(
14+
val granularity: ClassSnapshotGranularity,
15+
val useInlineLambdaSnapshotting: Boolean, // TODO(KT-62555) - now has no effect
16+
)

compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/Scenario.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55

66
package org.jetbrains.kotlin.buildtools.api.tests.compilation.scenario
77

8+
import org.jetbrains.kotlin.buildtools.api.jvm.ClassSnapshotGranularity
89
import org.jetbrains.kotlin.buildtools.api.jvm.IncrementalJvmCompilationConfiguration
910
import org.jetbrains.kotlin.buildtools.api.jvm.JvmCompilationConfiguration
1011
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.Module
12+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.SnapshotConfig
1113

1214
interface Scenario {
1315
/**
@@ -19,6 +21,7 @@ interface Scenario {
1921
*
2022
* @param moduleName The name of the module.
2123
* @param dependencies (optional) The list of scenario modules that this module depends on. Defaults to an empty list.
24+
* @param snapshotInlinedClassesInDependencies (optional) Snapshotter setting to enable snapshotting inlined classes. Defaults to false.
2225
* @param additionalCompilationArguments (optional) The list of additional compilation arguments for this module. Defaults to an empty list.
2326
* @param compilationOptionsModifier (optional) A function that can be used to modify the compilation configuration for this module.
2427
* @param incrementalCompilationOptionsModifier (optional) A function that can be used to modify the incremental compilation configuration for this module.
@@ -27,6 +30,7 @@ interface Scenario {
2730
fun module(
2831
moduleName: String,
2932
dependencies: List<ScenarioModule> = emptyList(),
33+
snapshotConfig: SnapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, false),
3034
additionalCompilationArguments: List<String> = emptyList(),
3135
compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)? = null,
3236
incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)? = null,
@@ -43,6 +47,7 @@ interface Scenario {
4347
*
4448
* @param moduleName The name of the module.
4549
* @param dependencies (optional) The list of scenario modules that this module depends on. Defaults to an empty list.
50+
* @param snapshotInlinedClassesInDependencies (optional) Snapshotter setting to enable snapshotting inlined classes. Defaults to false.
4651
* @param additionalCompilationArguments (optional) The list of additional compilation arguments for this module. Defaults to an empty list.
4752
* @param compilationOptionsModifier (optional) A function that can be used to modify the compilation configuration for this module.
4853
* @param incrementalCompilationOptionsModifier (optional) A function that can be used to modify the incremental compilation configuration for this module.
@@ -51,8 +56,9 @@ interface Scenario {
5156
fun trackedModule(
5257
moduleName: String,
5358
dependencies: List<ScenarioModule> = emptyList(),
59+
snapshotConfig: SnapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, false),
5460
additionalCompilationArguments: List<String> = emptyList(),
5561
compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)? = null,
5662
incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)? = null,
5763
): ScenarioModule
58-
}
64+
}

compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/dslModuleCache.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.buildtools.api.jvm.IncrementalJvmCompilationConfigur
1010
import org.jetbrains.kotlin.buildtools.api.jvm.JvmCompilationConfiguration
1111
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.DependencyScenarioDslCacheKey
1212
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.Module
13+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.SnapshotConfig
1314
import java.nio.file.Files
1415
import java.nio.file.Path
1516
import java.util.*
@@ -20,6 +21,7 @@ import kotlin.io.path.walk
2021

2122
private data class GlobalCompiledProjectsCacheKey(
2223
val moduleKey: DependencyScenarioDslCacheKey,
24+
val snapshotConfig: SnapshotConfig,
2325
val compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?,
2426
val incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
2527
)
@@ -33,12 +35,14 @@ internal object GlobalCompiledProjectsCache {
3335
fun getProjectFromCache(
3436
module: Module,
3537
strategyConfig: CompilerExecutionStrategyConfiguration,
38+
snapshotConfig: SnapshotConfig,
3639
compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?,
3740
incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
3841
icSourceTracking: Boolean,
3942
): BaseScenarioModule? {
4043
val (initialOutputs, cachedBuildDirPath) = compiledProjectsCache[GlobalCompiledProjectsCacheKey(
4144
module.scenarioDslCacheKey,
45+
snapshotConfig,
4246
compilationOptionsModifier,
4347
incrementalCompilationOptionsModifier
4448
)] ?: return null
@@ -53,6 +57,7 @@ internal object GlobalCompiledProjectsCache {
5357
fun putProjectIntoCache(
5458
module: Module,
5559
strategyConfig: CompilerExecutionStrategyConfiguration,
60+
snapshotConfig: SnapshotConfig,
5661
compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?,
5762
incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
5863
icSourceTracking: Boolean,
@@ -72,6 +77,7 @@ internal object GlobalCompiledProjectsCache {
7277
module.buildDirectory.copyToRecursively(moduleCacheDirectory, followLinks = false, overwrite = false)
7378
compiledProjectsCache[GlobalCompiledProjectsCacheKey(
7479
module.scenarioDslCacheKey,
80+
snapshotConfig,
7581
compilationOptionsModifier,
7682
incrementalCompilationOptionsModifier
7783
)] = Pair(initialOutputs, moduleCacheDirectory)
@@ -81,4 +87,4 @@ internal object GlobalCompiledProjectsCache {
8187
ExternallyTrackedScenarioModuleImpl(module, initialOutputs, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier)
8288
}
8389
}
84-
}
90+
}

compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/scenarioDsl.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -167,29 +167,32 @@ private class ScenarioDsl(
167167
override fun module(
168168
moduleName: String,
169169
dependencies: List<ScenarioModule>,
170+
snapshotConfig: SnapshotConfig,
170171
additionalCompilationArguments: List<String>,
171172
compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?,
172173
incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
173174
): ScenarioModule {
174175
val transformedDependencies = dependencies.map { (it as BaseScenarioModule).module }
175176
val module =
176-
project.module(moduleName, transformedDependencies, additionalCompilationArguments)
177-
return GlobalCompiledProjectsCache.getProjectFromCache(module, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier, false)
178-
?: GlobalCompiledProjectsCache.putProjectIntoCache(module, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier, false)
177+
project.module(moduleName, transformedDependencies, snapshotConfig, additionalCompilationArguments)
178+
return GlobalCompiledProjectsCache.getProjectFromCache(module, strategyConfig, snapshotConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier, false)
179+
?: GlobalCompiledProjectsCache.putProjectIntoCache(module, strategyConfig, snapshotConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier, false)
179180
}
180181

182+
@Synchronized
181183
override fun trackedModule(
182184
moduleName: String,
183185
dependencies: List<ScenarioModule>,
186+
snapshotConfig: SnapshotConfig,
184187
additionalCompilationArguments: List<String>,
185188
compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?,
186189
incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
187190
): ScenarioModule {
188191
val transformedDependencies = dependencies.map { (it as BaseScenarioModule).module }
189192
val module =
190-
project.module(moduleName, transformedDependencies, additionalCompilationArguments)
191-
return GlobalCompiledProjectsCache.getProjectFromCache(module, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier, true)
192-
?: GlobalCompiledProjectsCache.putProjectIntoCache(module, strategyConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier, true)
193+
project.module(moduleName, transformedDependencies, snapshotConfig, additionalCompilationArguments)
194+
return GlobalCompiledProjectsCache.getProjectFromCache(module, strategyConfig, snapshotConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier, true)
195+
?: GlobalCompiledProjectsCache.putProjectIntoCache(module, strategyConfig, snapshotConfig, compilationOptionsModifier, incrementalCompilationOptionsModifier, true)
193196
}
194197
}
195198

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
3+
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
4+
*/
5+
6+
package org.jetbrains.kotlin.buildtools.api.tests.compilation.util
7+
8+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.assertions.assertCompiledSources
9+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.assertions.assertExactOutput
10+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.scenario.ScenarioModule
11+
12+
/**
13+
* Shorthands for commonly used scenario steps & assertions
14+
*/
15+
16+
fun ScenarioModule.compile(expectedDirtySet: Set<String>) {
17+
compile { module, scenarioModule ->
18+
assertCompiledSources(module, expectedDirtySet)
19+
}
20+
}
21+
22+
fun ScenarioModule.execute(mainClass: String, exactOutput: String) {
23+
executeCompiledCode(mainClass) {
24+
assertExactOutput(exactOutput)
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fun main(args: Array<String>) {
2+
println(callable())
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
open class SomeClass {
2+
fun call(item: BaseType) = 42
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
open class SomeClass {
2+
fun call(item: BaseType) = 42
3+
fun call(item: InheritedType) = 42 + 3
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
open class BaseType
2+
3+
class InheritedType : BaseType()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
inline fun callable(): Int {
2+
val obj = object : SomeClass() {
3+
fun compute() = call(InheritedType())
4+
}
5+
return obj.compute()
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
val result = callable()
2+
3+
fun main(args: Array<String>) {
4+
println(result)
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
interface BaseType {
2+
fun compute(): Int
3+
fun extraCompute(): Int = 2
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
interface BaseType {
2+
fun compute(): Int
3+
fun extraCompute(): Int = 2 + 3
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
inline fun callable(): Int {
2+
val obj = object : BaseType {
3+
override fun compute(): Int {
4+
return 40 + extraCompute()
5+
}
6+
}
7+
return obj.compute()
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
val result = inlinedA(::inlinedB)
2+
3+
fun main(args: Array<String>) {
4+
println(result)
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
inline fun inlinedA(crossinline block: () -> Int): Int {
2+
return block()
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
inline fun inlinedB(): Int {
2+
val lambda = {
3+
40 + 2
4+
}
5+
return lambda()
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
inline fun inlinedB(): Int {
2+
val lambda = {
3+
40 + 2 + 3
4+
}
5+
return lambda()
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
val result = value
2+
3+
fun main(args: Array<String>) {
4+
println(result)
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
val value: Int
2+
inline get() {
3+
val lambda = {
4+
40 + 2
5+
}
6+
return lambda()
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
val value: Int
2+
inline get() {
3+
val lambda = {
4+
40 + 2 + 3
5+
}
6+
return lambda()
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.example.ictest
2+
3+
val result = calculate()
4+
5+
fun main(args: Array<String>) {
6+
println(result)
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.example.ictest
2+
3+
inline fun calculate(): Int {
4+
val callable = {
5+
40 + 2
6+
}
7+
return callable()
8+
}

compiler/build-tools/kotlin-build-tools-api-tests/src/main/resources/modules/ic-scenarios/jvm-inline-lib/inlinedLambda.kt.changeFunctionBody renamed to compiler/build-tools/kotlin-build-tools-api-tests/src/main/resources/modules/ic-scenarios/inline-local-class/lambda-body-change/lib/com/example/ictest/inlinedLambda.kt.changeFunctionBody

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
package com.example.ictest
2+
13
inline fun calculate(): Int {
24
val callable = {
35
40 + 2 + 3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.example.ictest
2+
3+
inline fun calculate(): Int {
4+
val callable = {
5+
40 + 2 + 3
6+
}
7+
return callable()
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
inline fun calculate(): Int {
2+
val outer = {
3+
val inner = {
4+
40 + 2
5+
}
6+
inner()
7+
}
8+
return outer()
9+
}

0 commit comments

Comments
 (0)