'cast parameter' fix if spread operator used

This commit is contained in:
Max Medvedev
2014-01-30 12:58:16 +04:00
parent 8ed8c4c9bc
commit f4c8a46aed
4 changed files with 30 additions and 12 deletions
@@ -21,7 +21,6 @@ import com.intellij.diagnostic.LogMessageEx;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiSubstitutor;
import com.intellij.psi.PsiType;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.util.IncorrectOperationException;
@@ -35,7 +34,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrAssign
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrSafeCastExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement;
import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil;
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
/**
* @author Maxim.Medvedev
@@ -45,7 +44,7 @@ public class GrCastFix extends GroovyFix implements LocalQuickFix {
private PsiType myExpectedType;
public GrCastFix(PsiType expectedType, GrExpression expression) {
myExpectedType = TypesUtil.substituteBoxAndNormalizeType(expectedType, PsiSubstitutor.EMPTY, null, expression);
myExpectedType = PsiImplUtil.normalizeWildcardTypeByPosition(expectedType, expression);
}
@Override
@@ -60,6 +60,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrSpreadArgument;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrReturnStatement;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrThrowStatement;
@@ -85,6 +86,7 @@ import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -838,6 +840,11 @@ public class GroovyAssignabilityCheckInspection extends BaseInspection {
private static LocalQuickFix[] genCastFixes(GrSignature signature, PsiType[] argumentTypes, @Nullable GrArgumentList argumentList) {
if (argumentList == null) return LocalQuickFix.EMPTY_ARRAY;
final List<GrExpression> args = getExpressionArgumentsOfCall(argumentList);
if (args == null) {
return LocalQuickFix.EMPTY_ARRAY;
}
final List<GrClosureSignature> signatures = GrClosureSignatureUtil.generateSimpleSignature(signature);
@@ -855,8 +862,6 @@ public class GroovyAssignabilityCheckInspection extends BaseInspection {
}
}
final List<GrExpression> args = getExpressionArgumentsOfCall(argumentList);
final ArrayList<LocalQuickFix> fixes = new ArrayList<LocalQuickFix>();
for (Pair<Integer, PsiType> error : allErrors) {
fixes.add(new ParameterCastFix(error.first, error.second, args.get(error.first)));
@@ -1034,10 +1039,25 @@ public class GroovyAssignabilityCheckInspection extends BaseInspection {
}
}
@NotNull
@Nullable
private static List<GrExpression> getExpressionArgumentsOfCall(@NotNull GrArgumentList argumentList) {
final GrExpression[] argArray = argumentList.getExpressionArguments();
final ArrayList<GrExpression> args = ContainerUtil.newArrayList(argArray);
final ArrayList<GrExpression> args = ContainerUtil.newArrayList();
for (GrExpression arg : argArray) {
if (arg instanceof GrSpreadArgument) {
GrExpression spreaded = ((GrSpreadArgument)arg).getArgument();
if (spreaded instanceof GrListOrMap && !((GrListOrMap)spreaded).isMap()) {
Collections.addAll(args, ((GrListOrMap)spreaded).getInitializers());
}
else {
return null;
}
}
else {
args.add(arg);
}
}
final PsiElement parent = argumentList.getParent();
if (parent instanceof GrIndexProperty && PsiUtil.isLValue((GroovyPsiElement)parent)) {
@@ -18,14 +18,13 @@ package org.jetbrains.plugins.groovy.codeInspection.assignment;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiSubstitutor;
import com.intellij.psi.PsiType;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.codeInspection.GroovyFix;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil;
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
/**
@@ -38,7 +37,7 @@ public class ParameterCastFix extends GroovyFix {
public ParameterCastFix(int param, @NotNull PsiType type, @NotNull GrExpression argument) {
myArgument = argument;
myType = TypesUtil.substituteBoxAndNormalizeType(type, PsiSubstitutor.EMPTY, null, argument);
myType = PsiImplUtil.normalizeWildcardTypeByPosition(type, argument);
StringBuilder builder = new StringBuilder();
builder.append("Cast ");
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2012 JetBrains s.r.o.
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -88,7 +88,7 @@ public class GroovyClassNameCompletionTest extends LightCodeInsightFixtureTestCa
addClassToProject("a", "FooBarGooDoo");
myFixture.configureByText("a.groovy", "FBGD<caret>a")
myFixture.complete(CompletionType.BASIC, 2)
myFixture.type '.'.charAt(0)
myFixture.type '.'
myFixture.checkResult "a.FooBarGooDoo.<caret>a"
}