From 19803e7436cb4bb488a0451a88e65e6dac10019b Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 8 Mar 2013 11:31:32 +0100 Subject: [PATCH] IDEA-97353 (Method can be variable arity method shall have an option to be ignored on methods implementing/overriding another method) --- .../siyeh/InspectionGadgetsBundle.properties | 3 +- ...hodCanBeVariableArityMethodInspection.java | 55 +++++++++---------- .../MethodCanBeVariableArityMethod.html | 4 ++ .../MethodCanBeVariableArity.java | 7 +++ ...anBeVariableArityMethodInspectionTest.java | 7 +-- 5 files changed, 42 insertions(+), 34 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties index e4987fe503f0..3be454caa5c3 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties @@ -1226,7 +1226,7 @@ object.notify.replace.quickfix=Replace with 'notifyAll()' safe.lock.problem.descriptor=''{0}'' should be locked in front of a ''try'' block and unlocked in the corresponding ''finally'' block #loc synchronized.method.problem.descriptor=Method ''{0}()'' declared #ref #loc synchronized.method.include.option=Include native methods -synchronized.method.ignore.synchronized.super.option=Ignore overrides synchronized methods +synchronized.method.ignore.synchronized.super.option=Ignore methods overriding a synchronized method synchronized.method.move.quickfix=Move synchronization into method thread.run.replace.quickfix=Replace with 'start()' volatile.field.problem.descriptor=Volatile field #ref of type ''{0}'' #loc @@ -1897,6 +1897,7 @@ arrays.hash.code.quickfix=Replace with 'Arrays.hashCode()' method.can.be.variable.arity.method.display.name=Method can be variable arity method method.can.be.variable.arity.method.problem.descriptor=#ref() can be converted to variable arity method #loc method.can.be.variable.arity.method.ignore.byte.short.option=Ignore methods with a last parameter of type byte[] or short[] +method.can.be.variable.arity.method.ignore.overriding.methods=Ignore methods overriding a super method convert.to.variable.arity.method.quickfix=Convert to variable arity method mismatched.string.builder.query.update.display.name=Mismatched query and update of StringBuilder mismatched.string.builder.updated.problem.descriptor=Contents of {0} #ref are updated, but never queried #loc diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspection.java index 1c171d52fc5d..f4ea3c7365a2 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 Bas Leijdekkers + * Copyright 2011-2013 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,11 +16,11 @@ package com.siyeh.ig.migration; import com.intellij.codeInspection.ProblemDescriptor; -import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; +import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.search.searches.SuperMethodsSearch; import com.intellij.psi.util.PsiUtil; -import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -36,26 +36,30 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { @SuppressWarnings({"PublicField"}) public boolean ignoreByteAndShortArrayParameters = false; + @SuppressWarnings("PublicField") + public boolean ignoreOverridingMethods = false; + @Nls @NotNull @Override public String getDisplayName() { - return InspectionGadgetsBundle.message( - "method.can.be.variable.arity.method.display.name"); + return InspectionGadgetsBundle.message("method.can.be.variable.arity.method.display.name"); } @NotNull @Override protected String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message( - "method.can.be.variable.arity.method.problem.descriptor"); + return InspectionGadgetsBundle.message("method.can.be.variable.arity.method.problem.descriptor"); } @Override public JComponent createOptionsPanel() { - return new SingleCheckboxOptionsPanel(InspectionGadgetsBundle.message( - "method.can.be.variable.arity.method.ignore.byte.short.option"), - this, "ignoreByteAndShortArrayParameters"); + final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox(InspectionGadgetsBundle.message("method.can.be.variable.arity.method.ignore.byte.short.option"), + "ignoreByteAndShortArrayParameters"); + panel.addCheckbox(InspectionGadgetsBundle.message("method.can.be.variable.arity.method.ignore.overriding.methods"), + "ignoreOverridingMethods"); + return panel; } @Override @@ -63,19 +67,16 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return new MethodCanBeVariableArityMethodFix(); } - private static class MethodCanBeVariableArityMethodFix - extends InspectionGadgetsFix { + private static class MethodCanBeVariableArityMethodFix extends InspectionGadgetsFix { @NotNull @Override public String getName() { - return InspectionGadgetsBundle.message( - "convert.to.variable.arity.method.quickfix"); + return InspectionGadgetsBundle.message("convert.to.variable.arity.method.quickfix"); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { + protected void doFix(Project project, ProblemDescriptor descriptor) { final PsiElement element = descriptor.getPsiElement(); final PsiElement parent = element.getParent(); if (!(parent instanceof PsiMethod)) { @@ -87,19 +88,15 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return; } final PsiParameter[] parameters = parameterList.getParameters(); - final PsiParameter lastParameter = - parameters[parameters.length - 1]; + final PsiParameter lastParameter = parameters[parameters.length - 1]; final PsiType type = lastParameter.getType(); if (!(type instanceof PsiArrayType)) { return; } final PsiArrayType arrayType = (PsiArrayType)type; final PsiType componentType = arrayType.getComponentType(); - final PsiElementFactory factory = - JavaPsiFacade.getElementFactory(project); - final PsiTypeElement newTypeElement = - factory.createTypeElementFromText( - componentType.getCanonicalText() + "...", method); + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); + final PsiTypeElement newTypeElement = factory.createTypeElementFromText(componentType.getCanonicalText() + "...", method); final PsiTypeElement typeElement = lastParameter.getTypeElement(); if (typeElement != null) { typeElement.replace(newTypeElement); @@ -112,8 +109,7 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return new MethodCanBeVariableArityMethodVisitor(); } - private class MethodCanBeVariableArityMethodVisitor - extends BaseInspectionVisitor { + private class MethodCanBeVariableArityMethodVisitor extends BaseInspectionVisitor { @Override public void visitMethod(PsiMethod method) { @@ -126,8 +122,7 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return; } final PsiParameter[] parameters = parameterList.getParameters(); - final PsiParameter lastParameter = - parameters[parameters.length - 1]; + final PsiParameter lastParameter = parameters[parameters.length - 1]; final PsiType type = lastParameter.getType(); if (!(type instanceof PsiArrayType)) { return; @@ -142,14 +137,16 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return; } if (ignoreByteAndShortArrayParameters) { - if (PsiType.BYTE.equals(componentType) || - PsiType.SHORT.equals(componentType)) { + if (PsiType.BYTE.equals(componentType) || PsiType.SHORT.equals(componentType)) { return; } } if (LibraryUtil.isOverrideOfLibraryMethod(method)) { return; } + if (ignoreOverridingMethods && SuperMethodsSearch.search(method, null, true, false).findFirst() != null) { + return; + } registerMethodError(method); } } diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/MethodCanBeVariableArityMethod.html b/plugins/InspectionGadgets/src/inspectionDescriptions/MethodCanBeVariableArityMethod.html index 62d61cd226cd..4445fa8fcb39 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/MethodCanBeVariableArityMethod.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/MethodCanBeVariableArityMethod.html @@ -7,6 +7,10 @@ This inspection only reports if the project or module is configured to use a language level of 5.0 or higher.

+Use the first checkbox below to not offer to convert byte[] or short[] parameters to vararg. +

+Use the second checkbox below to ignore methods overriding a method in a super class. +

New in 10.5, Powered by InspectionGadgets \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/method_can_be_variable_arity_method/MethodCanBeVariableArity.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/method_can_be_variable_arity_method/MethodCanBeVariableArity.java index 4fd8268a94fe..db74d0cfc230 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/method_can_be_variable_arity_method/MethodCanBeVariableArity.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/method_can_be_variable_arity_method/MethodCanBeVariableArity.java @@ -17,4 +17,11 @@ abstract class MyInputStream extends Reader { public int read(char[] cbuf) throws IOException { return super.read(cbuf); } +} +class Sub extends MethodCanBeVariableArity { + + @Override + public void convertMe(String[] ss) { + super.convertMe(ss); + } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspectionTest.java index b07f6920fb2e..a54bd64d3b47 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspectionTest.java @@ -5,10 +5,9 @@ import com.siyeh.ig.IGInspectionTestCase; public class MethodCanBeVariableArityMethodInspectionTest extends IGInspectionTestCase { public void test() throws Exception { - final MethodCanBeVariableArityMethodInspection tool = - new MethodCanBeVariableArityMethodInspection(); + final MethodCanBeVariableArityMethodInspection tool = new MethodCanBeVariableArityMethodInspection(); tool.ignoreByteAndShortArrayParameters = true; - doTest("com/siyeh/igtest/migration/method_can_be_variable_arity_method", - tool); + tool.ignoreOverridingMethods = true; + doTest("com/siyeh/igtest/migration/method_can_be_variable_arity_method", tool); } } \ No newline at end of file