JVM, JVM IR: report error if not all parts of multifile class are @JvmSynthetic

#KT-41884 Fixed
This commit is contained in:
Alexander Udalov
2021-03-10 22:03:34 +01:00
parent 75850a618c
commit bc5fc122c5
12 changed files with 163 additions and 1 deletions
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.backend.common.phaser.makeCustomPhase
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
import org.jetbrains.kotlin.backend.jvm.codegen.fileParent
import org.jetbrains.kotlin.backend.jvm.ir.getKtFile
import org.jetbrains.kotlin.config.JvmAnalysisFlags
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality
@@ -42,6 +43,8 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities
import org.jetbrains.kotlin.resolve.inline.INLINE_ONLY_ANNOTATION_FQ_NAME
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_SYNTHETIC_ANNOTATION_FQ_NAME
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
internal val generateMultifileFacadesPhase = makeCustomPhase<JvmBackendContext, IrModuleFragment>(
name = "GenerateMultifileFacades",
@@ -133,7 +136,22 @@ private fun generateMultifileFacades(
}
}
}
val nonJvmSyntheticParts = partClasses.filterNot { it.hasAnnotation(JVM_SYNTHETIC_ANNOTATION_FQ_NAME) }
if (nonJvmSyntheticParts.isEmpty()) {
annotations = annotations + partClasses.first().getAnnotation(JVM_SYNTHETIC_ANNOTATION_FQ_NAME)!!.deepCopyWithSymbols()
} else if (nonJvmSyntheticParts.size < partClasses.size) {
for (part in nonJvmSyntheticParts) {
val partFile = part.fileParent.getKtFile() ?: error("Not a KtFile: ${part.render()} ${part.fileParent}")
// If at least one of parts is annotated with @JvmSynthetic, then all other parts should also be annotated.
// We report this error on the package directive for each non-@JvmSynthetic part.
context.state.diagnostics.report(
ErrorsJvm.NOT_ALL_MULTIFILE_CLASS_PARTS_ARE_JVM_SYNTHETIC.on(partFile.packageDirective ?: partFile)
)
}
}
}
file.declarations.add(facadeClass)
for (partClass in partClasses) {