Skip to content

Commit 37b3257

Browse files
technoir42hotchemi
authored andcommitted
Incremental annotation processing for Kotlin (#626)
1 parent b4cc599 commit 37b3257

File tree

2 files changed

+11
-21
lines changed

2 files changed

+11
-21
lines changed

processor/src/main/kotlin/permissions/dispatcher/processor/PermissionsProcessor.kt

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import permissions.dispatcher.RuntimePermissions
44
import permissions.dispatcher.processor.impl.javaProcessorUnits
55
import permissions.dispatcher.processor.impl.kotlinProcessorUnits
66
import permissions.dispatcher.processor.util.findAndValidateProcessorUnit
7-
import java.io.File
87
import javax.annotation.processing.AbstractProcessor
98
import javax.annotation.processing.Filer
109
import javax.annotation.processing.ProcessingEnvironment
@@ -14,7 +13,6 @@ import javax.lang.model.element.Element
1413
import javax.lang.model.element.TypeElement
1514
import javax.lang.model.util.Elements
1615
import javax.lang.model.util.Types
17-
import javax.tools.Diagnostic
1816
import kotlin.properties.Delegates
1917

2018
/** Element Utilities, obtained from the processing environment */
@@ -24,11 +22,6 @@ var TYPE_UTILS: Types by Delegates.notNull()
2422

2523
class PermissionsProcessor : AbstractProcessor() {
2624

27-
companion object {
28-
// processingEnv.options[KAPT_KOTLIN_GENERATED_OPTION_NAME] returns generated/source/kaptKotlin/$sourceSetName
29-
const val KAPT_KOTLIN_GENERATED_OPTION_NAME = "kapt.kotlin.generated"
30-
}
31-
3225
/* Processing Environment helpers */
3326
private var filer: Filer by Delegates.notNull()
3427

@@ -68,21 +61,9 @@ class PermissionsProcessor : AbstractProcessor() {
6861
}
6962

7063
private fun processKotlin(element: Element, rpe: RuntimePermissionsElement, requestCodeProvider: RequestCodeProvider) {
71-
// FIXME: weirdly under kaptKotlin files is not recognized as source file on AS or IntelliJ
72-
// so as a workaround we generate .kt file in generated/source/kapt/$sourceSetName
73-
// ref: https://github.com/hotchemi/PermissionsDispatcher/issues/320#issuecomment-316175775
74-
val kaptGeneratedDirPath = processingEnv.options[KAPT_KOTLIN_GENERATED_OPTION_NAME]?.replace("kaptKotlin", "kapt")
75-
?: run {
76-
processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, "Can't find the target directory for generated Kotlin files.")
77-
return
78-
}
79-
val kaptGeneratedDir = File(kaptGeneratedDirPath)
80-
if (!kaptGeneratedDir.parentFile.exists()) {
81-
kaptGeneratedDir.parentFile.mkdirs()
82-
}
8364
val processorUnit = findAndValidateProcessorUnit(kotlinProcessorUnits, element)
8465
val kotlinFile = processorUnit.createFile(rpe, requestCodeProvider)
85-
kotlinFile.writeTo(kaptGeneratedDir)
66+
kotlinFile.writeTo(filer)
8667
}
8768

8869
private fun processJava(element: Element, rpe: RuntimePermissionsElement, requestCodeProvider: RequestCodeProvider) {

processor/src/main/kotlin/permissions/dispatcher/processor/impl/kotlin/KotlinBaseProcessorUnit.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ abstract class KotlinBaseProcessorUnit : KtProcessorUnit {
109109

110110
private fun createWithPermissionCheckFun(rpe: RuntimePermissionsElement, method: ExecutableElement): FunSpec {
111111
val builder = FunSpec.builder(withPermissionCheckMethodName(method))
112+
.addOriginatingElement(rpe.element)
112113
.addTypeVariables(rpe.ktTypeVariables)
113114
.receiver(rpe.ktTypeName)
114115
if (method.enclosingElement.isInternal) {
@@ -223,6 +224,7 @@ abstract class KotlinBaseProcessorUnit : KtProcessorUnit {
223224

224225
private fun createProceedPermissionRequestFun(rpe: RuntimePermissionsElement, needsMethod: ExecutableElement): FunSpec {
225226
val builder = FunSpec.builder(needsMethod.proceedOnShowRationaleMethodName())
227+
.addOriginatingElement(rpe.element)
226228
.addTypeVariables(rpe.ktTypeVariables)
227229
.receiver(rpe.ktTypeName)
228230
val targetParam = "this"
@@ -234,6 +236,7 @@ abstract class KotlinBaseProcessorUnit : KtProcessorUnit {
234236

235237
private fun createCancelPermissionRequestFun(rpe: RuntimePermissionsElement, onDenied: ExecutableElement, needsMethod: ExecutableElement): FunSpec {
236238
return FunSpec.builder(needsMethod.cancelOnShowRationaleMethodName())
239+
.addOriginatingElement(rpe.element)
237240
.addTypeVariables(rpe.ktTypeVariables)
238241
.receiver(rpe.ktTypeName)
239242
.addStatement("this.%N()", onDenied.simpleString())
@@ -255,6 +258,7 @@ abstract class KotlinBaseProcessorUnit : KtProcessorUnit {
255258
val requestCodeParam = "requestCode"
256259
val grantResultsParam = "grantResults"
257260
val builder = FunSpec.builder("onActivityResult")
261+
.addOriginatingElement(rpe.element)
258262
.addTypeVariables(rpe.ktTypeVariables)
259263
.receiver(rpe.ktTypeName)
260264
.addParameter(requestCodeParam, INT)
@@ -282,6 +286,7 @@ abstract class KotlinBaseProcessorUnit : KtProcessorUnit {
282286
val requestCodeParam = "requestCode"
283287
val grantResultsParam = "grantResults"
284288
val builder = FunSpec.builder("onRequestPermissionsResult")
289+
.addOriginatingElement(rpe.element)
285290
.addTypeVariables(rpe.ktTypeVariables)
286291
.receiver(rpe.ktTypeName)
287292
.addParameter(requestCodeParam, INT)
@@ -307,7 +312,7 @@ abstract class KotlinBaseProcessorUnit : KtProcessorUnit {
307312

308313

309314
private fun addResultCaseBody(builder: FunSpec.Builder, needsMethod: ExecutableElement, rpe: RuntimePermissionsElement, grantResultsParam: String) {
310-
val onDenied = rpe.findOnDeniedForNeeds(needsMethod)
315+
val onDenied = rpe.findOnDeniedForNeeds(needsMethod)
311316
val hasDenied = onDenied != null
312317
val needsPermissionParameter = needsMethod.getAnnotation(NeedsPermission::class.java).value[0]
313318
val permissionField = permissionFieldName(needsMethod)
@@ -418,6 +423,7 @@ abstract class KotlinBaseProcessorUnit : KtProcessorUnit {
418423
val superInterfaceName = if (hasParameters) "GrantableRequest" else "PermissionRequest"
419424

420425
val builder = TypeSpec.classBuilder(permissionRequestTypeName(rpe, needsMethod))
426+
.addOriginatingElement(rpe.element)
421427
.addTypeVariables(rpe.ktTypeVariables)
422428
.addSuperinterface(ClassName("permissions.dispatcher", superInterfaceName))
423429
.addModifiers(KModifier.PRIVATE)
@@ -447,6 +453,7 @@ abstract class KotlinBaseProcessorUnit : KtProcessorUnit {
447453

448454
// Add proceed() override
449455
val proceedFun = FunSpec.builder("proceed")
456+
.addOriginatingElement(rpe.element)
450457
.addModifiers(KModifier.OVERRIDE)
451458
.addStatement("val target = %N.get() ?: return", propName)
452459
val requestCodeField = requestCodeFieldName(needsMethod)
@@ -456,6 +463,7 @@ abstract class KotlinBaseProcessorUnit : KtProcessorUnit {
456463

457464
// Add cancel() override method
458465
val cancelFun = FunSpec.builder("cancel")
466+
.addOriginatingElement(rpe.element)
459467
.addModifiers(KModifier.OVERRIDE)
460468
val onDenied = rpe.findOnDeniedForNeeds(needsMethod)
461469
if (onDenied != null) {
@@ -468,6 +476,7 @@ abstract class KotlinBaseProcessorUnit : KtProcessorUnit {
468476
// For classes with additional parameters, add a "grant()" method
469477
if (hasParameters) {
470478
val grantFun = FunSpec.builder("grant")
479+
.addOriginatingElement(rpe.element)
471480
.addModifiers(KModifier.OVERRIDE)
472481
.addStatement("val target = %N.get() ?: return", propName)
473482

0 commit comments

Comments
 (0)