From 5c37134bf7aa192f2e62e81627c6e152c7d311d0 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Mon, 11 Jan 2016 14:33:59 +0300 Subject: [PATCH] type migration: don't migrate method qualifiers type if type parameters are assignable (example: IDEA-150178) --- .../TypeMigrationStatementProcessor.java | 23 +++++++++++++++++-- .../typeMigration/t17/after/Test.items | 9 +------- .../typeMigration/t17/after/test.java | 2 +- .../typeMigration/t93/after/Test.items | 3 --- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationStatementProcessor.java b/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationStatementProcessor.java index a5c757d14b05..bfbb4cfe2b76 100644 --- a/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationStatementProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationStatementProcessor.java @@ -449,8 +449,8 @@ class TypeMigrationStatementProcessor extends JavaRecursiveElementVisitor { final PsiType qualifierType = qualifier.getType(); if (qualifierType instanceof PsiClassType) { final PsiClassType.ClassResolveResult classResolveResult = ((PsiClassType)qualifierType).resolveGenerics(); - final PsiType migrationType = - classResolveResult.getSubstitutor().substitute(evalSubstitutor.substitute(JavaPsiFacade.getElementFactory(myStatement.getProject()).createType(classResolveResult.getElement(), PsiSubstitutor.EMPTY))); + final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(myStatement.getProject()); + final PsiType migrationType = elementFactory.createType(classResolveResult.getElement(), composeIfNotAssignable(classResolveResult.getSubstitutor(), evalSubstitutor)); myLabeler.migrateExpressionType(qualifier, migrationType, myStatement, migrationType.equals(qualifierType), true); } } @@ -650,4 +650,23 @@ class TypeMigrationStatementProcessor extends JavaRecursiveElementVisitor { } return false; } + + private static PsiSubstitutor composeIfNotAssignable(PsiSubstitutor actual, PsiSubstitutor required) { + if (actual == PsiSubstitutor.EMPTY) { + return required; + } + if (required == PsiSubstitutor.EMPTY) { + return actual; + } + PsiSubstitutor result = PsiSubstitutorImpl.createSubstitutor(actual.getSubstitutionMap()); + for (Map.Entry e : required.getSubstitutionMap().entrySet()) { + final PsiTypeParameter typeParameter = e.getKey(); + final PsiType requiredType = e.getValue(); + final PsiType actualType = result.getSubstitutionMap().get(typeParameter); + if (requiredType != null && (actualType == null || !TypeConversionUtil.isAssignable(actualType, requiredType))) { + result = result.put(typeParameter, requiredType); + } + } + return result; + } } diff --git a/java/typeMigration/testData/refactoring/typeMigration/t17/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t17/after/Test.items index aa0aa0551659..59b74e1b30bb 100644 --- a/java/typeMigration/testData/refactoring/typeMigration/t17/after/Test.items +++ b/java/typeMigration/testData/refactoring/typeMigration/t17/after/Test.items @@ -1,18 +1,11 @@ Types: PsiField:f : B -PsiMethodCallExpression:f.foo(s) : B -PsiMethodCallExpression:s.add(f) : boolean -PsiParameter:s : java.util.Set +PsiMethodCallExpression:f.foo(s) : A PsiReferenceExpression:f : B PsiReferenceExpression:f : B -PsiReferenceExpression:s : java.util.Set -PsiReferenceExpression:s : java.util.Set Conversions: -f -> $ f.foo(s) -> $ -s -> $ -s.add(f) -> $ New expression type changes: Fails: diff --git a/java/typeMigration/testData/refactoring/typeMigration/t17/after/test.java b/java/typeMigration/testData/refactoring/typeMigration/t17/after/test.java index 73530057f21b..d90d101faed2 100644 --- a/java/typeMigration/testData/refactoring/typeMigration/t17/after/test.java +++ b/java/typeMigration/testData/refactoring/typeMigration/t17/after/test.java @@ -2,7 +2,7 @@ import java.util.*; class Test { B f; - A bar(Set s) { + A bar(Set s) { s.add(f); return f.foo(s); } diff --git a/java/typeMigration/testData/refactoring/typeMigration/t93/after/Test.items b/java/typeMigration/testData/refactoring/typeMigration/t93/after/Test.items index ea2fc9440478..aaa26f9139cb 100644 --- a/java/typeMigration/testData/refactoring/typeMigration/t93/after/Test.items +++ b/java/typeMigration/testData/refactoring/typeMigration/t93/after/Test.items @@ -1,11 +1,8 @@ Types: -PsiField:f : java.util.Map PsiParameter:b : boolean PsiReferenceExpression:b : boolean -PsiReferenceExpression:f : java.util.Map Conversions: -f -> $ New expression type changes: Fails: -- 2.32.0