diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/naming/MethodNamingConventionsRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/naming/MethodNamingConventionsRule.java index de9e7f19c7..5f7068f20e 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/naming/MethodNamingConventionsRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/naming/MethodNamingConventionsRule.java @@ -3,17 +3,37 @@ */ package net.sourceforge.pmd.lang.java.rule.naming; +import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; +import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclarator; import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; +import net.sourceforge.pmd.lang.rule.properties.BooleanProperty; public class MethodNamingConventionsRule extends AbstractJavaRule { + private boolean checkNativeMethods; + + private static final BooleanProperty CHECK_NATIVE_METHODS_DESCRIPTOR = new BooleanProperty("checkNativeMethods", + "Check native methods", true, 1.0f); + + public MethodNamingConventionsRule() { + definePropertyDescriptor(CHECK_NATIVE_METHODS_DESCRIPTOR); + } + + public Object visit(ASTCompilationUnit node, Object data) { + checkNativeMethods = getProperty(CHECK_NATIVE_METHODS_DESCRIPTOR); + return super.visit(node, data); + } + public Object visit(ASTMethodDeclarator node, Object data) { - - String methodName = node.getImage(); - + if (!checkNativeMethods && node.getFirstParentOfType(ASTMethodDeclaration.class).isNative()) { + return data; + } + + String methodName = node.getImage(); + if (Character.isUpperCase(methodName.charAt(0))) { - addViolationWithMessage(data, node, "Method names should not start with capital letters"); + addViolationWithMessage(data, node, "Method names should not start with capital letters"); } if (methodName.indexOf('_') >= 0) { addViolationWithMessage(data, node, "Method names should not contain underscores"); diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/naming/xml/MethodNamingConventions.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/naming/xml/MethodNamingConventions.xml index 3034d9c125..e962b685dc 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/naming/xml/MethodNamingConventions.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/naming/xml/MethodNamingConventions.xml @@ -33,4 +33,25 @@ public class Foo { } ]]> + + #1288 MethodNamingConventions for native should be deactivated + 0 + false + + + + #1288 MethodNamingConventions for native should be deactivated - prevent false negative + 1 + 2 + true + + diff --git a/src/site/markdown/overview/changelog.md b/src/site/markdown/overview/changelog.md index 730e4ec75a..7100ffd8c1 100644 --- a/src/site/markdown/overview/changelog.md +++ b/src/site/markdown/overview/changelog.md @@ -4,11 +4,13 @@ **Feature Requests and Improvements:** +* [#1288](https://sourceforge.net/p/pmd/bugs/1288/): MethodNamingConventions for native should be deactivated * [#1293](https://sourceforge.net/p/pmd/bugs/1293/): Disable VariableNamingConventions for native methods **New/Modified Rules:** * [Java / Design / UseVarargs](http://pmd.sourceforge.net/pmd-java/rules/java/design.html#UseVarargs): if `byte[]` is used as the last argument, it is ignored and no violation will be reported. +* [Java / Naming / MethodNamingConventions](http://pmd.sourceforge.net/pmd-java/rules/java/naming.html#MethodNamingConventions): New property `checkNativeMethods` * [Java / Naming / VariableNamingConventions](http://pmd.sourceforge.net/pmd-java/rules/java/naming.html#VariableNamingConventions): New property `checkNativeMethodParameters` **Pull requests:**