Don't try to transform sam wrappers in same module

#KT-22304 Fixed
This commit is contained in:
Mikhael Bogdanov
2018-03-07 12:34:45 +01:00
parent 2a6f1d7731
commit c1c8660e55
15 changed files with 110 additions and 7 deletions
@@ -55,6 +55,7 @@ public class SamWrapperCodegen {
private final SamType samType;
private final MemberCodegen<?> parentCodegen;
private final int visibility;
public static final String SAM_WRAPPER_SUFFIX = "$0";
public SamWrapperCodegen(
@NotNull GenerationState state,
@@ -206,7 +207,7 @@ public class SamWrapperCodegen {
}
String shortName = String.format(
"%s$sam%s$%s$0",
"%s$sam%s$%s" + SAM_WRAPPER_SUFFIX,
outermostOwner.shortName().asString(),
(isInsideInline ? "$i" : ""),
DescriptorUtils.getFqNameSafe(samType.getJavaClassDescriptor()).asString().replace('.', '_')
@@ -185,7 +185,7 @@ class MethodInliner(
}
override fun anew(type: Type) {
if (isOldSamWrapper(type.internalName) || isAnonymousClass(type.internalName)) {
if (isSamWrapper(type.internalName) || isAnonymousClass(type.internalName)) {
handleAnonymousObjectRegeneration()
}
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.codegen.BaseExpressionCodegen
import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.codegen.JvmCodegenUtil
import org.jetbrains.kotlin.codegen.SamWrapperCodegen.SAM_WRAPPER_SUFFIX
import org.jetbrains.kotlin.codegen.`when`.WhenByEnumsMapping
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
import org.jetbrains.kotlin.codegen.context.CodegenContext
@@ -226,14 +227,18 @@ internal fun isAnonymousSingletonLoad(internalName: String, fieldName: String):
* hash
* );
*/
internal fun isOldSamWrapper(internalName: String) =
internalName.contains("\$sam$") && internalName.substringAfter("\$i$", "").run { length == 8 && toLongOrNull(16) != null }
private fun isOldSamWrapper(internalName: String) =
internalName.contains("\$sam$") && internalName.substringAfter("\$i$", "").run { length == 8 && toLongOrNull(16) != null }
internal fun isSamWrapper(internalName: String) =
(internalName.endsWith(SAM_WRAPPER_SUFFIX) && internalName.contains("\$sam\$i\$")) || isOldSamWrapper(internalName)
internal fun isSamWrapperConstructorCall(internalName: String, methodName: String) =
isConstructor(methodName) && isOldSamWrapper(internalName)
isConstructor(methodName) && isSamWrapper(internalName)
internal fun isAnonymousClass(internalName: String) =
!isOldSamWrapper(internalName) &&
!isSamWrapper(internalName) &&
internalName.substringAfterLast('/').substringAfterLast("$", "").isInteger()
fun wrapWithMaxLocalCalc(methodNode: MethodNode) =
+5
View File
@@ -0,0 +1,5 @@
$TESTDATA_DIR$/kt22304_1.kt
$TESTDATA_DIR$/kt22304_2.kt
$TESTDATA_DIR$/kt22304_3.kt
-d
$TEMP_DIR$
+1
View File
@@ -0,0 +1 @@
OK
+11
View File
@@ -0,0 +1,11 @@
package test
import java.util.concurrent.Callable
fun test(): String = ""
inline fun String.switchMapOnce(crossinline mapper: (String) -> String): String {
Callable(::test)
return { mapper(this) }()
}
+12
View File
@@ -0,0 +1,12 @@
package beforeTest //package name should be less than imported one
import test.*
fun main(args: Array<String>) {
"O".switchMapOnce {
"K".switchMapOnce {
"OK"
}
}
}
+12
View File
@@ -0,0 +1,12 @@
package ttest //package name should be more than imported one
import test.*
fun foo(): String {
return "O".switchMapOnce {
"K".switchMapOnce {
"OK"
}
}
}
@@ -0,0 +1,26 @@
// FILE: 1.kt
// FULL_JDK
package test
import java.util.concurrent.Callable
fun test(): String = ""
inline fun String.switchMapOnce(crossinline mapper: (String) -> String): String {
Callable(::test)
return { mapper(this) }()
}
// FILE: 2.kt
import test.*
fun box() : String {
return "O".switchMapOnce {
"K".switchMapOnce {
"OK"
}
}
}
@@ -16,7 +16,7 @@ import test.*
fun box(): String {
val anotherModule = doWork { "K" }
if (anotherModule.javaClass.name != "BKt\$box$\$inlined\$doWork$1") return "class should be regenerated, but ${anotherModule.javaClass.name}"
if (anotherModule.javaClass.name != "BKt\$inlined\$sam\$i\$java_util_concurrent_Callable\$0") return "class should be regenerated, but ${anotherModule.javaClass.name}"
return "OK"
}
@@ -482,6 +482,12 @@ public class IrBlackBoxInlineCodegenTestGenerated extends AbstractIrBlackBoxInli
doTest(fileName);
}
@TestMetadata("kt22304.kt")
public void testKt22304() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/sam/kt22304.kt");
doTest(fileName);
}
@TestMetadata("samOnCallSite.kt")
public void testSamOnCallSite() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/sam/samOnCallSite.kt");
@@ -482,6 +482,12 @@ public class IrCompileKotlinAgainstInlineKotlinTestGenerated extends AbstractIrC
doTest(fileName);
}
@TestMetadata("kt22304.kt")
public void testKt22304() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/sam/kt22304.kt");
doTest(fileName);
}
@TestMetadata("samOnCallSite.kt")
public void testSamOnCallSite() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/sam/samOnCallSite.kt");
@@ -387,6 +387,12 @@ public class CliTestGenerated extends AbstractCliTest {
doJvmTest(fileName);
}
@TestMetadata("kt22304.args")
public void testKt22304() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/jvm/kt22304.args");
doJvmTest(fileName);
}
@TestMetadata("languageVersion.args")
public void testLanguageVersion() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/jvm/languageVersion.args");
@@ -482,6 +482,12 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo
doTest(fileName);
}
@TestMetadata("kt22304.kt")
public void testKt22304() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/sam/kt22304.kt");
doTest(fileName);
}
@TestMetadata("samOnCallSite.kt")
public void testSamOnCallSite() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/sam/samOnCallSite.kt");
@@ -482,6 +482,12 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi
doTest(fileName);
}
@TestMetadata("kt22304.kt")
public void testKt22304() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/sam/kt22304.kt");
doTest(fileName);
}
@TestMetadata("samOnCallSite.kt")
public void testSamOnCallSite() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/sam/samOnCallSite.kt");