type migration: fix AIOOBE for method with generic varargs migration (EA-87127)

This commit is contained in:
Dmitry Batkovich
2017-03-13 16:53:06 +03:00
parent 5b479b8377
commit 3e80efb857
5 changed files with 50 additions and 2 deletions
@@ -118,8 +118,7 @@ public class RootTypeConversionRule extends TypeConversionRule {
}
final PsiType migrationType = methodTypeParamsSubstitutor.substitute(type);
if (!originalType.equals(migrationType) &&
!TypeConversionUtil.areTypesAssignmentCompatible(migrationType, actualParams[i])) {
if (!originalType.equals(migrationType) && !areParametersAssignable(migrationType, i, actualParams)) {
labeler.migrateExpressionType(actualParams[i], migrationType, context, false, true);
}
}
@@ -139,6 +138,19 @@ public class RootTypeConversionRule extends TypeConversionRule {
return null;
}
private static boolean areParametersAssignable(PsiType migrationType, int paramId, PsiExpression[] actualParams) {
if (migrationType instanceof PsiEllipsisType) {
for (int i = paramId; i < actualParams.length; i++) {
if (!TypeConversionUtil.areTypesAssignmentCompatible(migrationType, actualParams[i])) {
return false;
}
}
return true;
} else {
return TypeConversionUtil.areTypesAssignmentCompatible(migrationType, actualParams[paramId]);
}
}
private static class MyStaticMethodConversionDescriptor extends TypeConversionDescriptorBase {
private final @NotNull String myTargetClassQName;
@@ -862,6 +862,10 @@ public class TypeMigrationTest extends TypeMigrationTestBase {
doTestMethodType("migrationMethod", PsiType.VOID);
}
public void testGenericEllipsis() {
doTestFieldType("migrationField", myJavaFacade.getElementFactory().createTypeFromText("Test<Short>", null));
}
private void doTestReturnType(final String methodName, final String migrationType) {
start(new RulesProvider() {
@Override
@@ -0,0 +1,10 @@
Types:
PsiField:migrationField : Test<java.lang.Short>
PsiMethodCallExpression:migrationField.method() : void
PsiReferenceExpression:migrationField : Test<java.lang.Short>
Conversions:
migrationField.method() -> $
New expression type changes:
Fails:
@@ -0,0 +1,11 @@
class Test<X> {
private static Test<Short> migrationField;
private static void m() {
migrationField.method();
}
void method(X... xes) {
}
}
@@ -0,0 +1,11 @@
class Test<X> {
private static Test<Integer> migrationField;
private static void m() {
migrationField.method();
}
void method(X... xes) {
}
}