From f4c8a46aed0b4d0d01d0d8e8fce1290644aadc76 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Thu, 30 Jan 2014 12:40:06 +0400 Subject: [PATCH] 'cast parameter' fix if spread operator used --- .../codeInspection/assignment/GrCastFix.java | 5 ++-- .../GroovyAssignabilityCheckInspection.java | 28 ++++++++++++++++--- .../assignment/ParameterCastFix.java | 5 ++-- .../GroovyClassNameCompletionTest.groovy | 4 +-- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GrCastFix.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GrCastFix.java index 9c52827ed754..d5a3467d4b33 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GrCastFix.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GrCastFix.java @@ -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 diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java index 0ed6c3c4e951..e4ff7261dc70 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java @@ -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 args = getExpressionArgumentsOfCall(argumentList); + + if (args == null) { + return LocalQuickFix.EMPTY_ARRAY; + } final List signatures = GrClosureSignatureUtil.generateSimpleSignature(signature); @@ -855,8 +862,6 @@ public class GroovyAssignabilityCheckInspection extends BaseInspection { } } - final List args = getExpressionArgumentsOfCall(argumentList); - final ArrayList fixes = new ArrayList(); for (Pair 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 getExpressionArgumentsOfCall(@NotNull GrArgumentList argumentList) { final GrExpression[] argArray = argumentList.getExpressionArguments(); - final ArrayList args = ContainerUtil.newArrayList(argArray); + final ArrayList 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)) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/ParameterCastFix.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/ParameterCastFix.java index e1ca132a04ed..4ee984e54717 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/ParameterCastFix.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/ParameterCastFix.java @@ -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 "); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyClassNameCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyClassNameCompletionTest.groovy index 43fcda2126d1..5f186b7f1c60 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyClassNameCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyClassNameCompletionTest.groovy @@ -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", "FBGDa") myFixture.complete(CompletionType.BASIC, 2) - myFixture.type '.'.charAt(0) + myFixture.type '.' myFixture.checkResult "a.FooBarGooDoo.a" }