Show warnings for Java methods with external annotations when they called from Kotlin code

This commit is contained in:
Ilya Kirillov
2019-02-22 15:36:19 +03:00
parent ba9b3397d0
commit f1f6740ec9
17 changed files with 193 additions and 8 deletions
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.load.java.structure.impl;
import com.intellij.codeInsight.ExternalAnnotationsManager;
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
@@ -86,4 +87,11 @@ public class JavaAnnotationImpl extends JavaElementImpl<PsiAnnotation> implement
PsiElement resolved = referenceElement.resolve();
return resolved instanceof PsiClass ? (PsiClass) resolved : null;
}
@Override
public boolean isIdeExternalAnnotation() {
PsiAnnotation psi = getPsi();
ExternalAnnotationsManager externalAnnotationManager = ExternalAnnotationsManager.getInstance(psi.getProject());
return externalAnnotationManager.isExternalAnnotation(psi);
}
}
@@ -20,6 +20,7 @@ package org.jetbrains.kotlin.load.java.structure.impl
import com.intellij.psi.*
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.load.java.NULLABILITY_ANNOTATIONS
import org.jetbrains.kotlin.load.java.structure.*
import org.jetbrains.kotlin.name.Name
@@ -67,6 +68,14 @@ internal fun classifierTypes(classTypes: Array<PsiClassType>): Collection<JavaCl
internal fun annotations(annotations: Array<out PsiAnnotation>): Collection<JavaAnnotation> =
annotations.convert(::JavaAnnotationImpl)
internal fun nullabilityAnnotations(annotations: Array<out PsiAnnotation>): Collection<JavaAnnotation> =
annotations.convert(::JavaAnnotationImpl)
.filter { annotation ->
val fqName = annotation.classId?.asSingleFqName() ?: return@filter false
fqName in NULLABILITY_ANNOTATIONS
}
internal fun namedAnnotationArguments(nameValuePairs: Array<PsiNameValuePair>): Collection<JavaAnnotationArgument> =
nameValuePairs.convert { psi ->
val name = psi.name?.let(Name::identifier)
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.load.java.structure.impl;
import com.intellij.codeInsight.ExternalAnnotationsManager;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -25,10 +26,12 @@ import org.jetbrains.kotlin.load.java.JavaVisibilities;
import org.jetbrains.kotlin.load.java.structure.JavaAnnotation;
import org.jetbrains.kotlin.name.FqName;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import static org.jetbrains.kotlin.load.java.structure.impl.JavaElementCollectionFromPsiArrayUtil.annotations;
import static org.jetbrains.kotlin.load.java.structure.impl.JavaElementCollectionFromPsiArrayUtil.nullabilityAnnotations;
/* package */ class JavaElementUtil {
private JavaElementUtil() {
@@ -70,6 +73,27 @@ import static org.jetbrains.kotlin.load.java.structure.impl.JavaElementCollectio
return Collections.emptyList();
}
@Nullable
private static PsiAnnotation[] getExternalAnnotations(@NotNull JavaModifierListOwnerImpl modifierListOwner) {
PsiModifierListOwner psiModifierListOwner = modifierListOwner.getPsi();
ExternalAnnotationsManager externalAnnotationManager = ExternalAnnotationsManager
.getInstance(psiModifierListOwner.getProject());
return externalAnnotationManager.findExternalAnnotations(psiModifierListOwner);
}
@NotNull
static <T extends JavaAnnotationOwnerImpl & JavaModifierListOwnerImpl>
Collection<JavaAnnotation> getRegularAndExternalAnnotations(@NotNull T owner) {
PsiAnnotation[] externalAnnotations = getExternalAnnotations(owner);
if (externalAnnotations == null) {
return getAnnotations(owner);
}
Collection<JavaAnnotation> annotations = new ArrayList<>(getAnnotations(owner));
annotations.addAll(nullabilityAnnotations(externalAnnotations));
return annotations;
}
@Nullable
public static JavaAnnotation findAnnotation(@NotNull JavaAnnotationOwnerImpl owner, @NotNull FqName fqName) {
PsiAnnotationOwner annotationOwnerPsi = owner.getAnnotationOwnerPsi();
@@ -83,7 +83,7 @@ public abstract class JavaMemberImpl<Psi extends PsiMember> extends JavaElementI
@NotNull
@Override
public Collection<JavaAnnotation> getAnnotations() {
return JavaElementUtil.getAnnotations(this);
return JavaElementUtil.getRegularAndExternalAnnotations(this);
}
@Nullable
@@ -67,7 +67,7 @@ public class JavaValueParameterImpl extends JavaElementImpl<PsiParameter>
@NotNull
@Override
public Collection<JavaAnnotation> getAnnotations() {
return JavaElementUtil.getAnnotations(this);
return JavaElementUtil.getRegularAndExternalAnnotations(this);
}
@Nullable