IDEA-130746 Incorrect cast after completion in evaluate dialog

This commit is contained in:
peter
2014-10-02 18:25:01 +02:00
parent 7a4aab897a
commit 17fd7130d0
2 changed files with 32 additions and 7 deletions
@@ -450,7 +450,7 @@ public class JavaCompletionUtil {
PsiType returnType = method.getReturnType();
if (method.getSignature(plainSub).equals(method.getSignature(castSub)) &&
returnType != null &&
castSub.substitute(returnType).isAssignableFrom(plainSub.substitute(returnType)) &&
toRaw(castSub.substitute(returnType)).isAssignableFrom(toRaw(plainSub.substitute(returnType))) &&
processor.isAccessible(plainClass.findMethodBySignature(method, true))
) {
return item;
@@ -494,6 +494,10 @@ public class JavaCompletionUtil {
}
});
}
private static PsiType toRaw(@NotNull PsiType type) {
return type instanceof PsiClassType ? ((PsiClassType)type).rawType() : type;
}
public static LookupElement highlightIfNeeded(PsiType qualifierType, LookupElement item, Object object) {
return containsMember(qualifierType, object) ? highlight(item) : item;
@@ -13,13 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.codeInsight.completion;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.psi.CommonClassNames;
import com.intellij.psi.JavaCodeFragmentFactory;
package com.intellij.codeInsight.completion
import com.intellij.openapi.fileTypes.StdFileTypes
import com.intellij.psi.CommonClassNames
import com.intellij.psi.JavaCodeFragmentFactory
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiExpression
import com.intellij.psi.PsiFile
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import com.intellij.psi.PsiType
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
import com.intellij.util.PairFunction
/**
* @author peter
@@ -97,5 +100,23 @@ public class FragmentCompletionTest extends LightCodeInsightFixtureTestCase {
myFixture.checkResult("o instanceof String && ((String) o).substring(<caret>)");
}
public void testNoGenericQualifierCastingWithRuntimeType() throws Throwable {
final ctxText = "import java.util.*; class Bar {{ Map<Integer,Integer> map = new HashMap<Integer,Integer>(); map=null; }}"
final ctxFile = createLightFile(StdFileTypes.JAVA, ctxText)
final context = ctxFile.findElementAt(ctxText.indexOf("map="))
assert context
PsiFile file = JavaCodeFragmentFactory.getInstance(project).createExpressionCodeFragment("map.entry<caret>", context, null, true);
myFixture.configureFromExistingVirtualFile(file.getVirtualFile());
myFixture.file.putCopyableUserData(JavaCompletionUtil.DYNAMIC_TYPE_EVALUATOR, new PairFunction<PsiExpression, CompletionParameters, PsiType>() {
@Override
PsiType fun(PsiExpression t, CompletionParameters v) {
return JavaPsiFacade.getElementFactory(t.project).createTypeByFQClassName(CommonClassNames.JAVA_UTIL_HASH_MAP)
}
})
assert !myFixture.completeBasic()
myFixture.checkResult("map.entrySet()<caret>");
}
}