From a6fe4c6d2fa88b76ac65d488062004f438587972 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 31 Dec 2015 14:07:14 +0100 Subject: [PATCH] IG: improved and added quickfix to "Confusing primitive array argument to varargs method" inspection --- .../src/META-INF/InspectionGadgets.xml | 3 +- .../siyeh/InspectionGadgetsBundle.properties | 4 +-- ...ArgumentToVariableArgMethodInspection.java | 30 +++++++++++++++++-- ...itiveArrayArgumentToVariableArgMethod.java | 6 ++-- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml index 0d4d64874793..97450393ccb4 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml @@ -319,7 +319,8 @@ - diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties index 2c8619ccdca6..b2e1602fd511 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties @@ -130,8 +130,8 @@ non.short.circuit.boolean.expression.problem.descriptor=Non-short-circuit boolea non.short.circuit.boolean.expression.replace.quickfix=Replace with short circuit expression null.argument.to.var.arg.method.display.name=Confusing argument to varargs method null.argument.to.var.arg.method.problem.descriptor=Confusing argument #ref, unclear if a varargs or non-varargs call is desired #loc -primitive.array.argument.to.var.arg.method.display.name=Confusing primitive array argument to var-arg method -primitive.array.argument.to.var.arg.method.problem.descriptor=Confusing primitive array argument to var-arg method #loc +primitive.array.argument.to.var.arg.method.display.name=Confusing primitive array argument to varargs method +primitive.array.argument.to.var.arg.method.problem.descriptor=Confusing primitive array argument to varargs method #loc object.comparison.display.name=Object comparison using '==', instead of 'equals()' object.comparison.enumerated.ignore.option=Ignore '==' between enumerated types object.comparison.klass.ignore.option=Ignore '==' on 'java.lang.Class' objects diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/PrimitiveArrayArgumentToVariableArgMethodInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/PrimitiveArrayArgumentToVariableArgMethodInspection.java index 9f4a952b51fc..4dc241c12896 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/PrimitiveArrayArgumentToVariableArgMethodInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/PrimitiveArrayArgumentToVariableArgMethodInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2014 Dave Griffith, Bas Leijdekkers + * Copyright 2006-2015 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,18 +16,34 @@ package com.siyeh.ig.bugs; import com.intellij.codeInsight.AnnotationUtil; +import com.intellij.codeInsight.daemon.impl.quickfix.AddTypeCastFix; import com.intellij.psi.*; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.ig.DelegatingFix; +import com.siyeh.ig.InspectionGadgetsFix; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Arrays; public class PrimitiveArrayArgumentToVariableArgMethodInspection extends BaseInspection { + @NotNull + @Override + public String getID() { + return "PrimitiveArrayArgumentToVarargsMethod"; + } + + @Nullable + @Override + public String getAlternativeID() { + return "PrimitiveArrayArgumentToVariableArgMethod"; // keep old suppression working + } + @Override @NotNull public String getDisplayName() { @@ -50,6 +66,14 @@ public class PrimitiveArrayArgumentToVariableArgMethodInspection extends BaseIns return PsiUtil.isLanguageLevel5OrHigher(file); } + @Nullable + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiExpression argument = (PsiExpression)infos[0]; + final PsiType type = (PsiType)infos[1]; + return new DelegatingFix(new AddTypeCastFix(type, argument)); + } + @Override public BaseInspectionVisitor buildVisitor() { return new PrimitiveArrayArgumentToVariableArgVisitor(); @@ -84,11 +108,11 @@ public class PrimitiveArrayArgumentToVariableArgMethodInspection extends BaseIns if (!lastParameter.isVarArgs()) { return; } - final PsiType parameterType = lastParameter.getType(); + final PsiEllipsisType parameterType = (PsiEllipsisType)lastParameter.getType(); if (isDeepPrimitiveArrayType(parameterType, result.getSubstitutor())) { return; } - registerError(lastArgument); + registerError(lastArgument, lastArgument, parameterType.getComponentType()); } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/var_arg/PrimitiveArrayArgumentToVariableArgMethod.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/var_arg/PrimitiveArrayArgumentToVariableArgMethod.java index 3c4ab826ef53..e56390324c55 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/var_arg/PrimitiveArrayArgumentToVariableArgMethod.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/var_arg/PrimitiveArrayArgumentToVariableArgMethod.java @@ -6,7 +6,7 @@ public class PrimitiveArrayArgumentToVariableArgMethod { public static void main(String[] arg) throws Throwable { - methodVarArgObject(new byte[3]); + methodVarArgObject(new byte[3]); methodVarArgByteArray(new byte[3]); MethodHandle meh = null; meh.invokeExact(new int[] { }); @@ -31,7 +31,7 @@ public class PrimitiveArrayArgumentToVariableArgMethod } void m() { - String.format("%s", new int[]{1, 2, 3}); + String.format("%s", new int[]{1, 2, 3}); } static void bar1(java.lang.Object... objects) { @@ -48,7 +48,7 @@ public class PrimitiveArrayArgumentToVariableArgMethod public static void invoke() { int[] ints = {1, 2, 3}; - bar1(ints); // warn here + bar1(ints); // warn here bar2(ints); // no warning needed here } } \ No newline at end of file