From 4520e02baee9ff4f7c1a984cbf9c8d0607b128f3 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 12 May 2020 20:35:26 +0200 Subject: [PATCH] Support fun interfaces in kotlinx-metadata #KT-37421 Fixed --- .../loadCompiledKotlin/class/FunInterface.txt | 4 ++++ .../kotlin/fir/FirLoadCompiledKotlinGenerated.java | 5 +++++ .../loadJava/compiledKotlin/class/FunInterface.kt | 5 +++++ .../loadJava/compiledKotlin/class/FunInterface.txt | 5 +++++ .../kotlin/jvm/compiler/LoadJavaTestGenerated.java | 5 +++++ .../LoadKotlinWithTypeTableTestGenerated.java | 5 +++++ .../jvm/compiler/ir/IrLoadJavaTestGenerated.java | 5 +++++ .../javac/LoadJavaUsingJavacTestGenerated.java | 5 +++++ .../JvmRuntimeDescriptorLoaderTestGenerated.java | 5 +++++ libraries/kotlinx-metadata/jvm/ChangeLog.md | 5 +++++ .../kotlinx-metadata/src/kotlinx/metadata/Flag.kt | 6 ++++++ .../src/org/jetbrains/kotlin/kotlinp/printers.kt | 1 + .../kotlin/kotlinp/test/GenerateKotlinpTests.kt | 2 +- .../kotlin/kotlinp/test/KotlinpTestGenerated.java | 5 +++++ libraries/tools/kotlinp/testData/FunInterface.kt | 3 +++ libraries/tools/kotlinp/testData/FunInterface.txt | 13 +++++++++++++ 16 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/FunInterface.txt create mode 100644 compiler/testData/loadJava/compiledKotlin/class/FunInterface.kt create mode 100644 compiler/testData/loadJava/compiledKotlin/class/FunInterface.txt create mode 100644 libraries/tools/kotlinp/testData/FunInterface.kt create mode 100644 libraries/tools/kotlinp/testData/FunInterface.txt diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/FunInterface.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/FunInterface.txt new file mode 100644 index 00000000000..681b34f4ff5 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/FunInterface.txt @@ -0,0 +1,4 @@ +public abstract interface F : R|kotlin/Any| { + public abstract fun R|kotlin/String|.f(x: R|kotlin/Int|): R|kotlin/Unit| + +} diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirLoadCompiledKotlinGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirLoadCompiledKotlinGenerated.java index cef4693e74b..eeaeba1fee0 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirLoadCompiledKotlinGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirLoadCompiledKotlinGenerated.java @@ -604,6 +604,11 @@ public class FirLoadCompiledKotlinGenerated extends AbstractFirLoadCompiledKotli runTest("compiler/testData/loadJava/compiledKotlin/class/EnumWithPrimitiveConstructorParameter.kt"); } + @TestMetadata("FunInterface.kt") + public void testFunInterface() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlin/class/FunInterface.kt"); + } + @TestMetadata("InheritClassSimple.kt") public void testInheritClassSimple() throws Exception { runTest("compiler/testData/loadJava/compiledKotlin/class/InheritClassSimple.kt"); diff --git a/compiler/testData/loadJava/compiledKotlin/class/FunInterface.kt b/compiler/testData/loadJava/compiledKotlin/class/FunInterface.kt new file mode 100644 index 00000000000..85b7643966d --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/class/FunInterface.kt @@ -0,0 +1,5 @@ +package test + +fun interface F { + fun String.f(x: Int) +} diff --git a/compiler/testData/loadJava/compiledKotlin/class/FunInterface.txt b/compiler/testData/loadJava/compiledKotlin/class/FunInterface.txt new file mode 100644 index 00000000000..120346bb56a --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/class/FunInterface.txt @@ -0,0 +1,5 @@ +package test + +public fun interface F { + public abstract fun kotlin.String.f(/*0*/ x: kotlin.Int): kotlin.Unit +} diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java index 349d3bbb710..c4a87ef1743 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java @@ -2295,6 +2295,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { runTest("compiler/testData/loadJava/compiledKotlin/class/EnumWithPrimitiveConstructorParameter.kt"); } + @TestMetadata("FunInterface.kt") + public void testFunInterface() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlin/class/FunInterface.kt"); + } + @TestMetadata("InheritClassSimple.kt") public void testInheritClassSimple() throws Exception { runTest("compiler/testData/loadJava/compiledKotlin/class/InheritClassSimple.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java index c9af9090b21..04bc17a7b63 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java @@ -604,6 +604,11 @@ public class LoadKotlinWithTypeTableTestGenerated extends AbstractLoadKotlinWith runTest("compiler/testData/loadJava/compiledKotlin/class/EnumWithPrimitiveConstructorParameter.kt"); } + @TestMetadata("FunInterface.kt") + public void testFunInterface() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlin/class/FunInterface.kt"); + } + @TestMetadata("InheritClassSimple.kt") public void testInheritClassSimple() throws Exception { runTest("compiler/testData/loadJava/compiledKotlin/class/InheritClassSimple.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java index f8644b78cf9..afbe65a5b1e 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java @@ -2296,6 +2296,11 @@ public class IrLoadJavaTestGenerated extends AbstractIrLoadJavaTest { runTest("compiler/testData/loadJava/compiledKotlin/class/EnumWithPrimitiveConstructorParameter.kt"); } + @TestMetadata("FunInterface.kt") + public void testFunInterface() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlin/class/FunInterface.kt"); + } + @TestMetadata("InheritClassSimple.kt") public void testInheritClassSimple() throws Exception { runTest("compiler/testData/loadJava/compiledKotlin/class/InheritClassSimple.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java index 9598c70c713..1bc34872dfd 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java @@ -2295,6 +2295,11 @@ public class LoadJavaUsingJavacTestGenerated extends AbstractLoadJavaUsingJavacT runTest("compiler/testData/loadJava/compiledKotlin/class/EnumWithPrimitiveConstructorParameter.kt"); } + @TestMetadata("FunInterface.kt") + public void testFunInterface() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlin/class/FunInterface.kt"); + } + @TestMetadata("InheritClassSimple.kt") public void testInheritClassSimple() throws Exception { runTest("compiler/testData/loadJava/compiledKotlin/class/InheritClassSimple.kt"); diff --git a/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java b/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java index ed3989e86f0..92b045b4e61 100644 --- a/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java +++ b/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java @@ -606,6 +606,11 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD runTest("compiler/testData/loadJava/compiledKotlin/class/EnumWithPrimitiveConstructorParameter.kt"); } + @TestMetadata("FunInterface.kt") + public void testFunInterface() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlin/class/FunInterface.kt"); + } + @TestMetadata("InheritClassSimple.kt") public void testInheritClassSimple() throws Exception { runTest("compiler/testData/loadJava/compiledKotlin/class/InheritClassSimple.kt"); diff --git a/libraries/kotlinx-metadata/jvm/ChangeLog.md b/libraries/kotlinx-metadata/jvm/ChangeLog.md index f341166f3a5..e4bc4021d52 100644 --- a/libraries/kotlinx-metadata/jvm/ChangeLog.md +++ b/libraries/kotlinx-metadata/jvm/ChangeLog.md @@ -1,5 +1,10 @@ # kotlinx-metadata-jvm +## 0.1.1 + +- [`KT-37421`](https://youtrack.jetbrains.com/issue/KT-37421) Add Flag.Class.IS_FUN for functional interfaces +- Add `KmModule.optionalAnnotationClasses` for the new scheme of compilation of OptionalExpectation annotations in multiplatform projects ([KT-38652](https://youtrack.jetbrains.com/issue/KT-38652)) + ## 0.1.0 - [`KT-26602`](https://youtrack.jetbrains.com/issue/KT-26602) Provide a value-based API diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/Flag.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/Flag.kt index 5cdd6b31860..b72cbcdcc57 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/Flag.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/Flag.kt @@ -207,6 +207,12 @@ class Flag(private val offset: Int, private val bitWidth: Int, private val value */ @JvmField val IS_INLINE = Flag(F.IS_INLINE_CLASS) + + /** + * Signifies that the corresponding class is a functional interface, i.e. marked with the keyword `fun`. + */ + @JvmField + val IS_FUN = Flag(F.IS_FUN_INTERFACE) } /** diff --git a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt index bdbf6098f31..a9faa7b0db8 100644 --- a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt +++ b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt @@ -946,6 +946,7 @@ private val CLASS_FLAGS_MAP = COMMON_FLAGS_MAP + mapOf( Flag.Class.IS_EXTERNAL to "external", Flag.Class.IS_EXPECT to "expect", Flag.Class.IS_INLINE to "inline", + Flag.Class.IS_FUN to "fun", Flag.Class.IS_CLASS to "class", Flag.Class.IS_INTERFACE to "interface", diff --git a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/GenerateKotlinpTests.kt b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/GenerateKotlinpTests.kt index cd5cb31eaa3..114074ca835 100644 --- a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/GenerateKotlinpTests.kt +++ b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/GenerateKotlinpTests.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.kotlinp.test import org.jetbrains.kotlin.generators.tests.generator.testGroup -fun main(args: Array) { +fun main() { System.setProperty("java.awt.headless", "true") testGroup("libraries/tools/kotlinp/test", "libraries/tools/kotlinp/testData") { diff --git a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestGenerated.java b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestGenerated.java index bb66ad857d6..a0df838001c 100644 --- a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestGenerated.java +++ b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestGenerated.java @@ -38,6 +38,11 @@ public class KotlinpTestGenerated extends AbstractKotlinpTest { runTest("libraries/tools/kotlinp/testData/Contracts.kt"); } + @TestMetadata("FunInterface.kt") + public void testFunInterface() throws Exception { + runTest("libraries/tools/kotlinp/testData/FunInterface.kt"); + } + @TestMetadata("Lambda.kt") public void testLambda() throws Exception { runTest("libraries/tools/kotlinp/testData/Lambda.kt"); diff --git a/libraries/tools/kotlinp/testData/FunInterface.kt b/libraries/tools/kotlinp/testData/FunInterface.kt new file mode 100644 index 00000000000..794f83fdc55 --- /dev/null +++ b/libraries/tools/kotlinp/testData/FunInterface.kt @@ -0,0 +1,3 @@ +fun interface F { + fun String.f(x: Int) +} diff --git a/libraries/tools/kotlinp/testData/FunInterface.txt b/libraries/tools/kotlinp/testData/FunInterface.txt new file mode 100644 index 00000000000..bc1372f9b36 --- /dev/null +++ b/libraries/tools/kotlinp/testData/FunInterface.txt @@ -0,0 +1,13 @@ +// F.class +// ------------------------------------------ +public abstract fun interface F : kotlin/Any { + + // signature: f(Ljava/lang/String;I)V + public abstract fun kotlin/String.f(x: kotlin/Int): kotlin/Unit + + // module name: test-module +} +// META-INF/test-module.kotlin_module +// ------------------------------------------ +module { +}