diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties
index 84b76ba906cb..c5f881316b13 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties
@@ -992,7 +992,8 @@ constant.on.lhs.of.comparison.problem.descriptor=#ref: constant on
constant.on.rhs.of.comparison.problem.descriptor=#ref: constant on right side of comparison #loc
control.flow.statement.without.braces.problem.descriptor=#ref without braces #loc
missorted.modifiers.problem.descriptor=Missorted modifiers #ref #loc
-c.style.array.declaration.problem.descriptor=C-style array declaration #ref #loc
+cstyle.array.variable.declaration.problem.descriptor=C-style array declaration of {0, choice, 1#field|2#parameter|3#local variable} #ref #loc
+cstyle.array.method.declaration.problem.descriptor=C-style array declaration of the return type of method #ref()#loc
multiple.declaration.problem.descriptor=Multiple variables in one declaration #loc
multiple.typed.declaration.problem.descriptor=Variables of different types in one declaration #loc
serializable.inner.class.has.serial.version.uid.field.problem.descriptor=Inner class #ref does not define a 'serialVersionUID' field #loc
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/CStyleArrayDeclarationInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/CStyleArrayDeclarationInspection.java
index e4e91685878b..fca66288aaef 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/CStyleArrayDeclarationInspection.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/CStyleArrayDeclarationInspection.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers
+ * Copyright 2003-2014 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,20 +16,24 @@
package com.siyeh.ig.style;
import com.intellij.codeInspection.ProblemDescriptor;
+import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel;
import com.intellij.openapi.project.Project;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiType;
-import com.intellij.psi.PsiTypeElement;
-import com.intellij.psi.PsiVariable;
-import com.intellij.util.IncorrectOperationException;
+import com.intellij.psi.*;
+import com.intellij.psi.codeStyle.CodeStyleManager;
+import com.intellij.psi.tree.IElementType;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
import com.siyeh.ig.InspectionGadgetsFix;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
public class CStyleArrayDeclarationInspection extends BaseInspection {
+ public boolean ignoreVariables = false;
+
@Override
@NotNull
public String getDisplayName() {
@@ -40,8 +44,18 @@ public class CStyleArrayDeclarationInspection extends BaseInspection {
@Override
@NotNull
protected String buildErrorString(Object... infos) {
- return InspectionGadgetsBundle.message(
- "c.style.array.declaration.problem.descriptor");
+ final Object info = infos[0];
+ if (info instanceof PsiMethod) {
+ return InspectionGadgetsBundle.message("cstyle.array.method.declaration.problem.descriptor");
+ }
+ final int choice = info instanceof PsiField ? 1 : info instanceof PsiParameter ? 2 : 3;
+ return InspectionGadgetsBundle.message("cstyle.array.variable.declaration.problem.descriptor", Integer.valueOf(choice));
+ }
+
+ @Nullable
+ @Override
+ public JComponent createOptionsPanel() {
+ return new SingleCheckboxOptionsPanel("Ignore C-style declarations in variables", this, "ignoreVariables");
}
@Override
@@ -65,12 +79,38 @@ public class CStyleArrayDeclarationInspection extends BaseInspection {
}
@Override
- public void doFix(Project project, ProblemDescriptor descriptor)
- throws IncorrectOperationException {
- final PsiElement nameElement = descriptor.getPsiElement();
- final PsiVariable var = (PsiVariable)nameElement.getParent();
- assert var != null;
- var.normalizeDeclaration();
+ public void doFix(Project project, ProblemDescriptor descriptor) {
+ final PsiElement element = descriptor.getPsiElement().getParent();
+ if (element instanceof PsiVariable) {
+ final PsiVariable variable = (PsiVariable)element;
+ variable.normalizeDeclaration();
+ CodeStyleManager.getInstance(project).reformat(variable);
+ }
+ else if (element instanceof PsiMethod) {
+ final PsiMethod method = (PsiMethod)element;
+ final PsiTypeElement returnTypeElement = method.getReturnTypeElement();
+ if (returnTypeElement == null) {
+ return;
+ }
+ final PsiType returnType = method.getReturnType();
+ if (returnType == null) {
+ return;
+ }
+ PsiElement child = method.getParameterList();
+ while (!(child instanceof PsiCodeBlock)) {
+ final PsiElement element1 = child;
+ child = child.getNextSibling();
+ if (element1 instanceof PsiJavaToken) {
+ final PsiJavaToken token = (PsiJavaToken)element1;
+ final IElementType tokenType = token.getTokenType();
+ if (JavaTokenType.LBRACKET.equals(tokenType) || JavaTokenType.RBRACKET.equals(tokenType)) {
+ token.delete();
+ }
+ }
+ }
+ final PsiTypeElement typeElement = JavaPsiFacade.getElementFactory(project).createTypeElement(returnType);
+ returnTypeElement.replace(typeElement);
+ }
}
}
@@ -79,17 +119,19 @@ public class CStyleArrayDeclarationInspection extends BaseInspection {
return new CStyleArrayDeclarationVisitor();
}
- private static class CStyleArrayDeclarationVisitor
- extends BaseInspectionVisitor {
+ private class CStyleArrayDeclarationVisitor extends BaseInspectionVisitor {
@Override
- public void visitVariable(@NotNull PsiVariable var) {
- super.visitVariable(var);
- final PsiType declaredType = var.getType();
+ public void visitVariable(@NotNull PsiVariable variable) {
+ super.visitVariable(variable);
+ if (ignoreVariables) {
+ return;
+ }
+ final PsiType declaredType = variable.getType();
if (declaredType.getArrayDimensions() == 0) {
return;
}
- final PsiTypeElement typeElement = var.getTypeElement();
+ final PsiTypeElement typeElement = variable.getTypeElement();
if (typeElement == null) {
return; // Could be true for enum constants.
}
@@ -97,7 +139,25 @@ public class CStyleArrayDeclarationInspection extends BaseInspection {
if (elementType.equals(declaredType)) {
return;
}
- registerVariableError(var);
+ registerVariableError(variable, variable);
+ }
+
+ @Override
+ public void visitMethod(PsiMethod method) {
+ super.visitMethod(method);
+ final PsiType returnType = method.getReturnType();
+ if (returnType == null || returnType.getArrayDimensions() == 0) {
+ return;
+ }
+ final PsiTypeElement typeElement = method.getReturnTypeElement();
+ if (typeElement == null) {
+ return;
+ }
+ final PsiType type = typeElement.getType();
+ if (type.equals(returnType)) {
+ return;
+ }
+ registerMethodError(method, method);
}
}
}
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/CStyleArrayDeclaration.html b/plugins/InspectionGadgets/src/inspectionDescriptions/CStyleArrayDeclaration.html
index 6b8f3ff43b2a..7320abc37f19 100644
--- a/plugins/InspectionGadgets/src/inspectionDescriptions/CStyleArrayDeclaration.html
+++ b/plugins/InspectionGadgets/src/inspectionDescriptions/CStyleArrayDeclaration.html
@@ -1,9 +1,18 @@
+ public String process(String value[])[] {
+ return value;
+ }
+
+Most code styles prefer Java-style array declarations, with the array indicator brackets attached to the type name.
+Use the checkbox below to only report C-style array declaration of method return types. +
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/style/cstyle_array_declaration/FieldWithWhitespace.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/style/cstyle_array_declaration/FieldWithWhitespace.after.java
new file mode 100644
index 000000000000..3a3984b1a64c
--- /dev/null
+++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/style/cstyle_array_declaration/FieldWithWhitespace.after.java
@@ -0,0 +1,4 @@
+class FieldWithWhitespace {
+
+ String[] s;
+}
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/style/cstyle_array_declaration/FieldWithWhitespace.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/style/cstyle_array_declaration/FieldWithWhitespace.java
new file mode 100644
index 000000000000..1f02831d6632
--- /dev/null
+++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/style/cstyle_array_declaration/FieldWithWhitespace.java
@@ -0,0 +1,4 @@
+class FieldWithWhitespace {
+
+ String s