Kapt3: Initialize final fields in class constructors
This commit is contained in:
committed by
Yan Zhulanow
parent
666a522fed
commit
edaadb0d48
@@ -98,7 +98,7 @@ class JCTreeConverter(context: Context, val classes: List<ClassNode>, val origin
|
||||
val implementing = mapValues(clazz.interfaces) { convertFqName(it) }
|
||||
|
||||
val fields = mapValues<FieldNode, JCTree>(clazz.fields) { convertField(it) }
|
||||
val methods = mapValues<MethodNode, JCTree>(clazz.methods) { convertMethod(it, simpleName) }
|
||||
val methods = mapValues<MethodNode, JCTree>(clazz.methods) { convertMethod(it, clazz, simpleName) }
|
||||
val nestedClasses = mapValues<InnerClassNode, JCTree>(clazz.innerClasses) { innerClass ->
|
||||
if (innerClass.outerName != clazz.name) return@mapValues null
|
||||
val innerClassNode = classes.firstOrNull { it.name == innerClass.name } ?: return@mapValues null
|
||||
@@ -122,7 +122,7 @@ class JCTreeConverter(context: Context, val classes: List<ClassNode>, val origin
|
||||
return treeMaker.VarDef(modifiers, name, type, initializer)
|
||||
}
|
||||
|
||||
private fun convertMethod(method: MethodNode, containingClassSimpleName: Name): JCMethodDecl? {
|
||||
private fun convertMethod(method: MethodNode, containingClass: ClassNode, containingClassSimpleName: Name): JCMethodDecl? {
|
||||
if (isSynthetic(method.access)) return null
|
||||
|
||||
val modifiers = convertModifiers(method.access, ElementKind.METHOD, method.visibleAnnotations, method.invisibleAnnotations)
|
||||
@@ -132,9 +132,10 @@ class JCTreeConverter(context: Context, val classes: List<ClassNode>, val origin
|
||||
val receiverParameter = null
|
||||
|
||||
val returnType = Type.getReturnType(method.desc)
|
||||
val returnTypeExpr = convertFqName(returnType.className)
|
||||
val returnTypeExpr = if (isConstructor) null else convertFqName(returnType.className)
|
||||
|
||||
val parametersInfo = method.getParametersInfo()
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val parameters = mapValues(parametersInfo) { info ->
|
||||
val modifiers = convertModifiers(info.access, ElementKind.PARAMETER, info.visibleAnnotations, info.invisibleAnnotations)
|
||||
val name = name(info.name)
|
||||
@@ -148,7 +149,20 @@ class JCTreeConverter(context: Context, val classes: List<ClassNode>, val origin
|
||||
|
||||
val body = if (defaultValue != null) {
|
||||
null
|
||||
} else if (isConstructor || returnType == Type.VOID_TYPE) {
|
||||
} else if (isConstructor) {
|
||||
var statements = JavacList.nil<JCStatement>()
|
||||
|
||||
for (field in containingClass.fields) {
|
||||
if ((field.access and Opcodes.ACC_FINAL) == 0) continue
|
||||
val type = Type.getType(field.desc)
|
||||
val assignment = treeMaker.Assign(
|
||||
convertFqName("this.${field.name}"),
|
||||
convertLiteralExpression(getDefaultValue(type)))
|
||||
statements = statements.append(treeMaker.Exec(assignment))
|
||||
}
|
||||
|
||||
treeMaker.Block(0, statements)
|
||||
} else if (returnType == Type.VOID_TYPE) {
|
||||
treeMaker.Block(0, JavacList.nil())
|
||||
} else {
|
||||
val returnStatement = treeMaker.Return(convertLiteralExpression(getDefaultValue(returnType)))
|
||||
|
||||
+5
-1
@@ -1,3 +1,4 @@
|
||||
|
||||
public final class User {
|
||||
private final java.lang.String firstName;
|
||||
private final java.lang.String secondName;
|
||||
@@ -18,7 +19,10 @@ public final class User {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void User(java.lang.String firstName, java.lang.String secondName, int age) {
|
||||
public /*missing*/ User(java.lang.String firstName, java.lang.String secondName, int age) {
|
||||
this.firstName = null;
|
||||
this.secondName = null;
|
||||
this.age = 0;
|
||||
}
|
||||
|
||||
public final java.lang.String component1() {
|
||||
|
||||
Reference in New Issue
Block a user