diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties
index eaddfa78b8ec..a70efca39b8e 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties
@@ -2122,6 +2122,6 @@ return.of.anonymous.class.problem.descriptor=Return of instance of anonymous cla
return.of.local.class.problem.descriptor=Return of instance of local class {0} #loc
return.of.inner.class.problem.descriptor=Return of instance of non-static inner class {0} #loc
parameter.type.prevents.overriding.display.name=Parameter type prevents overriding
-parameter.type.prevents.overriding.problem.descriptor=Parameter type #ref is from package ''{0}'' while super method parameter type is from package ''{1}'' preventing overriding
+parameter.type.prevents.overriding.problem.descriptor=Parameter type #ref is located in ''{0}'' while super method parameter type is located in ''{1}'' preventing overriding
parameter.type.prevents.overriding.quickfix=Change type of parameter to ''{0}''
parameter.type.prevents.overriding.family.quickfix=Change type of parameter
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/ParameterTypePreventsOverridingInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/ParameterTypePreventsOverridingInspection.java
index ae397a8cacb9..71865ebe5b35 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/ParameterTypePreventsOverridingInspection.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/ParameterTypePreventsOverridingInspection.java
@@ -24,6 +24,7 @@ import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
import com.siyeh.ig.InspectionGadgetsFix;
+import com.siyeh.ig.psiutils.MethodUtils;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -44,21 +45,17 @@ public class ParameterTypePreventsOverridingInspection extends BaseInspection {
@NotNull
@Override
protected String buildErrorString(Object... infos) {
- final PsiTypeElement typeElement = (PsiTypeElement)infos[0];
- final PsiType type = typeElement.getType();
- final String packageName = StringUtil.getPackageName(type.getCanonicalText());
- final PsiTypeElement superTypeElement = (PsiTypeElement)infos[1];
- final PsiType superType = superTypeElement.getType();
- final String superPackageName = StringUtil.getPackageName(superType.getCanonicalText());
+ final String qualifiedName1 = (String)infos[0];
+ final String packageName = StringUtil.getPackageName(qualifiedName1);
+ final String qualifiedName2 = (String)infos[1];
+ final String superPackageName = StringUtil.getPackageName(qualifiedName2);
return InspectionGadgetsBundle.message("parameter.type.prevents.overriding.problem.descriptor", packageName, superPackageName);
}
@Nullable
@Override
protected InspectionGadgetsFix buildFix(Object... infos) {
- final PsiTypeElement typeElement = (PsiTypeElement)infos[1];
- final PsiType type = typeElement.getType();
- return new ParameterTypePreventsOverridingFix(type.getCanonicalText());
+ return new ParameterTypePreventsOverridingFix((String)infos[1]);
}
private static class ParameterTypePreventsOverridingFix extends InspectionGadgetsFix {
@@ -121,6 +118,9 @@ public class ParameterTypePreventsOverridingInspection extends BaseInspection {
if (superClass == null) {
return;
}
+ if (MethodUtils.hasSuper(method)) {
+ return;
+ }
final PsiParameter[] parameters = parameterList.getParameters();
final String name = method.getName();
final PsiMethod[] superMethods = superClass.findMethodsByName(name, true);
@@ -134,16 +134,16 @@ public class ParameterTypePreventsOverridingInspection extends BaseInspection {
continue;
}
final PsiParameter[] superParameters = superParameterList.getParameters();
- final Map problemTypeElements = ContainerUtilRt.newHashMap(2);
+ final Map problemTypeElements = ContainerUtilRt.newHashMap(2);
for (int i = 0; i < parameters.length; i++) {
final PsiParameter parameter = parameters[i];
final PsiParameter superParameter = superParameters[i];
final PsiType type = parameter.getType();
final PsiType superType = superParameter.getType();
- if (type.equals(superType)) {
+ if (!(superType instanceof PsiClassType) || type.equals(superType)) {
continue;
}
- if (!type.getPresentableText().equals(superType.getPresentableText())) {
+ if (!(type instanceof PsiClassType) || !type.getPresentableText().equals(superType.getPresentableText())) {
return;
}
final PsiTypeElement typeElement = parameter.getTypeElement();
@@ -154,10 +154,21 @@ public class ParameterTypePreventsOverridingInspection extends BaseInspection {
if (superParameterTypeElement == null) {
continue outer;
}
- problemTypeElements.put(typeElement, superParameterTypeElement);
+ problemTypeElements.put(typeElement, (PsiClassType)superType);
}
- for (Map.Entry entry : problemTypeElements.entrySet()) {
- registerError(entry.getKey(), entry.getKey(), entry.getValue());
+ for (Map.Entry entry : problemTypeElements.entrySet()) {
+ final PsiTypeElement typeElement = entry.getKey();
+ final PsiClassType type = (PsiClassType)typeElement.getType();
+ final PsiClass aClass1 = type.resolve();
+ if (aClass1 == null || aClass1 instanceof PsiTypeParameter) {
+ return;
+ }
+ final PsiClassType classType = entry.getValue();
+ final PsiClass aClass2 = classType.resolve();
+ if (aClass2 == null || aClass2 instanceof PsiTypeParameter) {
+ continue;
+ }
+ registerError(typeElement, type.getCanonicalText(), classType.getCanonicalText());
}
}
}
diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/ParameterTypePreventsOverridingInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/ParameterTypePreventsOverridingInspectionTest.java
index 1fd306ce865b..2c06cce62246 100644
--- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/ParameterTypePreventsOverridingInspectionTest.java
+++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/ParameterTypePreventsOverridingInspectionTest.java
@@ -29,7 +29,7 @@ public class ParameterTypePreventsOverridingInspectionTest extends LightInspecti
"import a.*;" +
"import b.String;" +
"class Sub extends Super {" +
- " void m(/*Parameter type 'String' is from package 'b' while super method parameter type is from package 'java.lang' preventing overriding*/String/**/ s) {}" +
+ " void m(/*Parameter type 'String' is located in 'b' while super method parameter type is located in 'java.lang' preventing overriding*/String/**/ s) {}" +
"}");
}
@@ -50,13 +50,29 @@ public class ParameterTypePreventsOverridingInspectionTest extends LightInspecti
"import a.*;" +
"import b.String;" +
"class Sub extends Super {" +
- " Integer n(/*Parameter type 'String' is from package 'b' while super method parameter type is from package 'java.lang' preventing overriding*/String/**/ s, " +
- " /*Parameter type 'String' is from package 'b' while super method parameter type is from package 'java.lang' preventing overriding*/String/**/ t) {" +
+ " Integer n(/*Parameter type 'String' is located in 'b' while super method parameter type is located in 'java.lang' preventing overriding*/String/**/ s, " +
+ " /*Parameter type 'String' is located in 'b' while super method parameter type is located in 'java.lang' preventing overriding*/String/**/ t) {" +
" return null;" +
" }" +
"}");
}
+ public void testTypeParameter1() {
+ doTest("package c;" +
+ "import a.*;" +
+ "class Y extends X {" +
+ " void m(T t) {}" +
+ "}");
+ }
+
+ public void testTypeParameter2() {
+ doTest("package c;" +
+ "import a.*;" +
+ "class Y extends X {" +
+ " void m(T t) {}" +
+ "}");
+ }
+
@Override
protected String[] getEnvironmentClasses() {
return new String[]{
@@ -67,6 +83,10 @@ public class ParameterTypePreventsOverridingInspectionTest extends LightInspecti
" return null;" +
" }" +
"}",
+ "package a;" +
+ "public class X {" +
+ " void m(T t) {}" +
+ "}",
"package b;" +
"public class String {}"
};