Exclude checking for unimplemented method for binary origin classes

Fixed #KT-34971
This commit is contained in:
Igor Yakovlev
2019-11-21 17:29:25 +03:00
parent 8d5e5210a6
commit 12f29bacab
@@ -15,9 +15,11 @@ import com.intellij.lang.annotation.Annotation
import com.intellij.lang.annotation.AnnotationHolder
import com.intellij.lang.annotation.Annotator
import com.intellij.psi.*
import org.jetbrains.kotlin.asJava.KtLightClassMarker
import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME
import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_DEFAULT_FQ_NAME
import org.jetbrains.kotlin.utils.ifEmpty
@@ -46,6 +48,7 @@ class UnimplementedKotlinInterfaceMemberAnnotator : Annotator {
val signaturesVisibleThroughKotlinSuperClass = kotlinSuperClass?.visibleSignatures ?: emptyList()
return signaturesFromKotlinInterfaces.firstOrNull {
it !in signaturesVisibleThroughKotlinSuperClass &&
!it.method.isBinaryOrigin &&
it.method.modifierList.annotations.none { annotation ->
val qualifiedName = annotation.qualifiedName
qualifiedName == JVM_DEFAULT_FQ_NAME.asString() || qualifiedName == JVM_STATIC_ANNOTATION_FQ_NAME.asString()
@@ -53,6 +56,8 @@ class UnimplementedKotlinInterfaceMemberAnnotator : Annotator {
}?.method as? KtLightMethod
}
private val PsiMethod.isBinaryOrigin get() = (containingClass as? KtLightClassMarker)?.originKind == LightClassOriginKind.BINARY
private fun report(method: KtLightMethod, holder: AnnotationHolder, psiClass: PsiClass) {
val key = if (psiClass is PsiEnumConstantInitializer) "enum.constant.should.implement.method" else "class.must.be.abstract"
val message = JavaErrorMessages.message(