-
Notifications
You must be signed in to change notification settings - Fork 50
/
LintWorkerAction.kt
90 lines (81 loc) · 3.88 KB
/
LintWorkerAction.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package org.jmailen.gradle.kotlinter.tasks.lint
import com.pinterest.ktlint.core.KtLint
import com.pinterest.ktlint.core.LintError
import com.pinterest.ktlint.core.Reporter
import com.pinterest.ktlint.core.RuleSet
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging
import org.gradle.internal.logging.slf4j.DefaultContextAwareTaskLogger
import org.gradle.workers.WorkAction
import org.jmailen.gradle.kotlinter.support.KotlinterError
import org.jmailen.gradle.kotlinter.support.KtLintParams
import org.jmailen.gradle.kotlinter.support.LintFailure
import org.jmailen.gradle.kotlinter.support.defaultRuleSetProviders
import org.jmailen.gradle.kotlinter.support.reporterFor
import org.jmailen.gradle.kotlinter.support.reporterPathFor
import org.jmailen.gradle.kotlinter.support.resolveRuleSets
import org.jmailen.gradle.kotlinter.support.userData
import org.jmailen.gradle.kotlinter.tasks.LintTask
import java.io.File
abstract class LintWorkerAction : WorkAction<LintWorkerParameters> {
private val logger: Logger = DefaultContextAwareTaskLogger(Logging.getLogger(LintTask::class.java))
private val reporters: List<Reporter> = parameters.reporters.get().map { (reporterName, outputPath) ->
reporterFor(reporterName, outputPath)
}
private val files: List<File> = parameters.files.toList()
private val projectDirectory: File = parameters.projectDirectory.asFile.get()
private val name: String = parameters.name.get()
private val ktLintParams: KtLintParams = parameters.ktLintParams.get()
override fun execute() {
var hasError = false
try {
reporters.onEach { it.beforeAll() }
files.forEach { file ->
val ruleSets = resolveRuleSets(defaultRuleSetProviders, ktLintParams.experimentalRules)
val relativePath = file.toRelativeString(projectDirectory)
reporters.onEach { it.before(relativePath) }
logger.debug("$name linting: $relativePath")
val lintFunc = when (file.extension) {
"kt" -> ::lintKt
"kts" -> ::lintKts
else -> {
logger.debug("$name ignoring non Kotlin file: $relativePath")
null
}
}
lintFunc?.invoke(file, ruleSets) { error ->
hasError = true
reporters.onEach { reporter ->
// some reporters want relative paths, some want absolute
val filePath = reporterPathFor(reporter, file, projectDirectory)
reporter.onLintError(filePath, error, false)
}
logger.quiet("${file.path}:${error.line}:${error.col}: Lint error > [${error.ruleId}] ${error.detail}")
}
reporters.onEach { it.after(relativePath) }
}
reporters.onEach { it.afterAll() }
} catch (t: Throwable) {
throw KotlinterError("lint worker execution error", t)
}
if (hasError) {
throw LintFailure("kotlin source failed lint check")
}
}
private fun lintKt(file: File, ruleSets: List<RuleSet>, onError: (error: LintError) -> Unit) =
lint(file, ruleSets, onError, false)
private fun lintKts(file: File, ruleSets: List<RuleSet>, onError: (error: LintError) -> Unit) =
lint(file, ruleSets, onError, true)
private fun lint(file: File, ruleSets: List<RuleSet>, onError: ErrorHandler, script: Boolean) =
KtLint.lint(
KtLint.Params(
fileName = file.path,
text = file.readText(),
ruleSets = ruleSets,
script = script,
userData = userData(ktLintParams),
cb = { error, _ -> onError(error) }
)
)
}
typealias ErrorHandler = (error: LintError) -> Unit