From fb9c5c13bd9e37b775648550437fe8264687839f Mon Sep 17 00:00:00 2001 From: Kristoffer Andersen Date: Fri, 3 Jun 2022 09:58:52 +0200 Subject: [PATCH] [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. --- .../kotlin/backend/jvm/codegen/ClassCodegen.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt index ea127191051..5acc310b47d 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt @@ -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