Enable binary compatibility validator for detekt-test and detekt-test-api (#4157)

* Enable binary compatibility validator for detekt-test and detekt-test-api

* Move BaseRule from internal to public API
This commit is contained in:
Chao Zhang
2021-10-16 07:50:17 -07:00
committed by GitHub
parent 75bec4abb7
commit edabb6f2b9
19 changed files with 179 additions and 50 deletions

View File

@@ -4,6 +4,28 @@ public final class io/gitlab/arturbosch/detekt/api/AnnotationExcluder {
public final fun shouldExclude (Ljava/util/List;)Z
}
public abstract class io/gitlab/arturbosch/detekt/api/BaseRule : io/gitlab/arturbosch/detekt/api/DetektVisitor, io/gitlab/arturbosch/detekt/api/Context {
public fun <init> ()V
public fun <init> (Lio/gitlab/arturbosch/detekt/api/Context;)V
public synthetic fun <init> (Lio/gitlab/arturbosch/detekt/api/Context;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun clearFindings ()V
public final fun getBindingContext ()Lorg/jetbrains/kotlin/resolve/BindingContext;
public final fun getCompilerResources ()Lio/gitlab/arturbosch/detekt/api/internal/CompilerResources;
protected final fun getContext ()Lio/gitlab/arturbosch/detekt/api/Context;
public fun getFindings ()Ljava/util/List;
public fun getRuleId ()Ljava/lang/String;
protected fun postVisit (Lorg/jetbrains/kotlin/psi/KtFile;)V
protected fun preVisit (Lorg/jetbrains/kotlin/psi/KtFile;)V
public fun report (Lio/gitlab/arturbosch/detekt/api/Finding;Ljava/util/Set;Ljava/lang/String;)V
public fun report (Ljava/util/List;Ljava/util/Set;Ljava/lang/String;)V
public final fun setBindingContext (Lorg/jetbrains/kotlin/resolve/BindingContext;)V
public final fun setCompilerResources (Lio/gitlab/arturbosch/detekt/api/internal/CompilerResources;)V
public fun visit (Lorg/jetbrains/kotlin/psi/KtFile;)V
public abstract fun visitCondition (Lorg/jetbrains/kotlin/psi/KtFile;)Z
public final fun visitFile (Lorg/jetbrains/kotlin/psi/KtFile;Lorg/jetbrains/kotlin/resolve/BindingContext;Lio/gitlab/arturbosch/detekt/api/internal/CompilerResources;)V
public static synthetic fun visitFile$default (Lio/gitlab/arturbosch/detekt/api/BaseRule;Lorg/jetbrains/kotlin/psi/KtFile;Lorg/jetbrains/kotlin/resolve/BindingContext;Lio/gitlab/arturbosch/detekt/api/internal/CompilerResources;ILjava/lang/Object;)V
}
public class io/gitlab/arturbosch/detekt/api/CodeSmell : io/gitlab/arturbosch/detekt/api/Finding {
public fun <init> (Lio/gitlab/arturbosch/detekt/api/Issue;Lio/gitlab/arturbosch/detekt/api/Entity;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V
public synthetic fun <init> (Lio/gitlab/arturbosch/detekt/api/Issue;Lio/gitlab/arturbosch/detekt/api/Entity;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
@@ -387,7 +409,7 @@ public final class io/gitlab/arturbosch/detekt/api/MetricKt {
public static final field DEFAULT_FLOAT_CONVERSION_FACTOR I
}
public abstract class io/gitlab/arturbosch/detekt/api/MultiRule : io/gitlab/arturbosch/detekt/api/internal/BaseRule {
public abstract class io/gitlab/arturbosch/detekt/api/MultiRule : io/gitlab/arturbosch/detekt/api/BaseRule {
public fun <init> ()V
public final fun getActiveRules ()Ljava/util/Set;
public abstract fun getRules ()Ljava/util/List;
@@ -460,7 +482,7 @@ public final class io/gitlab/arturbosch/detekt/api/ReportingExtension$DefaultImp
public static fun transformFindings (Lio/gitlab/arturbosch/detekt/api/ReportingExtension;Ljava/util/Map;)Ljava/util/Map;
}
public abstract class io/gitlab/arturbosch/detekt/api/Rule : io/gitlab/arturbosch/detekt/api/internal/BaseRule, io/gitlab/arturbosch/detekt/api/ConfigAware {
public abstract class io/gitlab/arturbosch/detekt/api/Rule : io/gitlab/arturbosch/detekt/api/BaseRule, io/gitlab/arturbosch/detekt/api/ConfigAware {
public fun <init> ()V
public fun <init> (Lio/gitlab/arturbosch/detekt/api/Config;Lio/gitlab/arturbosch/detekt/api/Context;)V
public synthetic fun <init> (Lio/gitlab/arturbosch/detekt/api/Config;Lio/gitlab/arturbosch/detekt/api/Context;ILkotlin/jvm/internal/DefaultConstructorMarker;)V

View File

@@ -1,11 +1,7 @@
package io.gitlab.arturbosch.detekt.api.internal
package io.gitlab.arturbosch.detekt.api
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.Context
import io.gitlab.arturbosch.detekt.api.DetektVisitor
import io.gitlab.arturbosch.detekt.api.MultiRule
import io.gitlab.arturbosch.detekt.api.Rule
import io.gitlab.arturbosch.detekt.api.RuleId
import io.gitlab.arturbosch.detekt.api.internal.CompilerResources
import io.gitlab.arturbosch.detekt.api.internal.DefaultContext
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.BindingContext
@@ -35,7 +31,7 @@ abstract class BaseRule(
* BindingContext holds the result of the semantic analysis of the source code by the Kotlin compiler. Rules that
* rely on symbols and types being resolved can use the BindingContext for this analysis. Note that detekt must
* receive the correct compile classpath for the code being analyzed otherwise the default value
* BindingContext.EMPTY will be used and it will not be possible for detekt to resolve types or symbols.
* [BindingContext.EMPTY] will be used and it will not be possible for detekt to resolve types or symbols.
*/
fun visitFile(
root: KtFile,
@@ -63,7 +59,7 @@ abstract class BaseRule(
/**
* Basic mechanism to decide if a rule should run or not.
*
* By default any rule which is declared 'active' in the [Config]
* By default, any rule which is declared 'active' in the [Config]
* or not suppressed by a [Suppress] annotation on file level should run.
*/
abstract fun visitCondition(root: KtFile): Boolean

View File

@@ -1,6 +1,5 @@
package io.gitlab.arturbosch.detekt.api
import io.gitlab.arturbosch.detekt.api.internal.BaseRule
import org.jetbrains.kotlin.psi.KtFile
/**

View File

@@ -1,7 +1,6 @@
package io.gitlab.arturbosch.detekt.api
import io.gitlab.arturbosch.detekt.api.Config.Companion.SEVERITY_KEY
import io.gitlab.arturbosch.detekt.api.internal.BaseRule
import io.gitlab.arturbosch.detekt.api.internal.DefaultContext
import io.gitlab.arturbosch.detekt.api.internal.PathFilters
import io.gitlab.arturbosch.detekt.api.internal.createPathFilters

View File

@@ -1,6 +1,5 @@
package io.gitlab.arturbosch.detekt.api
import io.gitlab.arturbosch.detekt.api.internal.BaseRule
import io.gitlab.arturbosch.detekt.api.internal.PathFilters
import io.gitlab.arturbosch.detekt.api.internal.validateIdentifier
import org.jetbrains.kotlin.psi.KtFile

View File

@@ -2,6 +2,7 @@ package io.gitlab.arturbosch.detekt.core
import io.github.detekt.psi.absolutePath
import io.github.detekt.tooling.api.spec.ProcessingSpec
import io.gitlab.arturbosch.detekt.api.BaseRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.FileProcessListener
import io.gitlab.arturbosch.detekt.api.Finding
@@ -9,7 +10,6 @@ import io.gitlab.arturbosch.detekt.api.MultiRule
import io.gitlab.arturbosch.detekt.api.Rule
import io.gitlab.arturbosch.detekt.api.RuleSetId
import io.gitlab.arturbosch.detekt.api.RuleSetProvider
import io.gitlab.arturbosch.detekt.api.internal.BaseRule
import io.gitlab.arturbosch.detekt.api.internal.CompilerResources
import io.gitlab.arturbosch.detekt.api.internal.whichDetekt
import io.gitlab.arturbosch.detekt.api.internal.whichJava

View File

@@ -2,6 +2,7 @@ package io.gitlab.arturbosch.detekt.core.rules
import io.github.detekt.psi.absolutePath
import io.github.detekt.tooling.api.spec.RulesSpec
import io.gitlab.arturbosch.detekt.api.BaseRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.Finding
import io.gitlab.arturbosch.detekt.api.MultiRule
@@ -10,7 +11,6 @@ import io.gitlab.arturbosch.detekt.api.RuleId
import io.gitlab.arturbosch.detekt.api.RuleSet
import io.gitlab.arturbosch.detekt.api.RuleSetId
import io.gitlab.arturbosch.detekt.api.RuleSetProvider
import io.gitlab.arturbosch.detekt.api.internal.BaseRule
import io.gitlab.arturbosch.detekt.api.internal.createPathFilters
import io.gitlab.arturbosch.detekt.core.ProcessingSettings
import org.jetbrains.kotlin.psi.KtFile

View File

@@ -1,10 +1,10 @@
package io.gitlab.arturbosch.detekt.core.rules
import io.gitlab.arturbosch.detekt.api.BaseRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.RuleId
import io.gitlab.arturbosch.detekt.api.RuleSet
import io.gitlab.arturbosch.detekt.api.RuleSetProvider
import io.gitlab.arturbosch.detekt.api.internal.BaseRule
internal class SingleRuleProvider(
private val ruleId: RuleId,

View File

@@ -1,8 +1,8 @@
package io.gitlab.arturbosch.detekt.core.suppressors
import io.gitlab.arturbosch.detekt.api.BaseRule
import io.gitlab.arturbosch.detekt.api.ConfigAware
import io.gitlab.arturbosch.detekt.api.Finding
import io.gitlab.arturbosch.detekt.api.internal.BaseRule
/**
* Given a Finding it decides if it should be suppressed (`true`) or not (`false`)

View File

@@ -1,8 +1,12 @@
package io.github.detekt.metrics
import io.github.detekt.test.utils.compileContentForTest
import io.github.detekt.test.utils.getFunctionByName
import io.gitlab.arturbosch.detekt.rules.safeAs
import org.assertj.core.api.Assertions.assertThat
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtNamed
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.psiUtil.getChildOfType
import org.spekframework.spek2.Spek
import org.spekframework.spek2.style.specification.describe
@@ -224,3 +228,14 @@ class CyclomaticComplexitySpec : Spek({
}
}
})
private fun KtElement.getFunctionByName(name: String): KtNamedFunction {
val node = getChildOfType<KtNamedFunction>() ?: error("Expected node of type ${KtNamedFunction::class}")
val identifier = node.safeAs<KtNamed>()?.nameAsName?.identifier
require(identifier == name) {
"Node should be $name, but was $identifier"
}
return node
}

View File

@@ -1,10 +1,10 @@
package io.gitlab.arturbosch.detekt.rules
import io.gitlab.arturbosch.detekt.api.BaseRule
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.MultiRule
import io.gitlab.arturbosch.detekt.api.Rule
import io.gitlab.arturbosch.detekt.api.RuleSetProvider
import io.gitlab.arturbosch.detekt.api.internal.BaseRule
import io.gitlab.arturbosch.detekt.api.internal.DefaultRuleSetProvider
import io.gitlab.arturbosch.detekt.rules.bugs.PotentialBugProvider
import io.gitlab.arturbosch.detekt.rules.complexity.ComplexityProvider

View File

@@ -0,0 +1,53 @@
public final class io/github/detekt/test/utils/CompileExtensionsKt {
public static final fun compileContentForTest (Ljava/lang/String;Ljava/lang/String;)Lorg/jetbrains/kotlin/psi/KtFile;
public static synthetic fun compileContentForTest$default (Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/kotlin/psi/KtFile;
public static final fun compileForTest (Ljava/nio/file/Path;)Lorg/jetbrains/kotlin/psi/KtFile;
}
public final class io/github/detekt/test/utils/FileExtensionKt {
public static final fun createTempDirectoryForTest (Ljava/lang/String;)Ljava/nio/file/Path;
public static final fun createTempFileForTest (Ljava/lang/String;Ljava/lang/String;)Ljava/nio/file/Path;
}
public final class io/github/detekt/test/utils/KotlinCoreEnvironmentWrapper {
public fun <init> (Lorg/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment;Lorg/jetbrains/kotlin/com/intellij/openapi/Disposable;)V
public final fun dispose ()V
public final fun getEnv ()Lorg/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment;
}
public final class io/github/detekt/test/utils/KotlinCoreEnvironmentWrapperKt {
public static final fun createEnvironment (Ljava/util/List;)Lio/github/detekt/test/utils/KotlinCoreEnvironmentWrapper;
public static synthetic fun createEnvironment$default (Ljava/util/List;ILjava/lang/Object;)Lio/github/detekt/test/utils/KotlinCoreEnvironmentWrapper;
public static final fun createPsiFactory ()Lorg/jetbrains/kotlin/psi/KtPsiFactory;
}
public final class io/github/detekt/test/utils/KotlinScriptEngine {
public static final field INSTANCE Lio/github/detekt/test/utils/KotlinScriptEngine;
public final fun compile (Ljava/lang/String;)V
}
public final class io/github/detekt/test/utils/KotlinScriptException : java/lang/RuntimeException {
public fun <init> (Ljavax/script/ScriptException;)V
}
public final class io/github/detekt/test/utils/NullPrintStream : java/io/PrintStream {
public fun <init> ()V
}
public final class io/github/detekt/test/utils/ResourcesKt {
public static final fun readResourceContent (Ljava/lang/String;)Ljava/lang/String;
public static final fun resource (Ljava/lang/String;)Ljava/net/URI;
public static final fun resourceAsFile (Ljava/lang/String;)Ljava/io/File;
public static final fun resourceAsPath (Ljava/lang/String;)Ljava/nio/file/Path;
public static final fun resourceUrl (Ljava/lang/String;)Ljava/net/URL;
}
public final class io/github/detekt/test/utils/StringPrintStream : java/io/PrintStream {
public fun <init> ()V
public fun toString ()Ljava/lang/String;
}
public final class io/gitlab/arturbosch/detekt/rules/KotlinEnvironmentTestSetupKt {
public static final fun setupKotlinEnvironment (Lorg/spekframework/spek2/dsl/Root;)V
}

View File

@@ -1,5 +1,6 @@
plugins {
id("module")
alias(libs.plugins.binaryCompatibilityValidator)
}
dependencies {

View File

@@ -1,20 +0,0 @@
package io.github.detekt.test.utils
import io.gitlab.arturbosch.detekt.rules.safeAs
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtNamed
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.psiUtil.getChildOfType
inline fun <reified T : KtElement> KtElement.getNodeByName(name: String): T {
val node = getChildOfType<T>() ?: error("Expected node of type ${T::class}")
val identifier = node.safeAs<KtNamed>()?.nameAsName?.identifier
require(identifier == name) {
"Node should be $name, but was $identifier"
}
return node
}
fun KtElement.getFunctionByName(name: String): KtNamedFunction = getNodeByName(name)

View File

@@ -1,9 +0,0 @@
package io.github.detekt.test.utils
import java.io.OutputStream
internal class NullOutputStream : OutputStream() {
override fun write(b: Int) {
// no-op
}
}

View File

@@ -1,5 +1,12 @@
package io.github.detekt.test.utils
import java.io.OutputStream
import java.io.PrintStream
class NullPrintStream : PrintStream(NullOutputStream())
internal class NullOutputStream : OutputStream() {
override fun write(b: Int) {
// no-op
}
}

View File

@@ -0,0 +1,66 @@
public final class io/gitlab/arturbosch/detekt/test/FindingAssert : org/assertj/core/api/AbstractAssert {
public fun <init> (Lio/gitlab/arturbosch/detekt/api/Finding;)V
public final fun getActual ()Lio/gitlab/arturbosch/detekt/api/Finding;
public final fun hasMessage (Ljava/lang/String;)Lio/gitlab/arturbosch/detekt/test/FindingAssert;
}
public final class io/gitlab/arturbosch/detekt/test/FindingsAssert : org/assertj/core/api/AbstractListAssert {
public fun <init> (Ljava/util/List;)V
public final fun hasSourceLocation (II)Lio/gitlab/arturbosch/detekt/test/FindingsAssert;
public final fun hasSourceLocations ([Lio/gitlab/arturbosch/detekt/api/SourceLocation;)Lio/gitlab/arturbosch/detekt/test/FindingsAssert;
public final fun hasTextLocations ([Ljava/lang/String;)Lio/gitlab/arturbosch/detekt/test/FindingsAssert;
public final fun hasTextLocations ([Lkotlin/Pair;)Lio/gitlab/arturbosch/detekt/test/FindingsAssert;
public synthetic fun newAbstractIterableAssert (Ljava/lang/Iterable;)Lorg/assertj/core/api/AbstractIterableAssert;
public synthetic fun toAssert (Ljava/lang/Object;Ljava/lang/String;)Lorg/assertj/core/api/AbstractAssert;
}
public final class io/gitlab/arturbosch/detekt/test/FindingsAssertionsKt {
public static final fun assert (Ljava/util/List;)Lio/gitlab/arturbosch/detekt/test/FindingsAssert;
public static final fun assertThat (Lio/gitlab/arturbosch/detekt/api/Finding;)Lio/gitlab/arturbosch/detekt/test/FindingAssert;
public static final fun assertThat (Ljava/util/List;)Lio/gitlab/arturbosch/detekt/test/FindingsAssert;
}
public final class io/gitlab/arturbosch/detekt/test/ResourcesKt {
public static final fun yamlConfig (Ljava/lang/String;)Lio/gitlab/arturbosch/detekt/api/Config;
public static final fun yamlConfigFromContent (Ljava/lang/String;)Lio/gitlab/arturbosch/detekt/api/Config;
}
public final class io/gitlab/arturbosch/detekt/test/RuleExtensionsKt {
public static final fun compileAndLint (Lio/gitlab/arturbosch/detekt/api/BaseRule;Ljava/lang/String;)Ljava/util/List;
public static final fun compileAndLintWithContext (Lio/gitlab/arturbosch/detekt/api/BaseRule;Lorg/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment;Ljava/lang/String;)Ljava/util/List;
public static final fun lint (Lio/gitlab/arturbosch/detekt/api/BaseRule;Ljava/lang/String;)Ljava/util/List;
public static final fun lint (Lio/gitlab/arturbosch/detekt/api/BaseRule;Ljava/nio/file/Path;)Ljava/util/List;
public static final fun lint (Lio/gitlab/arturbosch/detekt/api/BaseRule;Lorg/jetbrains/kotlin/psi/KtFile;)Ljava/util/List;
public static final fun lintWithContext (Lio/gitlab/arturbosch/detekt/api/BaseRule;Lorg/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment;Ljava/lang/String;[Ljava/lang/String;)Ljava/util/List;
}
public class io/gitlab/arturbosch/detekt/test/TestConfig : io/gitlab/arturbosch/detekt/api/Config {
public static final field Companion Lio/gitlab/arturbosch/detekt/test/TestConfig$Companion;
public fun <init> ()V
public fun <init> (Ljava/util/Map;)V
public synthetic fun <init> (Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun getParentPath ()Ljava/lang/String;
protected final fun parseList (Ljava/lang/String;)Ljava/util/List;
public synthetic fun subConfig (Ljava/lang/String;)Lio/gitlab/arturbosch/detekt/api/Config;
public fun subConfig (Ljava/lang/String;)Lio/gitlab/arturbosch/detekt/test/TestConfig;
public fun valueOrDefault (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
public fun valueOrNull (Ljava/lang/String;)Ljava/lang/Object;
}
public final class io/gitlab/arturbosch/detekt/test/TestConfig$Companion {
public final fun invoke ([Lkotlin/Pair;)Lio/gitlab/arturbosch/detekt/test/TestConfig;
}
public final class io/gitlab/arturbosch/detekt/test/ThresholdedCodeSmellAssert : org/assertj/core/api/AbstractAssert {
public fun <init> (Lio/gitlab/arturbosch/detekt/api/ThresholdedCodeSmell;)V
public final fun hasThreshold (I)V
public final fun hasValue (I)V
public final fun withThreshold (I)Lio/gitlab/arturbosch/detekt/test/ThresholdedCodeSmellAssert;
public final fun withValue (I)Lio/gitlab/arturbosch/detekt/test/ThresholdedCodeSmellAssert;
}
public final class io/gitlab/arturbosch/detekt/test/ThresholdedCodeSmellAssertKt {
public static final fun assertThat (Lio/gitlab/arturbosch/detekt/api/ThresholdedCodeSmell;)Lio/gitlab/arturbosch/detekt/test/ThresholdedCodeSmellAssert;
public static final fun isThresholded (Lio/gitlab/arturbosch/detekt/test/FindingAssert;)Lio/gitlab/arturbosch/detekt/test/ThresholdedCodeSmellAssert;
}

View File

@@ -1,5 +1,6 @@
plugins {
id("module")
alias(libs.plugins.binaryCompatibilityValidator)
}
dependencies {

View File

@@ -3,8 +3,8 @@ package io.gitlab.arturbosch.detekt.test
import io.github.detekt.test.utils.KotlinScriptEngine
import io.github.detekt.test.utils.compileContentForTest
import io.github.detekt.test.utils.compileForTest
import io.gitlab.arturbosch.detekt.api.BaseRule
import io.gitlab.arturbosch.detekt.api.Finding
import io.gitlab.arturbosch.detekt.api.internal.BaseRule
import io.gitlab.arturbosch.detekt.api.internal.CompilerResources
import org.intellij.lang.annotations.Language
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment