diff --git a/tests/Codegen/src/com/android/codegentest/SampleDataClass.java b/tests/Codegen/src/com/android/codegentest/SampleDataClass.java index b30fde4e9c477..30bb3ef5456ba 100644 --- a/tests/Codegen/src/com/android/codegentest/SampleDataClass.java +++ b/tests/Codegen/src/com/android/codegentest/SampleDataClass.java @@ -1798,7 +1798,7 @@ public final class SampleDataClass implements Parcelable { } @DataClass.Generated( - time = 1565048798524L, + time = 1565126122525L, codegenVersion = "1.0.0", sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleDataClass.java", inputSignatures = "public static final java.lang.String STATE_NAME_UNDEFINED\npublic static final java.lang.String STATE_NAME_ON\npublic static final java.lang.String STATE_NAME_OFF\npublic static final int STATE_UNDEFINED\npublic static final int STATE_ON\npublic static final int STATE_OFF\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_AUGMENTED_REQUEST\nprivate int mNum\nprivate int mNum2\nprivate int mNum4\nprivate @android.annotation.Nullable java.lang.String mName\nprivate @android.annotation.NonNull java.lang.String mName2\nprivate @android.annotation.NonNull java.lang.String mName4\nprivate @android.annotation.Nullable android.view.accessibility.AccessibilityNodeInfo mOtherParcelable\nprivate @com.android.internal.util.DataClass.ParcelWith(com.android.codegentest.MyDateParcelling.class) @android.annotation.NonNull java.util.Date mDate\nprivate @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForPattern.class) @android.annotation.NonNull java.util.regex.Pattern mPattern\nprivate @android.annotation.NonNull java.util.List mLinkAddresses2\nprivate @com.android.internal.util.DataClass.PluralOf(\"linkAddress\") @android.annotation.NonNull java.util.ArrayList mLinkAddresses\nprivate @android.annotation.Nullable android.net.LinkAddress[] mLinkAddresses4\nprivate @com.android.codegentest.SampleDataClass.StateName @android.annotation.NonNull java.lang.String mStateName\nprivate @com.android.codegentest.SampleDataClass.RequestFlags int mFlags\nprivate @com.android.codegentest.SampleDataClass.State int mState\npublic @android.annotation.NonNull java.lang.CharSequence charSeq\nprivate final @android.annotation.Nullable android.net.LinkAddress[] mLinkAddresses5\nprivate transient android.net.LinkAddress[] mLinkAddresses6\ntransient int[] mTmpStorage\nprivate @android.annotation.StringRes int mStringRes\nprivate @android.annotation.IntRange(from=0L, to=6L) int mDayOfWeek\nprivate @android.annotation.Size(2L) @android.annotation.NonNull @com.android.internal.util.DataClass.Each @android.annotation.FloatRange(from=0.0) float[] mCoords\nprivate static java.lang.String defaultName4()\nprivate int[] lazyInitTmpStorage()\npublic android.net.LinkAddress[] getLinkAddresses4()\nprivate boolean patternEquals(java.util.regex.Pattern)\nprivate int patternHashCode()\nprivate void onConstructed()\npublic void dump(java.io.PrintWriter)\nclass SampleDataClass extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genConstructor=true, genEqualsHashCode=true, genToString=true, genForEachField=true, genSetters=true)") diff --git a/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java b/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java index d88035c31caea..11f03a72c051b 100644 --- a/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java +++ b/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java @@ -176,7 +176,7 @@ public class SampleWithCustomBuilder { } @DataClass.Generated( - time = 1565048799396L, + time = 1565126123496L, codegenVersion = "1.0.0", sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java", inputSignatures = " long delayAmount\n @android.annotation.NonNull java.util.concurrent.TimeUnit delayUnit\n long creationTimestamp\nclass SampleWithCustomBuilder extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genBuilder=true)\nabstract com.android.codegentest.SampleWithCustomBuilder.Builder setDelayAmount(long)\npublic abstract com.android.codegentest.SampleWithCustomBuilder.Builder setDelayUnit(java.util.concurrent.TimeUnit)\npublic com.android.codegentest.SampleWithCustomBuilder.Builder setDelay(long,java.util.concurrent.TimeUnit)\nclass BaseBuilder extends java.lang.Object implements []") diff --git a/tools/codegen/src/com/android/codegen/ClassInfo.kt b/tools/codegen/src/com/android/codegen/ClassInfo.kt index 578fb28984800..5061be2091e55 100644 --- a/tools/codegen/src/com/android/codegen/ClassInfo.kt +++ b/tools/codegen/src/com/android/codegen/ClassInfo.kt @@ -1,22 +1,37 @@ package com.android.codegen -import com.github.javaparser.JavaParser import com.github.javaparser.ParseProblemException +import com.github.javaparser.ParseResult +import com.github.javaparser.ast.CompilationUnit import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration open class ClassInfo(val sourceLines: List) { private val userSourceCode = (sourceLines + "}").joinToString("\n") - val fileAst = try { - JavaParser.parse(userSourceCode)!! + val fileAst: CompilationUnit = try { + JAVA_PARSER.parse(userSourceCode).throwIfFailed() } catch (e: ParseProblemException) { - throw RuntimeException("Failed to parse code:\n" + + throw parseFailed(cause = e) + } + + fun ParseResult.throwIfFailed(): T { + if (problems.isNotEmpty()) { + throw parseFailed( + desc = this@throwIfFailed.problems.joinToString("\n"), + cause = this@throwIfFailed.problems.mapNotNull { it.cause.orElse(null) }.firstOrNull()) + } + return result.get() + } + + private fun parseFailed(cause: Throwable? = null, desc: String = ""): RuntimeException { + return RuntimeException("Failed to parse code:\n" + userSourceCode .lines() .mapIndexed { lnNum, ln -> "/*$lnNum*/$ln" } - .joinToString("\n"), - e) + .joinToString("\n") + "\n$desc", + cause) } + val classAst = fileAst.types[0] as ClassOrInterfaceDeclaration val nestedClasses = classAst.members.filterIsInstance() diff --git a/tools/codegen/src/com/android/codegen/ClassPrinter.kt b/tools/codegen/src/com/android/codegen/ClassPrinter.kt index f1645ea9a3bb7..22b5d8815e7d3 100644 --- a/tools/codegen/src/com/android/codegen/ClassPrinter.kt +++ b/tools/codegen/src/com/android/codegen/ClassPrinter.kt @@ -42,7 +42,7 @@ class ClassPrinter( init { val fieldsWithMissingNullablity = fields.filter { field -> !field.isPrimitive - && Modifier.TRANSIENT !in field.fieldAst.modifiers + && field.fieldAst.modifiers.none { it.keyword == Modifier.Keyword.TRANSIENT } && "@$Nullable" !in field.annotations && "@$NonNull" !in field.annotations } diff --git a/tools/codegen/src/com/android/codegen/FieldInfo.kt b/tools/codegen/src/com/android/codegen/FieldInfo.kt index 74e79489ad7d0..6b0009ccff76d 100644 --- a/tools/codegen/src/com/android/codegen/FieldInfo.kt +++ b/tools/codegen/src/com/android/codegen/FieldInfo.kt @@ -1,6 +1,5 @@ package com.android.codegen -import com.github.javaparser.JavaParser import com.github.javaparser.ast.body.FieldDeclaration import com.github.javaparser.ast.expr.ClassExpr import com.github.javaparser.ast.expr.Name @@ -115,8 +114,9 @@ data class FieldInfo( classPrinter { fieldAst.addAnnotation(SingleMemberAnnotationExpr( Name(ParcelWith), - ClassExpr(JavaParser.parseClassOrInterfaceType( - "$Parcelling.BuiltIn.For$FieldClass")))) + ClassExpr(JAVA_PARSER + .parseClassOrInterfaceType("$Parcelling.BuiltIn.For$FieldClass") + .throwIfFailed()))) } } fieldAst.annotations.map { it.removeComment().toString() } diff --git a/tools/codegen/src/com/android/codegen/InputSignaturesComputation.kt b/tools/codegen/src/com/android/codegen/InputSignaturesComputation.kt index 1e7a2674006bd..1b514d7a74a0f 100644 --- a/tools/codegen/src/com/android/codegen/InputSignaturesComputation.kt +++ b/tools/codegen/src/com/android/codegen/InputSignaturesComputation.kt @@ -18,7 +18,7 @@ private fun ClassPrinter.generateInputSignaturesForClass(classAst: ClassOrInterf return classAst.fields.map { fieldAst -> buildString { - append(fieldAst.modifiers.joinToString(" ") { it.asString() }) + append(fieldAst.modifiers.joinToString(" ") { it.keyword.asString() }) append(" ") append(annotationsToString(fieldAst)) append(" ") @@ -28,7 +28,7 @@ private fun ClassPrinter.generateInputSignaturesForClass(classAst: ClassOrInterf } } + classAst.methods.map { methodAst -> buildString { - append(methodAst.modifiers.joinToString(" ") { it.asString() }) + append(methodAst.modifiers.joinToString(" ") { it.keyword.asString() }) append(" ") append(annotationsToString(methodAst)) append(" ") diff --git a/tools/codegen/src/com/android/codegen/Main.kt b/tools/codegen/src/com/android/codegen/Main.kt index f71bfd302d2e4..0f932f3c34e17 100755 --- a/tools/codegen/src/com/android/codegen/Main.kt +++ b/tools/codegen/src/com/android/codegen/Main.kt @@ -1,5 +1,6 @@ package com.android.codegen +import com.github.javaparser.JavaParser import java.io.File @@ -14,6 +15,7 @@ val BUILTIN_SPECIAL_PARCELLINGS = listOf("Pattern") const val FLAG_BUILDER_PROTECTED_SETTERS = "--builder-protected-setters" const val FLAG_NO_FULL_QUALIFIERS = "--no-full-qualifiers" +val JAVA_PARSER = JavaParser() /** @see [FeatureFlag] */ val USAGE = """ diff --git a/tools/codegen/src/com/android/codegen/Utils.kt b/tools/codegen/src/com/android/codegen/Utils.kt index 73ceac41682ec..a1f068afa29a5 100644 --- a/tools/codegen/src/com/android/codegen/Utils.kt +++ b/tools/codegen/src/com/android/codegen/Utils.kt @@ -79,7 +79,7 @@ fun currentTimestamp() = DateTimeFormatter .withZone(ZoneId.systemDefault()) .format(Instant.now()) -val NodeWithModifiers<*>.visibility get() = Modifier.getAccessSpecifier(modifiers) +val NodeWithModifiers<*>.visibility get() = accessSpecifier fun abort(msg: String): Nothing { System.err.println("ERROR: $msg") @@ -88,4 +88,3 @@ fun abort(msg: String): Nothing { } fun bitAtExpr(bitIndex: Int) = "0x${java.lang.Long.toHexString(1L shl bitIndex)}" -