diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index 39d351ef187..cc0655f9657 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -39,7 +39,6 @@ import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.load.java.JavaVisibilities; import org.jetbrains.kotlin.load.java.JvmAnnotationNames; import org.jetbrains.kotlin.name.FqName; -import org.jetbrains.kotlin.platform.JavaToKotlinClassMap; import org.jetbrains.kotlin.resolve.DeprecationUtilKt; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.annotations.AnnotationUtilKt; @@ -269,7 +268,7 @@ public class AsmUtil { } public static int getVisibilityAccessFlagForAnonymous(@NotNull ClassDescriptor descriptor) { - return InlineUtil.isInline(descriptor.getContainingDeclaration()) ? ACC_PUBLIC : NO_FLAG_PACKAGE_PRIVATE; + return InlineUtil.isInlineOrContainingInline(descriptor.getContainingDeclaration()) ? ACC_PUBLIC : NO_FLAG_PACKAGE_PRIVATE; } public static int calculateInnerClassAccessFlags(@NotNull ClassDescriptor innerClass) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineUtil.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineUtil.java index 2cb7260914c..246a08b58c6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineUtil.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineUtil.java @@ -42,6 +42,12 @@ public class InlineUtil { return descriptor instanceof SimpleFunctionDescriptor && getInlineStrategy(descriptor).isInline(); } + public static boolean isInlineOrContainingInline(@Nullable DeclarationDescriptor descriptor) { + if (isInline(descriptor)) return true; + if (descriptor == null) return false; + return isInlineOrContainingInline(descriptor.getContainingDeclaration()); + } + @NotNull public static InlineStrategy getInlineStrategy(@NotNull DeclarationDescriptor descriptor) { if (descriptor instanceof FunctionDescriptor && diff --git a/compiler/testData/codegen/boxInline/innerClasses/innerLambda.1.kt b/compiler/testData/codegen/boxInline/innerClasses/innerLambda.1.kt new file mode 100644 index 00000000000..70f6d45efd0 --- /dev/null +++ b/compiler/testData/codegen/boxInline/innerClasses/innerLambda.1.kt @@ -0,0 +1,10 @@ +import test.* + +fun box(): String { + val x1 = foo1()() + if (x1 != "OK") return "fail 1: $x1" + + foo2()().run() + + return test.sideEffects +} diff --git a/compiler/testData/codegen/boxInline/innerClasses/innerLambda.2.kt b/compiler/testData/codegen/boxInline/innerClasses/innerLambda.2.kt new file mode 100644 index 00000000000..a09d3eb796f --- /dev/null +++ b/compiler/testData/codegen/boxInline/innerClasses/innerLambda.2.kt @@ -0,0 +1,17 @@ +package test + +inline fun foo1() = run { + { + "OK" + } +} + +var sideEffects = "fail" + +inline fun foo2() = run { + { + Runnable { + sideEffects = "OK" + } + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java index 5cb566b854d..9cb2b38a74f 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java @@ -643,6 +643,12 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/innerClasses"), Pattern.compile("^(.+)\\.1.kt$"), true); } + @TestMetadata("innerLambda.1.kt") + public void testInnerLambda() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/innerClasses/innerLambda.1.kt"); + doTestMultiFileWithInlineCheck(fileName); + } + @TestMetadata("kt10259.1.kt") public void testKt10259() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/innerClasses/kt10259.1.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java index b21ddf44036..276ec6c48ec 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java @@ -643,6 +643,12 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/innerClasses"), Pattern.compile("^(.+)\\.1.kt$"), true); } + @TestMetadata("innerLambda.1.kt") + public void testInnerLambda() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/innerClasses/innerLambda.1.kt"); + doBoxTestWithInlineCheck(fileName); + } + @TestMetadata("kt10259.1.kt") public void testKt10259() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/innerClasses/kt10259.1.kt");