diff --git a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/JCTreeConverter.kt b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/JCTreeConverter.kt index 0228addfa35..a35e67f7d83 100644 --- a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/JCTreeConverter.kt +++ b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/JCTreeConverter.kt @@ -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 == "" val name = if (isConstructor) containingClassSimpleName else name(method.name) val typeParameters = JavacList.nil() @@ -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 diff --git a/plugins/kapt3/testData/converter/dataClass.txt b/plugins/kapt3/testData/converter/dataClass.txt index e8c46e43211..0a5898081a7 100644 --- a/plugins/kapt3/testData/converter/dataClass.txt +++ b/plugins/kapt3/testData/converter/dataClass.txt @@ -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; } diff --git a/plugins/kapt3/testData/converter/inheritanceSimple.txt b/plugins/kapt3/testData/converter/inheritanceSimple.txt index 2376c756985..9c8eb3b095e 100644 --- a/plugins/kapt3/testData/converter/inheritanceSimple.txt +++ b/plugins/kapt3/testData/converter/inheritanceSimple.txt @@ -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; }