Skip to content

Commit

Permalink
Compiler plugin: fix IrLinkageError with K/Js on Kotlin 1.9 (#3557)
Browse files Browse the repository at this point in the history
* Compiler plugin: fix IrLinkageError with K/Js on Kotlin 1.9

Fixes #3556 – IrLinkageError if objects or abstract subclasses of
AbstractProjectConfig exist in K/Js sources

This commit makes the Kotest compiler plugin skip non-instantiable
classes and objects, which derive from AbstractProjectConfig.

Note: To use objects deriving from AbstractProjectConfig on K/Js, they
must be referenced at least once in code that executes, otherwise they
will be discarded (with the IDE warning "object ... is never used)".

* API validation: Exclude compiler and Gradle plugins

---------

Co-authored-by: Sam <sam@sksamuel.com>
  • Loading branch information
OliverO2 and sksamuel committed Jun 16, 2023
1 parent 71c1826 commit 3143993
Show file tree
Hide file tree
Showing 6 changed files with 17 additions and 292 deletions.
10 changes: 10 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,13 @@ repositories {
google()
gradlePluginPortal() // tvOS builds need to be able to fetch a kotlin gradle plugin
}

apiValidation {
ignoredPackages.addAll(
listOf(
"io.kotest.framework.multiplatform.embeddablecompiler",
"io.kotest.framework.multiplatform.gradle",
"io.kotest.framework.multiplatform.native"
)
)
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ abstract class Transformer(

override fun visitClassNew(declaration: IrClass): IrStatement {
super.visitClassNew(declaration)
if (declaration.isProjectConfig()) configs.add(declaration)
if (declaration.isInstantiableProjectConfig()) configs.add(declaration)
return declaration
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.kotest.framework.multiplatform.embeddablecompiler

import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.isClass
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.types.IrType
Expand Down Expand Up @@ -27,9 +29,11 @@ val abstractProjectConfigFqName = FqName("io.kotest.core.config.AbstractProjectC
fun IrFile.specs() = declarations.filterIsInstance<IrClass>().filter { it.isSpecClass() }

/**
* Returns true if this IrClass is a project config
* Returns true if this IrClass is an instantiable project config
*/
fun IrClass.isProjectConfig() = superTypes().any { it.classFqName == abstractProjectConfigFqName }
fun IrClass.isInstantiableProjectConfig() =
kind.isClass && modality != Modality.ABSTRACT && modality != Modality.SEALED &&
superTypes().any { it.classFqName == abstractProjectConfigFqName }

/**
* Recursively returns all supertypes for an [IrClass] to the top of the type tree.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +0,0 @@
public abstract class io/kotest/framework/multiplatform/gradle/KotestMultiplatformCompilerGradlePlugin : org/jetbrains/kotlin/gradle/plugin/KotlinCompilerPluginSupportPlugin {
public static final field Companion Lio/kotest/framework/multiplatform/gradle/KotestMultiplatformCompilerGradlePlugin$Companion;
public static final field KotestEmbeddableCompilerArtifactId Ljava/lang/String;
public static final field KotestGroupId Ljava/lang/String;
public static final field KotestNativeArtifactId Ljava/lang/String;
public static final field compilerPluginId Ljava/lang/String;
public static final field kotestPluginExtensionName Ljava/lang/String;
public fun <init> (Lorg/gradle/api/provider/ProviderFactory;)V
public synthetic fun apply (Ljava/lang/Object;)V
public fun apply (Lorg/gradle/api/Project;)V
public fun applyToCompilation (Lorg/jetbrains/kotlin/gradle/plugin/KotlinCompilation;)Lorg/gradle/api/provider/Provider;
public fun getCompilerPluginId ()Ljava/lang/String;
public fun getPluginArtifact ()Lorg/jetbrains/kotlin/gradle/plugin/SubpluginArtifact;
public fun getPluginArtifactForNative ()Lorg/jetbrains/kotlin/gradle/plugin/SubpluginArtifact;
public fun isApplicable (Lorg/jetbrains/kotlin/gradle/plugin/KotlinCompilation;)Z
}

public final class io/kotest/framework/multiplatform/gradle/KotestMultiplatformCompilerGradlePlugin$Companion {
}

public final class io/kotest/framework/multiplatform/gradle/KotestPluginConstantsKt {
public static final field KOTEST_COMPILER_PLUGIN_VERSION Ljava/lang/String;
}

public abstract class io/kotest/framework/multiplatform/gradle/KotestPluginExtension {
public fun <init> ()V
public abstract fun getKotestCompilerPluginVersion ()Lorg/gradle/api/provider/Property;
}

Original file line number Diff line number Diff line change
@@ -1,28 +0,0 @@
public final class io/kotest/framework/multiplatform/native/EntryPoint {
public static final field INSTANCE Lio/kotest/framework/multiplatform/native/EntryPoint;
public static final field LaunchMethodName Ljava/lang/String;
public static final field LauncherValName Ljava/lang/String;
public static final field TestEngineClassName Ljava/lang/String;
public static final field WithSpecsMethodName Ljava/lang/String;
public static final field WithTeamCityListenerMethodName Ljava/lang/String;
}

public final class io/kotest/framework/multiplatform/native/KotestNativeComponentRegistrar : org/jetbrains/kotlin/compiler/plugin/CompilerPluginRegistrar {
public fun <init> ()V
public fun getSupportsK2 ()Z
public fun registerExtensions (Lorg/jetbrains/kotlin/compiler/plugin/CompilerPluginRegistrar$ExtensionStorage;Lorg/jetbrains/kotlin/config/CompilerConfiguration;)V
}

public final class io/kotest/framework/multiplatform/native/SpecIrGenerationExtension : org/jetbrains/kotlin/backend/common/extensions/IrGenerationExtension {
public fun <init> (Lorg/jetbrains/kotlin/cli/common/messages/MessageCollector;)V
public fun generate (Lorg/jetbrains/kotlin/ir/declarations/IrModuleFragment;Lorg/jetbrains/kotlin/backend/common/extensions/IrPluginContext;)V
public fun resolveSymbol (Lorg/jetbrains/kotlin/ir/symbols/IrSymbol;Lorg/jetbrains/kotlin/ir/builders/TranslationPluginContext;)Lorg/jetbrains/kotlin/ir/declarations/IrDeclaration;
}

public final class io/kotest/framework/multiplatform/native/SpecsKt {
public static final fun getSpecClasses ()Ljava/util/List;
public static final fun isSpecClass (Lorg/jetbrains/kotlin/ir/declarations/IrClass;)Z
public static final fun specs (Lorg/jetbrains/kotlin/ir/declarations/IrFile;)Ljava/util/List;
public static final fun superTypes (Lorg/jetbrains/kotlin/ir/declarations/IrClass;)Ljava/util/List;
}

0 comments on commit 3143993

Please sign in to comment.