surround with array fix: ensure result is free from generics array creation error (IDEA-166489; IDEA-166490)

This commit is contained in:
Anna Kozlova
2017-01-12 12:53:04 +01:00
parent ca98d05201
commit 7d8df26aed
12 changed files with 100 additions and 5 deletions

View File

@@ -623,8 +623,11 @@ public class HighlightUtil extends HighlightUtilBase {
QuickFixAction.registerQuickFixAction(errorResult, QUICK_FIX_FACTORY.createMethodReturnFix(method, valueType, true));
}
registerChangeParameterClassFix(returnType, valueType, errorResult);
if (returnType instanceof PsiArrayType && TypeConversionUtil.isAssignable(((PsiArrayType)returnType).getComponentType(), valueType)) {
QuickFixAction.registerQuickFixAction(errorResult, QUICK_FIX_FACTORY.createSurroundWithArrayFix(null, returnValue));
if (returnType instanceof PsiArrayType) {
final PsiType erasedValueType = TypeConversionUtil.erasure(valueType);
if (erasedValueType != null && TypeConversionUtil.isAssignable(((PsiArrayType)returnType).getComponentType(), erasedValueType)) {
QuickFixAction.registerQuickFixAction(errorResult, QUICK_FIX_FACTORY.createSurroundWithArrayFix(null, returnValue));
}
}
registerCollectionToArrayFixAction(errorResult, valueType, returnType, returnValue);
}

View File

@@ -95,10 +95,10 @@ public class SurroundWithArrayFix extends PsiElementBaseIntentionAction {
if (psiParameters.length > idx) {
final PsiType paramType = psiParameters[idx].getType();
if (paramType instanceof PsiArrayType) {
final PsiType expressionType = expression.getType();
final PsiType expressionType = TypeConversionUtil.erasure(expression.getType());
if (expressionType != null) {
final PsiType componentType = ((PsiArrayType)paramType).getComponentType();
if (expressionType.isAssignableFrom(componentType)) {
if (TypeConversionUtil.isAssignable(componentType, expressionType)) {
return expression;
}
final PsiClass psiClass = PsiUtil.resolveClassInType(componentType);
@@ -129,6 +129,7 @@ public class SurroundWithArrayFix extends PsiElementBaseIntentionAction {
private static String getArrayCreation(@NotNull PsiExpression expression) {
final PsiType expressionType = expression.getType();
assert expressionType != null;
return "new " + expressionType.getCanonicalText() + "[]{" + expression.getText()+ "}";
final PsiType arrayComponentType = TypeConversionUtil.erasure(expressionType);
return "new " + arrayComponentType.getCanonicalText() + "[]{" + expression.getText()+ "}";
}
}

View File

@@ -0,0 +1,9 @@
// "Surround with array initialization" "true"
import java.util.List;
class A {
public List<?>[] test(List<Number> list) {
return new List[]{list};
}
}

View File

@@ -0,0 +1,11 @@
// "Surround with array initialization" "true"
import java.util.List;
class A {
public void test(List<?>[] t){}
void foo(List<Number> list) {
test(new List[]{list});
}
}

View File

@@ -0,0 +1,7 @@
// "Surround with array initialization" "true"
class A<T> {
public Object[] test(T t) {
return new Object[]{t};
}
}

View File

@@ -0,0 +1,10 @@
// "Surround with array initialization" "true"
class A<T> {
public void test(Object[] t) {
}
void foo(T t){
test(new Object[]{t});
}
}

View File

@@ -0,0 +1,9 @@
// "Surround with array initialization" "true"
import java.util.List;
class A {
public List<?>[] test(List<Number> list) {
return lis<caret>t;
}
}

View File

@@ -0,0 +1,11 @@
// "Surround with array initialization" "true"
import java.util.List;
class A {
public void test(List<?>[] t){}
void foo(List<Number> list) {
test(lis<caret>t);
}
}

View File

@@ -0,0 +1,7 @@
// "Surround with array initialization" "true"
class A<T> {
public Object[] test(T t) {
return <caret>t;
}
}

View File

@@ -0,0 +1,7 @@
// "Surround with array initialization" "false"
class A<T> {
public T[] test(T t) {
return <caret>t;
}
}

View File

@@ -0,0 +1,10 @@
// "Surround with array initialization" "false"
class A<T> {
public void test(T[] t) {
}
void foo(T t){
test(<caret>t);
}
}

View File

@@ -0,0 +1,10 @@
// "Surround with array initialization" "true"
class A<T> {
public void test(Object[] t) {
}
void foo(T t){
test(<caret>t);
}
}