Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Provide a priority field for DetektProvider #4923

Merged
merged 1 commit into from Jun 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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