[IR] Have JVM codegen respect the GenerateClassFilter supplied to GenerationState

ClassCodegen bails before generating code if the filter supplied to
the GenerationState rejects it based on the containing file or class
declaration itself.
This commit is contained in:
Kristoffer Andersen
2022-06-03 09:58:52 +02:00
committed by Alexander Udalov
parent 3896482e4f
commit fb9c5c13bd
@@ -48,6 +48,8 @@ import org.jetbrains.kotlin.name.JvmNames.JVM_SYNTHETIC_ANNOTATION_FQ_NAME
import org.jetbrains.kotlin.name.JvmNames.TRANSIENT_ANNOTATION_FQ_NAME
import org.jetbrains.kotlin.name.JvmNames.VOLATILE_ANNOTATION_FQ_NAME
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.jvm.checkers.JvmSimpleNameBacktickChecker
import org.jetbrains.kotlin.resolve.jvm.diagnostics.*
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmClassSignature
@@ -125,6 +127,9 @@ class ClassCodegen private constructor(
if (generated) return
generated = true
// Respect the [GenerateClassFilter] installed in the generation state
if (shouldSkipCodeGenerationAccordingToGenerationFilter()) return
// Generate PermittedSubclasses attribute for sealed class.
if (state.languageVersionSettings.supportsFeature(LanguageFeature.JvmPermittedSubclassesAttributeForSealed) &&
irClass.modality == Modality.SEALED &&
@@ -195,6 +200,14 @@ class ClassCodegen private constructor(
jvmSignatureClashDetector.reportErrors(classOrigin)
}
private fun shouldSkipCodeGenerationAccordingToGenerationFilter(): Boolean {
val filter = state.generateDeclaredClassFilter
val ktFile = irClass.descriptorOrigin.element as? KtFile
val ktClass = irClass.psiElement as? KtClassOrObject
return (ktFile != null && !filter.shouldGeneratePackagePart(ktFile))
|| (ktClass != null && !filter.shouldGenerateClass(ktClass))
}
private fun generatePermittedSubclasses() {
val sealedSubclasses = irClass.sealedSubclasses
if (sealedSubclasses.isEmpty()) return