Kapt3: Do not generate body for abstract methods.

Add java.lang.Override annotation for overrides.
Ignore java.lang.Synthetic annotation.
This commit is contained in:
Yan Zhulanow
2016-10-26 02:08:53 +03:00
committed by Yan Zhulanow
parent 10cfde4ab9
commit 68c2e8d71d
3 changed files with 22 additions and 7 deletions
@@ -24,6 +24,7 @@ import com.sun.tools.javac.util.Name
import com.sun.tools.javac.util.Names
import com.sun.tools.javac.util.SharedNameTable
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny
@@ -55,6 +56,7 @@ class JCTreeConverter(
private val BLACKLISTED_ANNOTATATIONS = listOf(
"java.lang.Deprecated", "kotlin.Deprecated", // Deprecated annotations
"java.lang.Synthetic", //
"java.lang.annotation.", // Java annotations
"org.jetbrains.annotations.", // Nullable/NotNull, ReadOnly, Mutable
"kotlin.jvm.", "kotlin.Metadata" // Kotlin annotations from runtime
@@ -132,8 +134,17 @@ class JCTreeConverter(
private fun convertMethod(method: MethodNode, containingClass: ClassNode, containingClassSimpleName: Name): JCMethodDecl? {
if (isSynthetic(method.access)) return null
val descriptor = origins[method]?.descriptor as? CallableDescriptor ?: return null
val isOverridden = descriptor.overriddenDescriptors.isNotEmpty()
val visibleAnnotations = if (isOverridden) {
(method.visibleAnnotations ?: emptyList()) + AnnotationNode(Type.getType(Override::class.java).descriptor)
} else {
method.visibleAnnotations
}
val modifiers = convertModifiers(method.access, ElementKind.METHOD, visibleAnnotations, method.invisibleAnnotations)
val modifiers = convertModifiers(method.access, ElementKind.METHOD, method.visibleAnnotations, method.invisibleAnnotations)
val isConstructor = method.name == "<init>"
val name = if (isConstructor) containingClassSimpleName else name(method.name)
val typeParameters = JavacList.nil<JCTypeParameter>()
@@ -157,6 +168,8 @@ class JCTreeConverter(
val body = if (defaultValue != null) {
null
} else if ((method.access and Opcodes.ACC_ABSTRACT) > 0) {
null
} else if (isConstructor) {
// We already checked it in convertClass()
val declaration = origins[containingClass]?.descriptor as ClassDescriptor
+4
View File
@@ -20,6 +20,7 @@ public final class User {
}
public /*missing*/ User(java.lang.String firstName, java.lang.String secondName, int age) {
super();
this.firstName = null;
this.secondName = null;
this.age = 0;
@@ -41,14 +42,17 @@ public final class User {
return null;
}
@java.lang.Override()
public java.lang.String toString() {
return null;
}
@java.lang.Override()
public int hashCode() {
return 0;
}
@java.lang.Override()
public boolean equals(java.lang.Object p0) {
return false;
}
+4 -6
View File
@@ -1,3 +1,4 @@
public abstract interface Context {
}
@@ -15,9 +16,7 @@ public enum Result extends java.lang.Enum {
public static final Result SUCCESS;
public static final Result ERROR;
protected /*missing*/ Result(@java.lang.Synthetic()
java.lang.String $enum_name_or_ordinal$0, @java.lang.Synthetic()
int $enum_name_or_ordinal$1) {
protected /*missing*/ Result(java.lang.String $enum_name_or_ordinal$0, int $enum_name_or_ordinal$1) {
super(null, 0);
this.SUCCESS = null;
this.ERROR = null;
@@ -37,9 +36,7 @@ public enum Result extends java.lang.Enum {
public abstract class BaseClass {
public abstract Result doJob() {
return null;
}
public abstract Result doJob();
public /*missing*/ BaseClass(Context context, int num, boolean bool) {
super();
@@ -51,6 +48,7 @@ public abstract class BaseClass {
public final class Inheritor extends BaseClass {
@java.lang.Override()
public Result doJob() {
return null;
}