mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-09 08:09:39 +07:00
look for SafeVarargs in external annotations to get rid of yellow code when java8-level code calls java6-level varargs method.
This commit is contained in:
@@ -85,40 +85,43 @@ public class JavaGenericsUtil {
|
||||
@NotNull JavaResolveResult resolveResult,
|
||||
@NotNull LanguageLevel languageLevel) {
|
||||
final PsiElement resolve = resolveResult.getElement();
|
||||
if (resolve instanceof PsiMethod) {
|
||||
final PsiMethod psiMethod = (PsiMethod)resolve;
|
||||
if (!(resolve instanceof PsiMethod)) {
|
||||
return false;
|
||||
}
|
||||
PsiMethod psiMethod = (PsiMethod)resolve;
|
||||
|
||||
if (psiMethod.isVarArgs()) {
|
||||
if (!languageLevel.isAtLeast(LanguageLevel.JDK_1_7) || !AnnotationUtil.isAnnotated(psiMethod, "java.lang.SafeVarargs", false)) {
|
||||
final int parametersCount = psiMethod.getParameterList().getParametersCount();
|
||||
final PsiParameter varargParameter =
|
||||
psiMethod.getParameterList().getParameters()[parametersCount - 1];
|
||||
final PsiType componentType = ((PsiEllipsisType)varargParameter.getType()).getComponentType();
|
||||
if (!isReifiableType(resolveResult.getSubstitutor().substitute(componentType))) {
|
||||
if (!psiMethod.isVarArgs()) {
|
||||
return false;
|
||||
}
|
||||
if (AnnotationUtil.isAnnotated(psiMethod, "java.lang.SafeVarargs", false, false)) {
|
||||
return false;
|
||||
}
|
||||
int parametersCount = psiMethod.getParameterList().getParametersCount();
|
||||
PsiParameter varargParameter = psiMethod.getParameterList().getParameters()[parametersCount - 1];
|
||||
PsiType componentType = ((PsiEllipsisType)varargParameter.getType()).getComponentType();
|
||||
if (isReifiableType(resolveResult.getSubstitutor().substitute(componentType))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (expression instanceof PsiMethodReferenceExpression) return true;
|
||||
if (expression instanceof PsiMethodReferenceExpression) return true;
|
||||
|
||||
final PsiElement parent = expression.getParent();
|
||||
if (parent instanceof PsiCall) {
|
||||
final PsiExpressionList argumentList = ((PsiCall)parent).getArgumentList();
|
||||
if (argumentList != null) {
|
||||
final PsiExpression[] args = argumentList.getExpressions();
|
||||
if (args.length == parametersCount) {
|
||||
final PsiExpression lastArg = args[args.length - 1];
|
||||
if (lastArg.getType() instanceof PsiArrayType) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (int i = parametersCount - 1; i < args.length; i++) {
|
||||
if (!isReifiableType(resolveResult.getSubstitutor().substitute(args[i].getType()))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return args.length < parametersCount;
|
||||
}
|
||||
}
|
||||
final PsiElement parent = expression.getParent();
|
||||
if (parent instanceof PsiCall) {
|
||||
final PsiExpressionList argumentList = ((PsiCall)parent).getArgumentList();
|
||||
if (argumentList != null) {
|
||||
final PsiExpression[] args = argumentList.getExpressions();
|
||||
if (args.length == parametersCount) {
|
||||
final PsiExpression lastArg = args[args.length - 1];
|
||||
if (lastArg.getType() instanceof PsiArrayType) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (int i = parametersCount - 1; i < args.length; i++) {
|
||||
if (!isReifiableType(resolveResult.getSubstitutor().substitute(args[i].getType()))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return args.length < parametersCount;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user