inline variable: captured wildcard != wildcard so isAssignable should be used in order to avoid redundant class casts (IDEA-27243); though isAssignable can't replace equals as for primitive types cast can change expr semantics, e.g. (float)intVar1/intVar2

This commit is contained in:
anna
2010-06-03 12:39:37 +04:00
parent 55eb829067
commit feda077bb7
4 changed files with 28 additions and 1 deletions
@@ -24,6 +24,7 @@ import com.intellij.psi.*;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.RedundantCastUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.util.Function;
import com.intellij.util.IncorrectOperationException;
@@ -54,7 +55,8 @@ public class InlineUtil {
ChangeContextUtil.encodeContextInfo(initializer, false);
PsiExpression expr = (PsiExpression)ref.replace(initializer);
PsiType exprType = expr.getType();
if (exprType != null && !varType.equals(exprType)) {
if (exprType != null && (!varType.equals(exprType) && varType instanceof PsiPrimitiveType
|| !TypeConversionUtil.isAssignable(varType, exprType))) {
boolean matchedTypes = false;
//try explicit type arguments
final PsiElementFactory elementFactory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory();
@@ -0,0 +1,11 @@
import java.util.*;
class Test {
void foo() {
final Collection<? extends Number> extensions = getExtensions();
for (Number extension : exte<caret>nsions) {
}
}
Collection<? extends Number> getExtensions() {return null;}
}
@@ -0,0 +1,10 @@
import java.util.*;
class Test {
void foo() {
for (Number extension : getExtensions()) {
}
}
Collection<? extends Number> getExtensions() {return null;}
}
@@ -110,6 +110,10 @@ public class InlineLocalTest extends LightCodeInsightTestCase {
doTest(true);
}
public void testWildcard() throws Exception {
doTest(true);
}
private void doTest(final boolean inlineDef, String conflictMessage) throws Exception {
try {
doTest(inlineDef);