From bc207ed8dbd584d5cc131d60fa9c85827340fde9 Mon Sep 17 00:00:00 2001 From: Kevin Bierhoff Date: Mon, 26 Aug 2019 12:43:26 -0700 Subject: [PATCH] fix for KT-29471 #KT-29471 Fixed --- .../jetbrains/kotlin/jvm/abi/asm/AbiClassBuilder.kt | 11 +++++++---- .../jvm/abi/CompileAgainstJvmAbiTestGenerated.java | 5 +++++ .../compile/inlineAnonymousObject/app/app.kt | 13 +++++++++++++ .../compile/inlineAnonymousObject/lib/lib.kt | 11 +++++++++++ 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 plugins/jvm-abi-gen/testData/compile/inlineAnonymousObject/app/app.kt create mode 100644 plugins/jvm-abi-gen/testData/compile/inlineAnonymousObject/lib/lib.kt diff --git a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/asm/AbiClassBuilder.kt b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/asm/AbiClassBuilder.kt index 3be500ac70e..67d4cf8677d 100644 --- a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/asm/AbiClassBuilder.kt +++ b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/asm/AbiClassBuilder.kt @@ -7,11 +7,14 @@ package org.jetbrains.kotlin.jvm.abi.asm import com.intellij.psi.PsiElement import org.jetbrains.kotlin.codegen.AbstractClassBuilder -import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.MemberDescriptor import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.resolve.inline.InlineUtil.isInlineOrContainingInline import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin -import org.jetbrains.org.objectweb.asm.* +import org.jetbrains.org.objectweb.asm.ClassVisitor +import org.jetbrains.org.objectweb.asm.FieldVisitor +import org.jetbrains.org.objectweb.asm.MethodVisitor +import org.jetbrains.org.objectweb.asm.Opcodes internal class AbiClassBuilder(private val cv: ClassVisitor) : AbstractClassBuilder() { override fun getVisitor(): ClassVisitor = cv @@ -35,7 +38,7 @@ internal class AbiClassBuilder(private val cv: ClassVisitor) : AbstractClassBuil val mv = super.newMethod(origin, access, name, desc, signature, exceptions) // inline function bodies are part of ABI, // but non-inline functions can be thrown out - if (descriptor is FunctionDescriptor && descriptor.isInline) return mv + if (isInlineOrContainingInline(descriptor)) return mv return ReplaceWithEmptyMethodVisitor( delegate = mv, @@ -55,7 +58,7 @@ internal class AbiClassBuilder(private val cv: ClassVisitor) : AbstractClassBuil signature: String?, value: Any? ): FieldVisitor { - if (isPrivate(access)) return EMPTY_FIELD_VISITOR + if (isPrivate(access) && !isInlineOrContainingInline(origin.descriptor)) return EMPTY_FIELD_VISITOR return super.newField(origin, access, name, desc, signature, value) } diff --git a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java index a41dcb0958b..93a5cd363ff 100644 --- a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java +++ b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java @@ -44,6 +44,11 @@ public class CompileAgainstJvmAbiTestGenerated extends AbstractCompileAgainstJvm runTest("plugins/jvm-abi-gen/testData/compile/clinit/"); } + @TestMetadata("inlineReifiedFunction") + public void testInlineAnonymousObject() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/inlineAnonymousObject/"); + } + @TestMetadata("inlineReifiedFunction") public void testInlineReifiedFunction() throws Exception { runTest("plugins/jvm-abi-gen/testData/compile/inlineReifiedFunction/"); diff --git a/plugins/jvm-abi-gen/testData/compile/inlineAnonymousObject/app/app.kt b/plugins/jvm-abi-gen/testData/compile/inlineAnonymousObject/app/app.kt new file mode 100644 index 00000000000..b392da6485d --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/inlineAnonymousObject/app/app.kt @@ -0,0 +1,13 @@ +package app + +import lib.* + +fun runAppAndReturnOk(): String { + val a = lib.getCounter { 100 } + val x = a.getInt() + if (x != 100) error("a returned $x but expected '100'") + val y = a.getInt() + if (y != 101) error("a returned $y but expected '101'") + + return "OK" +} diff --git a/plugins/jvm-abi-gen/testData/compile/inlineAnonymousObject/lib/lib.kt b/plugins/jvm-abi-gen/testData/compile/inlineAnonymousObject/lib/lib.kt new file mode 100644 index 00000000000..70413b3fee0 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/inlineAnonymousObject/lib/lib.kt @@ -0,0 +1,11 @@ +package lib + +interface Interface { + fun getInt(): Int +} + +inline fun getCounter(crossinline init: () -> Int): Interface = + object : Interface { + var value = init() + override fun getInt(): Int = value++ + }