From d745b1a7f7cee3c25f21bcedc1fa3b409033ab24 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 19 Apr 2012 09:31:52 +0200 Subject: [PATCH] unchecked generics array creation: subst should be applied before isReifiable check (IDEA-79052) --- .../daemon/impl/analysis/GenericsHighlightUtil.java | 7 ++++--- .../UncheckedWarningLocalInspection.java | 5 +++-- .../advHighlighting7/UncheckedGenericsArrayCreation.java | 9 +++++++++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index 23eb2f2969cc..824f5bd18e32 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -1075,7 +1075,8 @@ public class GenericsHighlightUtil { } } - public static boolean isUncheckedWarning(PsiJavaCodeReferenceElement expression, PsiElement resolve) { + public static boolean isUncheckedWarning(PsiJavaCodeReferenceElement expression, JavaResolveResult resolveResult) { + final PsiElement resolve = resolveResult.getElement(); if (resolve instanceof PsiMethod) { final PsiMethod psiMethod = (PsiMethod)resolve; @@ -1087,7 +1088,7 @@ public class GenericsHighlightUtil { final PsiParameter varargParameter = psiMethod.getParameterList().getParameters()[parametersCount - 1]; final PsiType componentType = ((PsiEllipsisType)varargParameter.getType()).getComponentType(); - if (!isReifiableType(componentType)) { + if (!isReifiableType(resolveResult.getSubstitutor().substitute(componentType))) { final PsiElement parent = expression.getParent(); if (parent instanceof PsiCall) { final PsiExpressionList argumentList = ((PsiCall)parent).getArgumentList(); @@ -1109,7 +1110,7 @@ public class GenericsHighlightUtil { } } for (int i = parametersCount - 1; i < args.length; i++) { - if (!isReifiableType(args[i].getType())){ + if (!isReifiableType(resolveResult.getSubstitutor().substitute(args[i].getType()))){ return true; } } diff --git a/java/java-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java b/java/java-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java index 31e4394f29d1..8c77301bf660 100644 --- a/java/java-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java @@ -188,7 +188,8 @@ public class UncheckedWarningLocalInspection extends BaseJavaLocalInspectionTool public void visitReferenceExpression(PsiReferenceExpression expression) { if (IGNORE_UNCHECKED_GENERICS_ARRAY_CREATION) return; if (!PsiUtil.isLanguageLevel5OrHigher(expression)) return; - if (GenericsHighlightUtil.isUncheckedWarning(expression, expression.resolve())) { + final JavaResolveResult result = expression.advancedResolve(false); + if (GenericsHighlightUtil.isUncheckedWarning(expression, result)) { registerProblem("Unchecked generics array creation for varargs parameter", expression, LocalQuickFix.EMPTY_ARRAY); } } @@ -199,7 +200,7 @@ public class UncheckedWarningLocalInspection extends BaseJavaLocalInspectionTool if (IGNORE_UNCHECKED_GENERICS_ARRAY_CREATION) return; if (!PsiUtil.isLanguageLevel5OrHigher(expression)) return; final PsiJavaCodeReferenceElement classReference = expression.getClassOrAnonymousClassReference(); - if (GenericsHighlightUtil.isUncheckedWarning(classReference, expression.resolveConstructor())) { + if (GenericsHighlightUtil.isUncheckedWarning(classReference, expression.resolveMethodGenerics())) { registerProblem("Unchecked generics array creation for varargs parameter", classReference, LocalQuickFix.EMPTY_ARRAY); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/UncheckedGenericsArrayCreation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/UncheckedGenericsArrayCreation.java index 06ff29ce7b48..31d207fc3dda 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/UncheckedGenericsArrayCreation.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/UncheckedGenericsArrayCreation.java @@ -119,3 +119,12 @@ class OCM { this(s, false, c); } } + +class TPSubstitution { + public void f(T... args) { + } + + public void g() { + new TPSubstitution().f(); + } +} \ No newline at end of file