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

Removed close outputStream as separate listener #1688

Merged
merged 9 commits into from
Jun 13, 2023
7 changes: 2 additions & 5 deletions diktat-api/src/main/kotlin/org/cqfn/diktat/DiktatRunner.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,12 @@ private typealias RunAction = (DiktatProcessor, DiktatProcessorListener) -> Unit
* @property diktatBaseline
* @property diktatBaselineGenerator
* @property diktatReporter
* @property diktatReporterCloser
*/
data class DiktatRunner(
val diktatProcessor: DiktatProcessor,
val diktatBaseline: DiktatBaseline,
private val diktatBaselineGenerator: DiktatProcessorListener,
val diktatReporter: DiktatReporter,
private val diktatReporterCloser: DiktatProcessorListener,
) {
private fun doRun(
args: DiktatRunnerArguments,
Expand All @@ -38,7 +36,6 @@ data class DiktatRunner(
DiktatProcessorListener(
args.loggingListener,
diktatReporter.skipKnownErrors(diktatBaseline),
diktatReporterCloser,
diktatBaselineGenerator,
errorCounter.countErrorsAsProcessorListener()
),
Expand All @@ -47,7 +44,7 @@ data class DiktatRunner(
}

/**
* Run `diktat fix` for all [files].
* Run `diktat fix` for all [DiktatRunnerArguments.files].
*
* @param args
* @param fileUpdateNotifier notifier about updated files
Expand All @@ -74,7 +71,7 @@ data class DiktatRunner(
}

/**
* Run `diktat check` for all [files].
* Run `diktat check` for all [DiktatRunnerArguments.files].
*
* @param args
* @return count of detected errors
Expand Down
15 changes: 4 additions & 11 deletions diktat-api/src/main/kotlin/org/cqfn/diktat/DiktatRunnerFactory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package org.cqfn.diktat
import org.cqfn.diktat.api.DiktatBaseline
import org.cqfn.diktat.api.DiktatBaselineFactory
import org.cqfn.diktat.api.DiktatProcessorListener
import org.cqfn.diktat.api.DiktatProcessorListener.Companion.closeAfterAllAsProcessorListener
import org.cqfn.diktat.api.DiktatReporter
import org.cqfn.diktat.api.DiktatReporterFactory
import org.cqfn.diktat.api.DiktatRuleSetFactory
Expand All @@ -29,7 +28,7 @@ class DiktatRunnerFactory(
val diktatRuleSet = diktatRuleSetFactory.create(args.configFileName)
val processor = diktatProcessorFactory(diktatRuleSet)
val (baseline, baselineGenerator) = resolveBaseline(args.baselineFile, args.sourceRootDir)
val (reporter, closer) = resolveReporter(
val reporter = resolveReporter(
args.reporterType, args.reporterOutput,
args.colorNameInPlain, args.groupByFileInPlain,
args.sourceRootDir
Expand All @@ -39,7 +38,6 @@ class DiktatRunnerFactory(
diktatBaseline = baseline,
diktatBaselineGenerator = baselineGenerator,
diktatReporter = reporter,
diktatReporterCloser = closer,
)
}

Expand All @@ -62,13 +60,9 @@ class DiktatRunnerFactory(
colorNameInPlain: String?,
groupByFileInPlain: Boolean?,
sourceRootDir: Path,
): Pair<DiktatReporter, DiktatProcessorListener> {
val (outputStream, closeListener) = reporterOutput
?.let { it to it.closeAfterAllAsProcessorListener() }
?: run {
System.`out` to DiktatProcessorListener.empty
}
val actualReporter = if (reporterType == diktatReporterFactory.plainId) {
): DiktatReporter {
val outputStream = reporterOutput ?: System.`out`
return if (reporterType == diktatReporterFactory.plainId) {
diktatReporterFactory.createPlain(outputStream, sourceRootDir, colorNameInPlain, groupByFileInPlain)
} else {
require(colorNameInPlain == null) {
Expand All @@ -79,6 +73,5 @@ class DiktatRunnerFactory(
}
diktatReporterFactory(reporterType, outputStream, sourceRootDir)
}
return actualReporter to closeListener
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.cqfn.diktat.api

import java.io.OutputStream
import java.nio.file.Path
import java.util.concurrent.atomic.AtomicInteger

Expand Down Expand Up @@ -82,15 +81,5 @@ interface DiktatProcessorListener {
incrementAndGet()
}
}

/**
* @return An implementation of [DiktatProcessorListener] which closes [OutputStream] at the end
*/
fun OutputStream.closeAfterAllAsProcessorListener(): DiktatProcessorListener = object : DiktatProcessorListener {
override fun afterAll() {
[email protected]()
[email protected]()
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,12 @@ package org.cqfn.diktat.ktlint
import org.cqfn.diktat.api.DiktatBaseline
import org.cqfn.diktat.api.DiktatBaselineFactory
import org.cqfn.diktat.api.DiktatProcessorListener
import org.cqfn.diktat.api.DiktatProcessorListener.Companion.closeAfterAllAsProcessorListener
import org.cqfn.diktat.ktlint.DiktatReporterImpl.Companion.wrap

import com.pinterest.ktlint.cli.reporter.baseline.Baseline
import com.pinterest.ktlint.cli.reporter.baseline.BaselineReporter
import com.pinterest.ktlint.cli.reporter.baseline.BaselineReporterProvider
import com.pinterest.ktlint.cli.reporter.baseline.loadBaseline

import java.io.PrintStream
import java.nio.file.Path

import kotlin.io.path.absolutePathString
Expand All @@ -20,6 +18,8 @@ import kotlin.io.path.outputStream
* A factory to create or generate [DiktatBaseline] using `KtLint`
*/
class DiktatBaselineFactoryImpl : DiktatBaselineFactory {
private val baselineReporterProvider = BaselineReporterProvider()

override fun tryToLoad(
baselineFile: Path,
sourceRootDir: Path,
Expand All @@ -35,10 +35,6 @@ class DiktatBaselineFactoryImpl : DiktatBaselineFactory {
}

override fun generator(baselineFile: Path, sourceRootDir: Path): DiktatProcessorListener {
val outputStream = baselineFile.outputStream()
return DiktatProcessorListener(
BaselineReporter(PrintStream(outputStream)).wrap(sourceRootDir),
outputStream.closeAfterAllAsProcessorListener()
)
return baselineReporterProvider.get(baselineFile.outputStream(), emptyMap()).wrap(sourceRootDir)
Fixed Show fixed Hide fixed
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import com.pinterest.ktlint.cli.reporter.plain.Color
import com.pinterest.ktlint.cli.reporter.plain.PlainReporterProvider
import com.pinterest.ktlint.cli.reporter.sarif.SarifReporterProvider
import java.io.OutputStream
import java.io.PrintStream
import java.nio.file.Path
import kotlin.io.path.pathString

Expand Down Expand Up @@ -55,7 +54,7 @@ class DiktatReporterFactoryImpl : DiktatReporterFactory {
} else {
emptyMap()
}
return reporterProvider.get(outputStream.asPrintStream(), opt).wrap(sourceRootDir)
return reporterProvider.get(outputStream, opt).wrap(sourceRootDir)
}

override fun createPlain(
Expand All @@ -74,10 +73,6 @@ class DiktatReporterFactoryImpl : DiktatReporterFactory {
}
groupByFile?.let { put("group_by_file", it) }
}.mapValues { it.value.toString() }
return plainReporterProvider.get(outputStream.asPrintStream(), opt).wrap(sourceRootDir)
}

companion object {
private fun OutputStream.asPrintStream(): PrintStream = (this as? PrintStream) ?: PrintStream(this)
return plainReporterProvider.get(outputStream, opt).wrap(sourceRootDir)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,13 @@ import org.cqfn.diktat.api.DiktatRuleSet
import org.cqfn.diktat.common.config.rules.DIKTAT_RULE_SET_ID

import com.pinterest.ktlint.cli.reporter.core.api.KtlintCliError
import com.pinterest.ktlint.cli.reporter.core.api.ReporterProviderV2
import com.pinterest.ktlint.cli.reporter.core.api.ReporterV2
import com.pinterest.ktlint.rule.engine.api.LintError
import com.pinterest.ktlint.rule.engine.core.api.RuleId
import org.intellij.lang.annotations.Language
import java.io.OutputStream
import java.io.PrintStream

import java.nio.file.Path

Expand Down Expand Up @@ -159,3 +163,33 @@ fun lint(
isScript = false,
callback = cb.ignoreCorrectedErrors(),
)

/**
Fixed Show fixed Hide fixed
* @param out [OutputStream] for [ReporterV2]
* @param opt configuration for [ReporterV2]
* @return created [ReporterV2] which closes [out] in [ReporterV2.afterAll]
*/
fun <R : ReporterV2> ReporterProviderV2<R>.get(
out: OutputStream,
opt: Map<String, String>,
): ReporterV2 = get(out.printStream(), opt).closeAfterAll(out)

private fun OutputStream.printStream(): PrintStream = (this as? PrintStream) ?: PrintStream(this)
Fixed Show fixed Hide fixed

private fun ReporterV2.closeAfterAll(outputStream: OutputStream): ReporterV2 {
Fixed Show fixed Hide fixed
return object : ReporterV2 {
Fixed Show fixed Hide fixed
override fun beforeAll() = [email protected]()

override fun before(file: String) = [email protected](file)

override fun onLintError(file: String, ktlintCliError: KtlintCliError) = [email protected](file, ktlintCliError)

override fun after(file: String) = [email protected](file)

override fun afterAll() {
[email protected]()
outputStream.flush()
outputStream.close()
}
}
}