diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderOnDemand.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderOnDemand.java deleted file mode 100644 index 72945b31e4d..00000000000 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderOnDemand.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.codegen; - -import kotlin.jvm.functions.Function0; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.storage.LockBasedStorageManager; -import org.jetbrains.kotlin.storage.NotNullLazyValue; - -public class ClassBuilderOnDemand extends DelegatingClassBuilder { - private final NotNullLazyValue classBuilder; - - public ClassBuilderOnDemand(@NotNull Function0 createClassBuilder) { - this.classBuilder = LockBasedStorageManager.NO_LOCKS.createLazyValue(createClassBuilder); - } - - @Override - @NotNull - protected ClassBuilder getDelegate() { - return classBuilder.invoke(); - } - - @Override - public void done() { - if (isComputed()) { - classBuilder.invoke().done(); - } - } - - public boolean isComputed() { - return classBuilder.isComputed(); - } -} diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderOnDemand.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderOnDemand.kt new file mode 100644 index 00000000000..24b5e8d0ba9 --- /dev/null +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderOnDemand.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.codegen + +import org.jetbrains.kotlin.storage.LockBasedStorageManager + +class ClassBuilderOnDemand(createClassBuilder: () -> ClassBuilder) : DelegatingClassBuilder() { + private val classBuilder = LockBasedStorageManager.NO_LOCKS.createLazyValue(createClassBuilder) + + val isComputed: Boolean + get() = classBuilder.isComputed() + + override fun getDelegate() = classBuilder() + + fun ensureGenerated() { + classBuilder() + } + + override fun done() { + if (isComputed) { + classBuilder().done() + } + } +} diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt index bd17339567c..5036537e3b5 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt @@ -317,7 +317,10 @@ class MultifileClassCodegenImpl( } private fun writeKotlinMultifileFacadeAnnotationIfNeeded() { - if (!state.classBuilderMode.generateMetadata) return + if (!state.classBuilderMode.generateMetadata) { + classBuilder.ensureGenerated() + return + } if (files.any { it.isScript() }) return val extraFlags = if (shouldGeneratePartHierarchy) JvmAnnotationNames.METADATA_MULTIFILE_PARTS_INHERIT_FLAG else 0 diff --git a/compiler/testData/asJava/lightClasses/compilationErrors/AllInlineOnly.java b/compiler/testData/asJava/lightClasses/compilationErrors/AllInlineOnly.java new file mode 100644 index 00000000000..8abeb659475 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/compilationErrors/AllInlineOnly.java @@ -0,0 +1,2 @@ +public final class AllInlineOnly { +} \ No newline at end of file diff --git a/compiler/testData/asJava/lightClasses/compilationErrors/AllInlineOnly.kt b/compiler/testData/asJava/lightClasses/compilationErrors/AllInlineOnly.kt new file mode 100644 index 00000000000..2e3b6e4c1db --- /dev/null +++ b/compiler/testData/asJava/lightClasses/compilationErrors/AllInlineOnly.kt @@ -0,0 +1,11 @@ +// p.AllInlineOnly +@file:kotlin.jvm.JvmMultifileClass +@file:kotlin.jvm.JvmName("AllInlineOnly") + +package p + +@kotlin.internal.InlineOnly +public inline fun f(): Int = 3 + +@kotlin.internal.InlineOnly +public inline fun g(p: String): String = "p" diff --git a/compiler/testData/asJava/lightClasses/facades/AllPrivate.java b/compiler/testData/asJava/lightClasses/facades/AllPrivate.java new file mode 100644 index 00000000000..8f999fd931b --- /dev/null +++ b/compiler/testData/asJava/lightClasses/facades/AllPrivate.java @@ -0,0 +1,2 @@ +public final class AllPrivate { +} diff --git a/compiler/testData/asJava/lightClasses/facades/AllPrivate.kt b/compiler/testData/asJava/lightClasses/facades/AllPrivate.kt new file mode 100644 index 00000000000..a39e4df727b --- /dev/null +++ b/compiler/testData/asJava/lightClasses/facades/AllPrivate.kt @@ -0,0 +1,9 @@ +// p.AllPrivate +@file:kotlin.jvm.JvmMultifileClass +@file:kotlin.jvm.JvmName("AllPrivate") + +package p + +private fun f(): Int = 3 + +private fun g(p: String): String = "p" diff --git a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java index d6992108432..713c30647bd 100644 --- a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -164,6 +164,12 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses/compilationErrors"), Pattern.compile("^([^.]+)\\.(kt|kts)$"), TargetBackend.ANY, true); } + @TestMetadata("AllInlineOnly.kt") + public void testAllInlineOnly() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/compilationErrors/AllInlineOnly.kt"); + doTest(fileName); + } + @TestMetadata("AnnotationModifiers.kt") public void testAnnotationModifiers() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/compilationErrors/AnnotationModifiers.kt"); @@ -236,6 +242,12 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses/facades"), Pattern.compile("^([^.]+)\\.(kt|kts)$"), TargetBackend.ANY, true); } + @TestMetadata("AllPrivate.kt") + public void testAllPrivate() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/AllPrivate.kt"); + doTest(fileName); + } + @TestMetadata("MultiFile.kt") public void testMultiFile() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/MultiFile.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java index fc0d2b63c2d..87d346b9936 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java @@ -185,6 +185,12 @@ public class IdeCompiledLightClassTestGenerated extends AbstractIdeCompiledLight KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses/facades"), Pattern.compile("^([^.]+)\\.(kt|kts)$"), TargetBackend.ANY, true); } + @TestMetadata("AllPrivate.kt") + public void testAllPrivate() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/AllPrivate.kt"); + doTest(fileName); + } + @TestMetadata("MultiFile.kt") public void testMultiFile() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/MultiFile.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java index f3ccf19ce7f..ffb5e5057ee 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java @@ -164,6 +164,12 @@ public class IdeLightClassTestGenerated extends AbstractIdeLightClassTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses/compilationErrors"), Pattern.compile("^([^.]+)\\.(kt|kts)$"), TargetBackend.ANY, true); } + @TestMetadata("AllInlineOnly.kt") + public void testAllInlineOnly() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/compilationErrors/AllInlineOnly.kt"); + doTest(fileName); + } + @TestMetadata("AnnotationModifiers.kt") public void testAnnotationModifiers() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/compilationErrors/AnnotationModifiers.kt"); @@ -215,6 +221,12 @@ public class IdeLightClassTestGenerated extends AbstractIdeLightClassTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses/facades"), Pattern.compile("^([^.]+)\\.(kt|kts)$"), TargetBackend.ANY, true); } + @TestMetadata("AllPrivate.kt") + public void testAllPrivate() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/AllPrivate.kt"); + doTest(fileName); + } + @TestMetadata("MultiFile.kt") public void testMultiFile() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/MultiFile.kt");