Skip to content

Commit

Permalink
Remove ability to create AnalysisResult by passing source code and fi…
Browse files Browse the repository at this point in the history
…lename (#7255)

* Remove ability to create AnalysisResult by passing source code and filename

Calling detekt from production code should only ever pass a KtFile or a
Path (from which a KtFile can be created).

Creating KtFile from text directly is only required from tests.

* Move createKtFile to KtTestCompiler

* Remove unused function
  • Loading branch information
3flex committed May 7, 2024
1 parent 5b83dc3 commit f1b1bb1
Show file tree
Hide file tree
Showing 6 changed files with 10 additions and 30 deletions.
Expand Up @@ -14,7 +14,6 @@ import io.gitlab.arturbosch.detekt.core.ProcessingSettings
import io.gitlab.arturbosch.detekt.core.config.check
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.BindingContext
import kotlin.io.path.Path

class AnalysisFacade(
private val spec: ProcessingSpec
Expand All @@ -24,11 +23,6 @@ class AnalysisFacade(
DefaultLifecycle(spec.getDefaultConfiguration(), it, inputPathsToKtFiles)
}

override fun run(sourceCode: String, filename: String): AnalysisResult =
runAnalysis {
DefaultLifecycle(spec.getDefaultConfiguration(), it, contentToKtFile(sourceCode, Path(filename)))
}

override fun run(files: Collection<KtFile>, bindingContext: BindingContext): AnalysisResult =
runAnalysis {
DefaultLifecycle(
Expand Down
Expand Up @@ -3,18 +3,9 @@ package io.gitlab.arturbosch.detekt.core.tooling
import io.github.detekt.parser.KtCompiler
import io.gitlab.arturbosch.detekt.core.ProcessingSettings
import org.jetbrains.kotlin.psi.KtFile
import java.nio.file.Path
import kotlin.io.path.isRegularFile

typealias ParsingStrategy = (settings: ProcessingSettings) -> List<KtFile>

fun contentToKtFile(content: String, path: Path): ParsingStrategy = { settings ->
require(path.isRegularFile()) { "Given sub path ($path) should be a regular file!" }
listOf(
KtCompiler(settings.environment).createKtFile(content, path)
)
}

val inputPathsToKtFiles: ParsingStrategy = { settings ->
val compiler = KtCompiler(settings.environment)
settings.spec.projectSpec.inputPaths.map { path ->
Expand Down
@@ -1,21 +1,15 @@
package io.github.detekt.parser

import org.intellij.lang.annotations.Language
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.com.intellij.openapi.util.text.StringUtilRt
import org.jetbrains.kotlin.com.intellij.psi.util.PsiUtilCore
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtPsiFactory
import java.nio.file.Path
import kotlin.io.path.isRegularFile
import kotlin.io.path.name

open class KtCompiler(
protected val environment: KotlinCoreEnvironment = createKotlinCoreEnvironment(printStream = System.err)
) {

protected val psiFileFactory = KtPsiFactory(environment.project, markGenerated = false)

fun compile(path: Path): KtFile {
require(path.isRegularFile()) { "Given path '$path' should be a regular file!" }

Expand All @@ -24,7 +18,4 @@ open class KtCompiler(
"$path is not a Kotlin file"
}
}

fun createKtFile(@Language("kotlin") content: String, path: Path): KtFile =
psiFileFactory.createPhysicalFile(path.name, StringUtilRt.convertLineSeparators(content))
}
Expand Up @@ -2,6 +2,7 @@ package io.github.detekt.test.utils

import io.github.detekt.parser.KtCompiler
import kotlinx.coroutines.CoroutineScope
import org.intellij.lang.annotations.Language
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
Expand All @@ -10,18 +11,24 @@ import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoots
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoot
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
import org.jetbrains.kotlin.cli.jvm.config.configureJdkClasspathRoots
import org.jetbrains.kotlin.com.intellij.openapi.project.Project
import org.jetbrains.kotlin.com.intellij.openapi.util.Disposer
import org.jetbrains.kotlin.com.intellij.openapi.util.text.StringUtilRt
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtPsiFactory
import java.io.File
import java.nio.file.Path
import kotlin.io.path.name

/**
* Test compiler extends kt compiler and adds ability to compile from text content.
*/
internal object KtTestCompiler : KtCompiler() {

private val psiFileFactory = KtPsiFactory(environment.project, markGenerated = false)

/**
* Not sure why but this function only works from this context.
* Somehow the Kotlin language was not yet initialized.
Expand Down Expand Up @@ -55,7 +62,8 @@ internal object KtTestCompiler : KtCompiler() {
return KotlinCoreEnvironmentWrapper(kotlinCoreEnvironment, parentDisposable)
}

fun project(): Project = environment.project
fun createKtFile(@Language("kotlin") content: String, path: Path): KtFile =
psiFileFactory.createPhysicalFile(path.name, StringUtilRt.convertLineSeparators(content))

private fun kotlinStdLibPath(): File {
return File(CharRange::class.java.protectionDomain.codeSource.location.path)
Expand Down
1 change: 0 additions & 1 deletion detekt-tooling/api/detekt-tooling.api
Expand Up @@ -35,7 +35,6 @@ public final class io/github/detekt/tooling/api/DefaultConfigurationProvider$Com

public abstract interface class io/github/detekt/tooling/api/Detekt {
public abstract fun run ()Lio/github/detekt/tooling/api/AnalysisResult;
public abstract fun run (Ljava/lang/String;Ljava/lang/String;)Lio/github/detekt/tooling/api/AnalysisResult;
public abstract fun run (Ljava/util/Collection;Lorg/jetbrains/kotlin/resolve/BindingContext;)Lio/github/detekt/tooling/api/AnalysisResult;
}

Expand Down
Expand Up @@ -13,9 +13,6 @@ interface Detekt {
// Used by detekt-cli
fun run(): AnalysisResult

// Used by detekt-intellij-plugin
fun run(sourceCode: String, filename: String): AnalysisResult

// Used by detekt-compiler-plugin
fun run(files: Collection<KtFile>, bindingContext: BindingContext): AnalysisResult
}

0 comments on commit f1b1bb1

Please sign in to comment.