diamond: replace wildcards with corresponding bound when inference (IDEA-66124)

This commit is contained in:
anna
2011-03-08 17:45:00 +01:00
parent 8c9a400531
commit ccdc3a5bcb
2 changed files with 32 additions and 3 deletions
@@ -74,3 +74,24 @@ class NonParameterized {
new NonParameterized<<error descr="Diamond operator is not applicable for non-parameterized types"></error>>();
}
}
interface I<T> {
T m();
}
class FI1 {
I<? extends String> i1 = new I<>() {
@Override
public String m() {
return null;
}
};
I<?> i2 = new I<>() {
@Override
public Object m() {
return null;
}
};
}
@@ -119,7 +119,7 @@ public class PsiDiamondType extends PsiType {
final PsiTypeParameter[] classParameters = psiClass.getTypeParameters();
final PsiJavaCodeReferenceElement classOrAnonymousClassReference = newExpression.getClassOrAnonymousClassReference();
LOG.assertTrue(classOrAnonymousClassReference != null);
final DiamondInferenceResult result = new DiamondInferenceResult(classOrAnonymousClassReference.getReferenceName() + "<>");
final DiamondInferenceResult result = new DiamondInferenceResult(classOrAnonymousClassReference.getReferenceName() + "<>", newExpression.getProject());
for (PsiTypeParameter parameter : parameters) {
for (PsiTypeParameter classParameter : classParameters) {
if (Comparing.strEqual(classParameter.getName(), parameter.getName())) {
@@ -245,12 +245,14 @@ public class PsiDiamondType extends PsiType {
private String myErrorMessage;
private String myNewExpressionPresentableText;
private Project myProject;
public DiamondInferenceResult() {
}
public DiamondInferenceResult(String expressionPresentableText) {
public DiamondInferenceResult(String expressionPresentableText, Project project) {
myNewExpressionPresentableText = expressionPresentableText;
myProject = project;
}
public PsiType[] getTypes() {
@@ -272,7 +274,13 @@ public class PsiDiamondType extends PsiType {
myErrorMessage = "Cannot infer type arguments for " +
myNewExpressionPresentableText + " because type " + psiType.getPresentableText() + " inferred is not allowed in current context";
} else {
myInferredTypes.add(psiType);
if (psiType instanceof PsiWildcardType) {
final PsiType bound = ((PsiWildcardType)psiType).getBound();
myInferredTypes.add(bound != null ? bound : PsiType.getJavaLangObject(PsiManager.getInstance(myProject), GlobalSearchScope.allScope(myProject)));
}
else {
myInferredTypes.add(psiType);
}
}
}