From 7c485f5c3df13cbc4e8455011a39050b9cf462aa Mon Sep 17 00:00:00 2001 From: Artur Bosch Date: Thu, 9 Jun 2022 00:34:47 +0200 Subject: [PATCH] Provide a priority field for DetektProvider so tools can easier choose their provider implemention in tests for example (#4923) --- detekt-tooling/api/detekt-tooling.api | 5 +++++ .../detekt/tooling/api/DetektProvider.kt | 11 +++++++++- .../detekt/tooling/api/DetektProviderSpec.kt | 20 +++++++++++++++++++ ...o.github.detekt.tooling.api.DetektProvider | 1 + 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 detekt-tooling/src/test/kotlin/io/github/detekt/tooling/api/DetektProviderSpec.kt create mode 100644 detekt-tooling/src/test/resources/META-INF/services/io.github.detekt.tooling.api.DetektProvider diff --git a/detekt-tooling/api/detekt-tooling.api b/detekt-tooling/api/detekt-tooling.api index 8cd9687dfbd..942a05e44b7 100644 --- a/detekt-tooling/api/detekt-tooling.api +++ b/detekt-tooling/api/detekt-tooling.api @@ -45,6 +45,7 @@ public abstract class io/github/detekt/tooling/api/DetektError : java/lang/Runti public abstract interface class io/github/detekt/tooling/api/DetektProvider { public static final field Companion Lio/github/detekt/tooling/api/DetektProvider$Companion; public abstract fun get (Lio/github/detekt/tooling/api/spec/ProcessingSpec;)Lio/github/detekt/tooling/api/Detekt; + public abstract fun getPriority ()I } public final class io/github/detekt/tooling/api/DetektProvider$Companion { @@ -52,6 +53,10 @@ public final class io/github/detekt/tooling/api/DetektProvider$Companion { public static synthetic fun load$default (Lio/github/detekt/tooling/api/DetektProvider$Companion;Ljava/lang/ClassLoader;ILjava/lang/Object;)Lio/github/detekt/tooling/api/DetektProvider; } +public final class io/github/detekt/tooling/api/DetektProvider$DefaultImpls { + public static fun getPriority (Lio/github/detekt/tooling/api/DetektProvider;)I +} + public abstract class io/github/detekt/tooling/api/FunctionMatcher { public static final field Companion Lio/github/detekt/tooling/api/FunctionMatcher$Companion; public abstract fun match (Lorg/jetbrains/kotlin/descriptors/CallableDescriptor;)Z diff --git a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/api/DetektProvider.kt b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/api/DetektProvider.kt index 6dce9d63373..3100b9a8b50 100644 --- a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/api/DetektProvider.kt +++ b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/api/DetektProvider.kt @@ -8,6 +8,13 @@ import java.util.ServiceLoader */ interface DetektProvider { + /** + * Is used to choose the highest priority provider if more than one are found on the classpath. + * + * Can be useful to stub/mock detekt instances for tests. + */ + val priority: Int get() = -1 + /** * Configure a [Detekt] instance based on given [ProcessingSpec]. */ @@ -21,6 +28,8 @@ interface DetektProvider { fun load( classLoader: ClassLoader = DetektProvider::class.java.classLoader ): DetektProvider = - ServiceLoader.load(DetektProvider::class.java, classLoader).first() + ServiceLoader.load(DetektProvider::class.java, classLoader) + .maxByOrNull { it.priority } + ?: error("No implemention of DetektProvider found.") } } diff --git a/detekt-tooling/src/test/kotlin/io/github/detekt/tooling/api/DetektProviderSpec.kt b/detekt-tooling/src/test/kotlin/io/github/detekt/tooling/api/DetektProviderSpec.kt new file mode 100644 index 00000000000..1cc0bebaa62 --- /dev/null +++ b/detekt-tooling/src/test/kotlin/io/github/detekt/tooling/api/DetektProviderSpec.kt @@ -0,0 +1,20 @@ +package io.github.detekt.tooling.api + +import io.github.detekt.tooling.api.spec.ProcessingSpec +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class DetektProviderSpec { + + @Test + fun `load provider with highest priority`() { + val provider = DetektProvider.load() + + assertThat(provider.priority).isEqualTo(100) + } +} + +class PrioritizedProvider : DetektProvider { + override val priority: Int = 100 + override fun get(processingSpec: ProcessingSpec): Detekt = error("No instances.") +} diff --git a/detekt-tooling/src/test/resources/META-INF/services/io.github.detekt.tooling.api.DetektProvider b/detekt-tooling/src/test/resources/META-INF/services/io.github.detekt.tooling.api.DetektProvider new file mode 100644 index 00000000000..6901985c943 --- /dev/null +++ b/detekt-tooling/src/test/resources/META-INF/services/io.github.detekt.tooling.api.DetektProvider @@ -0,0 +1 @@ +io.github.detekt.tooling.api.PrioritizedProvider