-
Notifications
You must be signed in to change notification settings - Fork 50
/
FormatWorkerAction.kt
77 lines (67 loc) · 3.27 KB
/
FormatWorkerAction.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
package org.jmailen.gradle.kotlinter.tasks.format
import com.pinterest.ktlint.core.Code
import com.pinterest.ktlint.core.KtLintRuleEngine
import org.gradle.api.logging.LogLevel
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.defaultRuleSetProviders
import org.jmailen.gradle.kotlinter.support.editorConfigOverride
import org.jmailen.gradle.kotlinter.support.resetEditorconfigCacheIfNeeded
import org.jmailen.gradle.kotlinter.support.resolveRuleProviders
import org.jmailen.gradle.kotlinter.tasks.FormatTask
import java.io.File
abstract class FormatWorkerAction : WorkAction<FormatWorkerParameters> {
private val logger: Logger = DefaultContextAwareTaskLogger(Logging.getLogger(FormatTask::class.java))
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()
private val output: File? = parameters.output.asFile.orNull
override fun execute() {
val ktLintEngine = KtLintRuleEngine(
ruleProviders = resolveRuleProviders(defaultRuleSetProviders),
editorConfigOverride = editorConfigOverride(ktLintParams),
)
ktLintEngine.resetEditorconfigCacheIfNeeded(
changedEditorconfigFiles = parameters.changedEditorConfigFiles,
logger = logger,
)
val fixes = mutableListOf<String>()
try {
files.forEach { file ->
val sourceText = file.readText()
val relativePath = file.toRelativeString(projectDirectory)
logger.log(LogLevel.DEBUG, "$name checking format: $relativePath")
if (file.extension !in supportedExtensions) {
logger.log(LogLevel.DEBUG, "$name ignoring non Kotlin file: $relativePath")
return@forEach
}
val formattedText = ktLintEngine.format(Code.CodeFile(file)) { error, corrected ->
val msg = when (corrected) {
true -> "${file.path}:${error.line}:${error.col}: Format fixed > [${error.ruleId}] ${error.detail}"
false -> "${file.path}:${error.line}:${error.col}: Format could not fix > [${error.ruleId}] ${error.detail}"
}
logger.log(LogLevel.QUIET, msg)
fixes.add(msg)
}
if (!formattedText.contentEquals(sourceText)) {
logger.log(LogLevel.QUIET, "${file.path}: Format fixed")
file.writeText(formattedText)
}
}
} catch (t: Throwable) {
throw KotlinterError("format worker execution error", t)
}
output?.writeText(
when (fixes.isEmpty()) {
true -> "ok"
false -> fixes.joinToString("\n")
},
)
}
}
private val supportedExtensions = setOf("kt", "kts")