IDEA-94908: forbid to select raw type from parameterized parent

This commit is contained in:
anna
2012-11-14 19:22:02 +01:00
parent e1e65c7a94
commit daea664646
4 changed files with 54 additions and 0 deletions
@@ -1395,5 +1395,28 @@ public class GenericsHighlightUtil {
}
return null;
}
/**
* http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.8
*/
@Nullable
public static HighlightInfo checkRawOnParameterizedType(PsiReferenceParameterList list) {
if (list.getTypeArguments().length > 0) return null;
final PsiElement parent = list.getParent();
if (parent instanceof PsiJavaCodeReferenceElement) {
final PsiElement qualifier = ((PsiJavaCodeReferenceElement)parent).getQualifier();
if (qualifier instanceof PsiJavaCodeReferenceElement) {
if (((PsiJavaCodeReferenceElement)qualifier).getTypeParameters().length > 0) {
final PsiElement resolve = ((PsiJavaCodeReferenceElement)parent).resolve();
if (resolve instanceof PsiTypeParameterListOwner
&& ((PsiTypeParameterListOwner)resolve).hasTypeParameters()
&& !((PsiTypeParameterListOwner)resolve).hasModifierProperty(PsiModifier.STATIC)) {
return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, parent, "Improper formed type; some type parameters are missing");
}
}
}
}
return null;
}
}
@@ -1014,6 +1014,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
public void visitReferenceParameterList(PsiReferenceParameterList list) {
myHolder.add(GenericsHighlightUtil.checkParametersAllowed(list));
if (!myHolder.hasErrorResults()) myHolder.add(GenericsHighlightUtil.checkParametersOnRaw(list));
if (!myHolder.hasErrorResults()) myHolder.add(GenericsHighlightUtil.checkRawOnParameterizedType(list));
}
@Override public void visitReturnStatement(PsiReturnStatement statement) {
@@ -0,0 +1,29 @@
class GenericOuter<T> {
public class GenericInner<U> {
}
public static class StaticGenericInner<U> {
}
public class SimpleInner {
}
}
class OuterClient {
public void context() {
<error descr="Improper formed type; some type parameters are missing">GenericOuter<String>.GenericInner</error> v1 = null;
GenericOuter.GenericInner<error descr="Type arguments given on a raw type"><String></error> v2 = null;
GenericOuter.GenericInner v3 = null;
GenericOuter<String>.GenericInner<String> v4 = null;
GenericOuter<error descr="Cannot select static class 'GenericOuter.StaticGenericInner' from parameterized type"><String></error>.StaticGenericInner sv1 = null;
GenericOuter.StaticGenericInner<String> sv2 = null;
GenericOuter.StaticGenericInner sv3 = null;
GenericOuter<error descr="Cannot select static class 'GenericOuter.StaticGenericInner' from parameterized type"><String></error>.StaticGenericInner<String> sv4 = null;
GenericOuter<String>.SimpleInner iv1 = null;
GenericOuter.SimpleInner<error descr="Type arguments given on a raw type"><String></error> iv2 = null;
GenericOuter.SimpleInner iv3 = null;
GenericOuter<String>.SimpleInner<error descr="Type 'GenericOuter.SimpleInner' does not have type parameters"><String></error> iv4 = null;
}
}
@@ -194,6 +194,7 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase {
public void testDifferentTypeParamsInOverloadedMethods() throws Exception { doTest(true); }
public void testIDEA91626() throws Exception { doTest(true); }
public void testIDEA92022() throws Exception { doTest(false); }
public void testRawOnParameterized() throws Exception { doTest(false); }
public void testJavaUtilCollections_NoVerify() throws Exception {
PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule()));