capture wildcard for getClass calls

This commit is contained in:
anna
2012-04-19 12:41:38 +02:00
parent 4027275217
commit f4cf77fb68
4 changed files with 13 additions and 3 deletions
@@ -200,8 +200,9 @@ public class PsiMethodCallExpressionImpl extends ExpressionPsiElement implements
Map<PsiTypeParameter, PsiType> map = new HashMap<PsiTypeParameter, PsiType>();
map.put(javaLangClass.getTypeParameters()[0], PsiWildcardType.createExtends(manager, qualifierType));
PsiSubstitutor substitutor = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory().createSubstitutor(map);
return JavaPsiFacade.getInstance(manager.getProject()).getElementFactory()
final PsiClassType classType = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory()
.createType(javaLangClass, substitutor, languageLevel);
return PsiUtil.captureToplevelWildcards(classType, methodExpression);
}
}
}
@@ -0,0 +1,7 @@
import java.lang.reflect.*;
class Example {
private void demo() {
<error descr="Cannot resolve symbol 'TypeVariable'">TypeVariable</error><Class<? extends Example>>[] typeParameters = getClass().getTypeParameters();
}
}
@@ -60,8 +60,8 @@ abstract class C {
try { g(); }
catch (IE1 | IE2 e) {
Class<? extends E> clazz1 = e.getClass();
<error descr="Incompatible types. Found: 'java.lang.Class<? extends C.E>', required: 'java.lang.Class<? extends C.IE1>'">Class<? extends IE1> clazz2 = e.getClass();</error>
<error descr="Incompatible types. Found: 'java.lang.Class<? extends C.E>', required: 'java.lang.Class<? extends C.I>'">Class<? extends I> clazz3 = e.getClass();</error>
<error descr="Incompatible types. Found: 'java.lang.Class<capture<? extends C.E>>', required: 'java.lang.Class<? extends C.IE1>'">Class<? extends IE1> clazz2 = e.getClass();</error>
<error descr="Incompatible types. Found: 'java.lang.Class<capture<? extends C.E>>', required: 'java.lang.Class<? extends C.I>'">Class<? extends I> clazz3 = e.getClass();</error>
}
}
}
@@ -304,5 +304,7 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase {
}
public void testIDEA84533() throws Exception { doTest(false, false); }
public void testClassLiteral() throws Exception { doTest(false, false);}
}