Skip to content

Commit 3d4d873

Browse files
neetopiating-yuan
authored andcommitted
extract KspOptions into common-util module
(cherry picked from commit 027b602)
1 parent 5ae93b5 commit 3d4d873

File tree

2 files changed

+264
-260
lines changed

2 files changed

+264
-260
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,264 @@
1+
package com.google.devtools.ksp
2+
3+
import org.jetbrains.kotlin.compiler.plugin.AbstractCliOption
4+
import org.jetbrains.kotlin.config.ApiVersion
5+
import org.jetbrains.kotlin.config.LanguageVersion
6+
import org.jetbrains.kotlin.config.toKotlinVersion
7+
import java.io.File
8+
9+
class KspOptions(
10+
val projectBaseDir: File,
11+
val compileClasspath: List<File>,
12+
val javaSourceRoots: List<File>,
13+
14+
val classOutputDir: File,
15+
val javaOutputDir: File,
16+
val kotlinOutputDir: File,
17+
val resourceOutputDir: File,
18+
19+
val processingClasspath: List<File>,
20+
val processors: List<String>,
21+
22+
val processingOptions: Map<String, String>,
23+
24+
val knownModified: List<File>,
25+
val knownRemoved: List<File>,
26+
27+
val cachesDir: File,
28+
val kspOutputDir: File,
29+
val incremental: Boolean,
30+
val incrementalLog: Boolean,
31+
val allWarningsAsErrors: Boolean,
32+
val withCompilation: Boolean,
33+
val returnOkOnError: Boolean,
34+
val changedClasses: List<String>,
35+
36+
val languageVersion: KotlinVersion,
37+
val apiVersion: KotlinVersion,
38+
val compilerVersion: KotlinVersion,
39+
) {
40+
class Builder {
41+
var projectBaseDir: File? = null
42+
val compileClasspath: MutableList<File> = mutableListOf()
43+
val javaSourceRoots: MutableList<File> = mutableListOf()
44+
45+
var classOutputDir: File? = null
46+
var javaOutputDir: File? = null
47+
var kotlinOutputDir: File? = null
48+
var resourceOutputDir: File? = null
49+
50+
val processingClasspath: MutableList<File> = mutableListOf()
51+
val processors: MutableList<String> = mutableListOf()
52+
53+
val processingOptions: MutableMap<String, String> = mutableMapOf()
54+
55+
val knownModified: MutableList<File> = mutableListOf()
56+
val knownRemoved: MutableList<File> = mutableListOf()
57+
58+
var cachesDir: File? = null
59+
var kspOutputDir: File? = null
60+
var incremental: Boolean = false
61+
var incrementalLog: Boolean = false
62+
var allWarningsAsErrors: Boolean = false
63+
var withCompilation: Boolean = false
64+
// Default is false. It can be turned on to workaround KT-30172.
65+
var returnOkOnError: Boolean = false
66+
var changedClasses: MutableList<String> = mutableListOf()
67+
68+
var languageVersion: KotlinVersion = LanguageVersion.LATEST_STABLE.toKotlinVersion()
69+
var apiVersion: KotlinVersion = ApiVersion.LATEST_STABLE.toKotlinVersion()
70+
var compilerVersion: KotlinVersion = KotlinVersion.CURRENT
71+
72+
fun build(): KspOptions {
73+
return KspOptions(
74+
projectBaseDir!!, compileClasspath, javaSourceRoots,
75+
classOutputDir!!,
76+
javaOutputDir!!,
77+
kotlinOutputDir!!,
78+
resourceOutputDir!!,
79+
processingClasspath, processors, processingOptions,
80+
knownModified, knownRemoved, cachesDir!!, kspOutputDir!!, incremental, incrementalLog,
81+
allWarningsAsErrors, withCompilation, returnOkOnError, changedClasses,
82+
languageVersion, apiVersion, compilerVersion
83+
)
84+
}
85+
}
86+
}
87+
88+
fun String?.toKotlinVersion(): KotlinVersion {
89+
if (this == null)
90+
return KotlinVersion.CURRENT
91+
92+
return split('-').first().split('.').map { it.toInt() }.let {
93+
when (it.size) {
94+
1 -> KotlinVersion(it[0], 0, 0)
95+
2 -> KotlinVersion(it[0], it[1], 0)
96+
3 -> KotlinVersion(it[0], it[1], it[2])
97+
else -> KotlinVersion.CURRENT
98+
}
99+
}
100+
}
101+
102+
fun ApiVersion.toKotlinVersion(): KotlinVersion = version.canonical.toKotlinVersion()
103+
104+
enum class KspCliOption(
105+
override val optionName: String,
106+
override val valueDescription: String,
107+
override val description: String,
108+
override val required: Boolean = false,
109+
override val allowMultipleOccurrences: Boolean = false
110+
) : AbstractCliOption {
111+
CLASS_OUTPUT_DIR_OPTION(
112+
"classOutputDir",
113+
"<classOutputDir>",
114+
"Dir of generated classes",
115+
false
116+
),
117+
118+
JAVA_OUTPUT_DIR_OPTION(
119+
"javaOutputDir",
120+
"<javaOutputDir>",
121+
"Dir of generated Java sources",
122+
false
123+
),
124+
125+
KOTLIN_OUTPUT_DIR_OPTION(
126+
"kotlinOutputDir",
127+
"<kotlinOutputDir>",
128+
"Dir of generated Kotlin sources",
129+
false
130+
),
131+
132+
RESOURCE_OUTPUT_DIR_OPTION(
133+
"resourceOutputDir",
134+
"<resourceOutputDir>",
135+
"Dir of generated resources",
136+
false
137+
),
138+
139+
CACHES_DIR_OPTION(
140+
"cachesDir",
141+
"<cachesDir>",
142+
"Dir of caches",
143+
false
144+
),
145+
146+
PROJECT_BASE_DIR_OPTION(
147+
"projectBaseDir",
148+
"<projectBaseDir>",
149+
"path to gradle project",
150+
false
151+
),
152+
153+
KSP_OUTPUT_DIR_OPTION(
154+
"kspOutputDir",
155+
"<kspOutputDir>",
156+
"root of ksp output dirs",
157+
false
158+
),
159+
160+
PROCESSING_OPTIONS_OPTION(
161+
"apoption",
162+
"<apOption>",
163+
"processor defined option",
164+
false,
165+
true
166+
),
167+
168+
PROCESSOR_CLASSPATH_OPTION(
169+
"apclasspath",
170+
"<classpath>",
171+
"processor classpath",
172+
false
173+
),
174+
175+
KNOWN_MODIFIED_OPTION(
176+
"knownModified",
177+
"<knownModified>",
178+
"known modified files",
179+
false,
180+
false
181+
),
182+
183+
KNOWN_REMOVED_OPTION(
184+
"knownRemoved",
185+
"<knownRemoved>",
186+
"known removed fiels",
187+
false,
188+
false
189+
),
190+
191+
INCREMENTAL_OPTION(
192+
"incremental",
193+
"<incremental>",
194+
"processing incrementally",
195+
false,
196+
false
197+
),
198+
199+
INCREMENTAL_LOG_OPTION(
200+
"incrementalLog",
201+
"<incrementalLog>",
202+
"log dirty files",
203+
false,
204+
false
205+
),
206+
207+
ALL_WARNINGS_AS_ERRORS_OPTION(
208+
"allWarningsAsErrors",
209+
"<allWarningsAsErrors>",
210+
"treat all warnings as errors",
211+
false,
212+
false
213+
),
214+
215+
WITH_COMPILATION_OPTION(
216+
"withCompilation",
217+
"<withCompilation>",
218+
"Run processors and compilation in a single compiler invocation",
219+
false,
220+
false
221+
),
222+
223+
CHANGED_CLASSES_OPTION(
224+
"changedClasses",
225+
"<changedClasses>",
226+
"canonical / dot-separated names of dirty classes in classpath",
227+
false,
228+
false
229+
),
230+
231+
RETURN_OK_ON_ERROR_OPTION(
232+
"returnOkOnError",
233+
"<returnOkOnError>",
234+
"Return OK even if there are errors",
235+
false,
236+
false
237+
),
238+
}
239+
240+
@Suppress("IMPLICIT_CAST_TO_ANY")
241+
fun KspOptions.Builder.processOption(option: KspCliOption, value: String) = when (option) {
242+
KspCliOption.PROCESSOR_CLASSPATH_OPTION -> processingClasspath += value.split(File.pathSeparator).map {
243+
File(it)
244+
}
245+
KspCliOption.CLASS_OUTPUT_DIR_OPTION -> classOutputDir = File(value)
246+
KspCliOption.JAVA_OUTPUT_DIR_OPTION -> javaOutputDir = File(value)
247+
KspCliOption.KOTLIN_OUTPUT_DIR_OPTION -> kotlinOutputDir = File(value)
248+
KspCliOption.RESOURCE_OUTPUT_DIR_OPTION -> resourceOutputDir = File(value)
249+
KspCliOption.CACHES_DIR_OPTION -> cachesDir = File(value)
250+
KspCliOption.KSP_OUTPUT_DIR_OPTION -> kspOutputDir = File(value)
251+
KspCliOption.PROJECT_BASE_DIR_OPTION -> projectBaseDir = File(value)
252+
KspCliOption.PROCESSING_OPTIONS_OPTION -> {
253+
val (k, v) = value.split('=', ignoreCase = false, limit = 2)
254+
processingOptions.put(k, v)
255+
}
256+
KspCliOption.KNOWN_MODIFIED_OPTION -> knownModified.addAll(value.split(File.pathSeparator).map { File(it) })
257+
KspCliOption.KNOWN_REMOVED_OPTION -> knownRemoved.addAll(value.split(File.pathSeparator).map { File(it) })
258+
KspCliOption.INCREMENTAL_OPTION -> incremental = value.toBoolean()
259+
KspCliOption.INCREMENTAL_LOG_OPTION -> incrementalLog = value.toBoolean()
260+
KspCliOption.ALL_WARNINGS_AS_ERRORS_OPTION -> allWarningsAsErrors = value.toBoolean()
261+
KspCliOption.WITH_COMPILATION_OPTION -> withCompilation = value.toBoolean()
262+
KspCliOption.CHANGED_CLASSES_OPTION -> changedClasses.addAll(value.split(':'))
263+
KspCliOption.RETURN_OK_ON_ERROR_OPTION -> returnOkOnError = value.toBoolean()
264+
}

0 commit comments

Comments
 (0)