From a8fcdddf243af7931490c84b25fff4b0cd91ecb4 Mon Sep 17 00:00:00 2001 From: Donald Duo Zhao Date: Thu, 29 Jun 2023 23:17:04 +0000 Subject: [PATCH] Move to use reflection to access JDK8 APIs Currently, KAPT3 uses JDK internal API to build Java AST. Since the API is internal, it has changed in newer JDKs. So, for them, use reflection to access new API. #KT-59349 Fixed --- .../kotlin/kapt3/base/annotationProcessing.kt | 8 +++++--- .../jetbrains/kotlin/kapt3/base/javac/KaptJavaLog.kt | 10 +++++++++- .../org/jetbrains/kotlin/kapt3/base/util/java9Utils.kt | 5 +++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/annotationProcessing.kt b/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/annotationProcessing.kt index a569b31d9ab..75184f1f264 100644 --- a/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/annotationProcessing.kt +++ b/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/annotationProcessing.kt @@ -58,11 +58,11 @@ fun KaptContext.doAnnotationProcessing( return } + val initProcessAnnotationsMethod = JavaCompiler::class.java.declaredMethods.single { it.name == "initProcessAnnotations" } if (isJava9OrLater()) { - val initProcessAnnotationsMethod = JavaCompiler::class.java.declaredMethods.single { it.name == "initProcessAnnotations" } initProcessAnnotationsMethod.invoke(compiler, wrappedProcessors, emptyList(), emptyList()) } else { - compiler.initProcessAnnotations(wrappedProcessors) + initProcessAnnotationsMethod.invoke(compiler, wrappedProcessors) } if (logger.isVerbose) { @@ -92,7 +92,9 @@ fun KaptContext.doAnnotationProcessing( processAnnotationsMethod.invoke(compiler, analyzedFiles, additionalClassNames) compiler } else { - compiler.processAnnotations(analyzedFiles, additionalClassNames) + val processAnnotationsMethod = + compiler.javaClass.getMethod("processAnnotations", JavacList::class.java, JavacList::class.java) + processAnnotationsMethod.invoke(compiler, analyzedFiles, additionalClassNames) as JavaCompiler } } catch (e: AnnotationProcessingError) { throw KaptBaseError(KaptBaseError.Kind.EXCEPTION, e.cause ?: e) diff --git a/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/javac/KaptJavaLog.kt b/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/javac/KaptJavaLog.kt index 3085f66dfe7..af5d6c2aa00 100644 --- a/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/javac/KaptJavaLog.kt +++ b/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/javac/KaptJavaLog.kt @@ -263,7 +263,15 @@ private fun JCDiagnostic.Factory.errorJava9Aware( errorMethod.invoke(this, JCDiagnostic.DiagnosticFlag.MANDATORY, source, pos, key, args) as JCDiagnostic } else { - this.error(source, pos, key, *args) + val errorMethod = this::class.java.getDeclaredMethod( + "error", + DiagnosticSource::class.java, + JCDiagnostic.DiagnosticPosition::class.java, + String::class.java, + Array::class.java + ) + + errorMethod.invoke(this, source, pos, key, args) as JCDiagnostic } } diff --git a/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/util/java9Utils.kt b/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/util/java9Utils.kt index d5d8e015740..090c6f94a29 100644 --- a/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/util/java9Utils.kt +++ b/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/util/java9Utils.kt @@ -52,7 +52,8 @@ fun TreeMaker.TopLevelJava9Aware(packageClause: JCTree.JCExpression?, declaratio val allDeclarations = if (packageDecl != null) JavacList.of(packageDecl) + declarations else declarations topLevelMethod.invoke(this, allDeclarations) as JCTree.JCCompilationUnit } else { - TopLevel(JavacList.nil(), packageClause, declarations) + val topLevelMethod = TreeMaker::class.java.declaredMethods.single { it.name == "TopLevel" } + topLevelMethod.invoke(this, JavacList.nil(), packageClause, declarations) as JCTree.JCCompilationUnit } } @@ -60,6 +61,6 @@ fun JCTree.JCCompilationUnit.getPackageNameJava9Aware(): JCTree? { return if (isJava9OrLater()) { JCTree.JCCompilationUnit::class.java.getDeclaredMethod("getPackageName").invoke(this) as JCTree? } else { - this.packageName + this.packageName as JCTree? } } \ No newline at end of file