Skip to content

Commit

Permalink
Provide a priority field for DetektProvider so tools can easier choos…
Browse files Browse the repository at this point in the history
…e their provider implemention in tests for example (#4923)
  • Loading branch information
arturbosch committed Jun 8, 2022
1 parent cdf487a commit 7c485f5
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 1 deletion.
5 changes: 5 additions & 0 deletions detekt-tooling/api/detekt-tooling.api
Expand Up @@ -45,13 +45,18 @@ 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 {
public final fun load (Ljava/lang/ClassLoader;)Lio/github/detekt/tooling/api/DetektProvider;
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
Expand Down
Expand Up @@ -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].
*/
Expand All @@ -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.")
}
}
@@ -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.")
}
@@ -0,0 +1 @@
io.github.detekt.tooling.api.PrioritizedProvider

0 comments on commit 7c485f5

Please sign in to comment.