Skip to content

Commit f025799

Browse files
mazhukinevgeniySpace Team
authored and
Space Team
committed
[IC] Additional test cases for inline function snapshotting
Three-module variant, named inner class variant ^KT-75883 ^KT-75529
1 parent 58df05e commit f025799

File tree

11 files changed

+144
-26
lines changed

11 files changed

+144
-26
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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.jvm.ClassSnapshotGranularity
9+
import org.jetbrains.kotlin.buildtools.api.jvm.ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration
10+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.SnapshotConfig
11+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.scenario.Scenario
12+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.scenario.ScenarioModule
13+
14+
15+
fun Scenario.moduleWithInlineSnapshotting(
16+
moduleName: String,
17+
dependencies: List<ScenarioModule>,
18+
) = module(
19+
moduleName = moduleName,
20+
dependencies = dependencies,
21+
snapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, true),
22+
)
23+
24+
fun Scenario.moduleWithFir(
25+
moduleName: String,
26+
additionalCompilerArguments: List<String> = emptyList()
27+
) = module(
28+
moduleName = moduleName,
29+
additionalCompilationArguments = additionalCompilerArguments + listOf("-Xuse-fir-ic"),
30+
incrementalCompilationOptionsModifier = { incrementalOptions ->
31+
(incrementalOptions as ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration).useFirRunner(true)
32+
}
33+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fun main() {
2+
println(bar1())
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
inline fun bar1(): String {
2+
return bar2()
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
inline fun bar2(): String {
2+
val callable = { "bar2 v1" }
3+
return callable()
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
inline fun bar2(): String {
2+
val callable = { "bar2 v2" }
3+
return callable()
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
fun main() {
2+
val inner = OuterClass.InnerClass()
3+
println(inner.calculate())
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class OuterClass {
2+
class InnerClass {
3+
inline fun calculate(): Int {
4+
val impl = { 42 }
5+
return impl()
6+
}
7+
}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class OuterClass {
2+
class InnerClass {
3+
inline fun calculate(): Int {
4+
val impl = { 42 + 3 }
5+
return impl()
6+
}
7+
}
8+
}

compiler/build-tools/kotlin-build-tools-api-tests/src/testCrossModuleIncrementalChanges/kotlin/AnonymousInheritorTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.SnapshotConfi
1212
import org.jetbrains.kotlin.buildtools.api.tests.compilation.scenario.scenario
1313
import org.jetbrains.kotlin.buildtools.api.tests.compilation.util.compile
1414
import org.jetbrains.kotlin.buildtools.api.tests.compilation.util.execute
15+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.util.moduleWithInlineSnapshotting
1516
import org.jetbrains.kotlin.test.TestMetadata
1617
import org.junit.jupiter.api.DisplayName
1718

@@ -26,10 +27,9 @@ class AnonymousInheritorTest : BaseCompilationTest() {
2627
fun testAnonymousObjectBaseTypeChangeWithOverloads(strategyConfig: CompilerExecutionStrategyConfiguration) {
2728
scenario(strategyConfig) {
2829
val lib = module("ic-scenarios/inline-local-class/inline-anonymous-object-evil/lib")
29-
val app = module(
30+
val app = moduleWithInlineSnapshotting(
3031
"ic-scenarios/inline-local-class/inline-anonymous-object-evil/app",
3132
dependencies = listOf(lib),
32-
snapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, true),
3333
)
3434

3535
lib.changeFile("callable.kt") { it.replace("inline fun", "fun") }

compiler/build-tools/kotlin-build-tools-api-tests/src/testCrossModuleIncrementalChanges/kotlin/InlinedLambdaChangeTest.kt

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@
55
package org.jetbrains.kotlin.buildtools.api.tests.compilation
66

77
import org.jetbrains.kotlin.buildtools.api.CompilerExecutionStrategyConfiguration
8-
import org.jetbrains.kotlin.buildtools.api.jvm.ClassSnapshotGranularity
98
import org.jetbrains.kotlin.buildtools.api.tests.compilation.assertions.assertLogContainsPatterns
109
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.DefaultStrategyAgnosticCompilationTest
1110
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.LogLevel
12-
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.SnapshotConfig
1311
import org.jetbrains.kotlin.buildtools.api.tests.compilation.scenario.scenario
1412
import org.jetbrains.kotlin.buildtools.api.tests.compilation.util.compile
1513
import org.jetbrains.kotlin.buildtools.api.tests.compilation.util.execute
14+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.util.moduleWithInlineSnapshotting
1615
import org.jetbrains.kotlin.test.TestMetadata
1716
import org.junit.jupiter.api.Disabled
1817
import org.junit.jupiter.api.DisplayName
@@ -27,10 +26,9 @@ class InlinedLambdaChangeTest : BaseCompilationTest() {
2726
fun testMainCase(strategyConfig: CompilerExecutionStrategyConfiguration) {
2827
scenario(strategyConfig) {
2928
val lib = module("ic-scenarios/inline-local-class/lambda-body-change/lib")
30-
val app = module(
29+
val app = moduleWithInlineSnapshotting(
3130
"ic-scenarios/inline-local-class/lambda-body-change/app",
3231
dependencies = listOf(lib),
33-
snapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, true),
3432
)
3533

3634
app.execute(mainClass = "com.example.ictest.CallSiteKt", exactOutput = INITIAL_OUTPUT)
@@ -72,10 +70,9 @@ class InlinedLambdaChangeTest : BaseCompilationTest() {
7270
fun testLocalClassInLocal(strategyConfig: CompilerExecutionStrategyConfiguration) {
7371
scenario(strategyConfig) {
7472
val lib = module("ic-scenarios/inline-local-class/local-in-local/lib")
75-
val app = module(
73+
val app = moduleWithInlineSnapshotting(
7674
"ic-scenarios/inline-local-class/local-in-local/app",
7775
dependencies = listOf(lib),
78-
snapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, true),
7976
)
8077

8178
app.execute(mainClass = "CallSiteKt", exactOutput = INITIAL_OUTPUT)
@@ -101,10 +98,9 @@ class InlinedLambdaChangeTest : BaseCompilationTest() {
10198
*/
10299
scenario(strategyConfig) {
103100
val lib = module("ic-scenarios/inline-local-class/local-uses-local-deduplication/lib")
104-
val app = module(
101+
val app = moduleWithInlineSnapshotting(
105102
"ic-scenarios/inline-local-class/local-uses-local-deduplication/app",
106103
dependencies = listOf(lib),
107-
snapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, true),
108104
)
109105

110106
app.execute(mainClass = "CallSiteKt", exactOutput = INITIAL_OUTPUT)
@@ -124,10 +120,9 @@ class InlinedLambdaChangeTest : BaseCompilationTest() {
124120
// same as [testInlinedClassDeduplication]
125121
scenario(strategyConfig) {
126122
val lib = module("ic-scenarios/inline-local-class/local-uses-local-deduplication-v2/lib")
127-
val app = module(
123+
val app = moduleWithInlineSnapshotting(
128124
"ic-scenarios/inline-local-class/local-uses-local-deduplication-v2/app",
129125
dependencies = listOf(lib),
130-
snapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, true),
131126
)
132127

133128
app.execute(mainClass = "CallSiteKt", exactOutput = INITIAL_OUTPUT)
@@ -146,10 +141,9 @@ class InlinedLambdaChangeTest : BaseCompilationTest() {
146141
fun testLocalNamedClass(strategyConfig: CompilerExecutionStrategyConfiguration) {
147142
scenario(strategyConfig) {
148143
val lib = module("ic-scenarios/inline-local-class/local-named/lib")
149-
val app = module(
144+
val app = moduleWithInlineSnapshotting(
150145
"ic-scenarios/inline-local-class/local-named/app",
151146
dependencies = listOf(lib),
152-
snapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, true),
153147
)
154148
lib.replaceFileWithVersion("inlinedLocalClass.kt", "addNamedClass")
155149
lib.compile { module, scenarioModule ->
@@ -166,10 +160,9 @@ class InlinedLambdaChangeTest : BaseCompilationTest() {
166160
fun testNoRecompilationNeeded(strategyConfig: CompilerExecutionStrategyConfiguration) {
167161
scenario(strategyConfig) {
168162
val lib = module("ic-scenarios/inline-local-class/no-recompile/lib")
169-
val app = module(
163+
val app = moduleWithInlineSnapshotting(
170164
"ic-scenarios/inline-local-class/no-recompile/app",
171165
dependencies = listOf(lib),
172-
snapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, true),
173166
)
174167

175168
app.execute(mainClass = "CallSiteKt", exactOutput = INITIAL_OUTPUT)
@@ -188,10 +181,9 @@ class InlinedLambdaChangeTest : BaseCompilationTest() {
188181
fun testNestedInlineFunctions(strategyConfig: CompilerExecutionStrategyConfiguration) {
189182
scenario(strategyConfig) {
190183
val lib = module("ic-scenarios/inline-local-class/nested-inline/lib")
191-
val app = module(
184+
val app = moduleWithInlineSnapshotting(
192185
"ic-scenarios/inline-local-class/nested-inline/app",
193186
dependencies = listOf(lib),
194-
snapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, true),
195187
)
196188

197189
app.execute(mainClass = "CallSiteKt", exactOutput = INITIAL_OUTPUT)
@@ -213,10 +205,9 @@ class InlinedLambdaChangeTest : BaseCompilationTest() {
213205
fun testInlineProperty(strategyConfig: CompilerExecutionStrategyConfiguration) {
214206
scenario(strategyConfig) {
215207
val lib = module("ic-scenarios/inline-local-class/inline-property/lib")
216-
val app = module(
208+
val app = moduleWithInlineSnapshotting(
217209
"ic-scenarios/inline-local-class/inline-property/app",
218210
dependencies = listOf(lib),
219-
snapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, true),
220211
)
221212

222213
app.execute(mainClass = "CallSiteKt", exactOutput = INITIAL_OUTPUT)
@@ -235,10 +226,9 @@ class InlinedLambdaChangeTest : BaseCompilationTest() {
235226
fun testMultipleUnusedLambdas(strategyConfig: CompilerExecutionStrategyConfiguration) {
236227
scenario(strategyConfig) {
237228
val lib = module("ic-scenarios/inline-local-class/no-recompile-lambdas/lib")
238-
val app = module(
229+
val app = moduleWithInlineSnapshotting(
239230
"ic-scenarios/inline-local-class/no-recompile-lambdas/app",
240231
dependencies = listOf(lib),
241-
snapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, true),
242232
)
243233

244234
app.execute(mainClass = "CallSiteKt", exactOutput = INITIAL_OUTPUT)
@@ -257,10 +247,9 @@ class InlinedLambdaChangeTest : BaseCompilationTest() {
257247
fun testCrossInlineLambdaChange(strategyConfig: CompilerExecutionStrategyConfiguration) {
258248
scenario(strategyConfig) {
259249
val lib = module("ic-scenarios/inline-local-class/inline-crossinline/lib")
260-
val app = module(
250+
val app = moduleWithInlineSnapshotting(
261251
"ic-scenarios/inline-local-class/inline-crossinline/app",
262252
dependencies = listOf(lib),
263-
snapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, true),
264253
)
265254

266255
app.execute(mainClass = "CallSiteKt", exactOutput = INITIAL_OUTPUT)
@@ -302,10 +291,9 @@ class InlinedLambdaChangeTest : BaseCompilationTest() {
302291
fun testAnonymousObjectBaseTypeChangeWithOverloads(strategyConfig: CompilerExecutionStrategyConfiguration) {
303292
scenario(strategyConfig) {
304293
val lib = module("ic-scenarios/inline-local-class/inline-anonymous-object-evil/lib")
305-
val app = module(
294+
val app = moduleWithInlineSnapshotting(
306295
"ic-scenarios/inline-local-class/inline-anonymous-object-evil/app",
307296
dependencies = listOf(lib),
308-
snapshotConfig = SnapshotConfig(ClassSnapshotGranularity.CLASS_MEMBER_LEVEL, true),
309297
)
310298

311299
app.execute(mainClass = "CallSiteKt", exactOutput = INITIAL_OUTPUT)
@@ -318,6 +306,27 @@ class InlinedLambdaChangeTest : BaseCompilationTest() {
318306
}
319307
}
320308

309+
@DefaultStrategyAgnosticCompilationTest
310+
@DisplayName("Changes in inline function inside named inner class")
311+
@TestMetadata("ic-scenarios/inline-named-inner/lib")
312+
fun testNamedInnerClassWithInlineFunction(strategyConfig: CompilerExecutionStrategyConfiguration) {
313+
scenario(strategyConfig) {
314+
val lib = module("ic-scenarios/inline-named-inner/lib")
315+
val app = moduleWithInlineSnapshotting(
316+
"ic-scenarios/inline-named-inner/app",
317+
dependencies = listOf(lib),
318+
)
319+
320+
app.execute(mainClass = "CallSiteKt", exactOutput = INITIAL_OUTPUT)
321+
322+
lib.replaceFileWithVersion("inlinedInnerClass.kt", "modified")
323+
324+
lib.compile(expectedDirtySet = setOf("inlinedInnerClass.kt"))
325+
app.compile(expectedDirtySet = setOf("callSite.kt"))
326+
app.execute(mainClass = "CallSiteKt", exactOutput = WITH_NEW_LAMBDA_BODY)
327+
}
328+
}
329+
321330
private companion object {
322331
const val INITIAL_OUTPUT = "42"
323332
const val WITH_NEW_LAMBDA_BODY = "45"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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
7+
8+
import org.jetbrains.kotlin.buildtools.api.CompilerExecutionStrategyConfiguration
9+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.DefaultStrategyAgnosticCompilationTest
10+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.scenario.scenario
11+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.util.execute
12+
import org.jetbrains.kotlin.buildtools.api.tests.compilation.util.moduleWithInlineSnapshotting
13+
import org.jetbrains.kotlin.test.TestMetadata
14+
import org.junit.jupiter.api.DisplayName
15+
16+
class InlinedLambdaDoubleInliningTest : BaseCompilationTest() {
17+
18+
@DefaultStrategyAgnosticCompilationTest
19+
@DisplayName("Double inlining test with app->lib1->lib2 structure")
20+
@TestMetadata("ic-scenarios/inline-double-inlining/app")
21+
fun testDoubleInlining(strategyConfig: CompilerExecutionStrategyConfiguration) {
22+
scenario(strategyConfig) {
23+
val lib2 = module("ic-scenarios/inline-double-inlining/lib2")
24+
val lib1 = moduleWithInlineSnapshotting(
25+
"ic-scenarios/inline-double-inlining/lib1",
26+
dependencies = listOf(lib2)
27+
)
28+
val app = moduleWithInlineSnapshotting(
29+
"ic-scenarios/inline-double-inlining/app",
30+
dependencies = listOf(lib1)
31+
)
32+
33+
app.execute(mainClass = "AppKt", exactOutput = "bar2 v1")
34+
35+
lib2.replaceFileWithVersion("lib2.kt", "changeLambdaBody")
36+
lib2.compile()
37+
lib1.compile()
38+
app.compile()
39+
app.execute(mainClass = "AppKt", exactOutput = "bar2 v2")
40+
}
41+
}
42+
}

0 commit comments

Comments
 (0)