昔のブログから引っ越してきた、2011/08/05当時の記事です
参考サイトを見ながらぺちぺちとコーディングルール作りの勉強を開始。
今時点でわかったこと
・PMDではチェック対象ソースがツリー状のオブジェクトに変換される。
・ツリー状のオブジェクトに対してXpathやJavaで条件を記載していくことで
ルールを作成できる
・ルールを継承する時の親はAbstractRuleでなくAbstractJavaRuleになっている
・javaで条件を欠く場合は、AbstractJavaRuleがVisterパターンで作られているので
そのvisitに書いていけばよい
・visitの第一引数は色々な型で用意されている。
型はクラスの宣言を表す型等色々あるみたいだが要調査。
・ルールの呼び出しはリンク先のejbrules.xmlをイメージして準備すればよいらしい。(未実行)
######## 親クラス ######
// import net.sourceforge.pmd.AbstractRule; @deprecated
import net.sourceforge.pmd.AbstractJavaRule; // 4.2.5ではこっち
######## もともとのソース ######
package jp.epea;
public class A001 {
/**
* @param args
*/
public static void main(String[] args) {
if(true){
}
}
}
######## ツリー状のソースオブジェクト(実質XML表現:><はエスケープ) ######
<?xml version="1.0" encoding="UTF-8"?> <CompilationUnit beginColumn="1" beginLine="1" comments="[net.sourceforge.pmd.ast.FormalComment@aa415d]" endColumn="3" endLine="15" packageDeclaration="PackageDeclaration"> <PackageDeclaration beginColumn="1" beginLine="1" endColumn="16" endLine="1" packageNameImage="jp.epea"> <Name beginColumn="9" beginLine="1" endColumn="15" endLine="1" image="jp.epea"/> </PackageDeclaration> <TypeDeclaration beginColumn="1" beginLine="3" endColumn="1" endLine="15"> <ClassOrInterfaceDeclaration abstract="false" beginColumn="8" beginLine="3" endColumn="1" endLine="15" final="false" image="A001" interface="false" modifiers="1" native="false" nested="false" packagePrivate="false" private="false" protected="false" public="true" static="false" strictfp="false" synchronized="false" transient="false" volatile="false"> <ClassOrInterfaceBody beginColumn="19" beginLine="3" endColumn="1" endLine="15"> <ClassOrInterfaceBodyDeclaration anonymousInnerClass="false" beginColumn="5" beginLine="8" endColumn="5" endLine="13" enumChild="false"> <MethodDeclaration abstract="false" beginColumn="19" beginLine="8" block="Block" endColumn="5" endLine="13" final="false" interfaceMember="false" methodName="main" modifiers="17" native="false" packagePrivate="false" private="false" protected="false" public="true" resultType="ResultType" static="true" strictfp="false" synchronized="false" syntacticallyAbstract="false" syntacticallyPublic="true" transient="false" void="true" volatile="false"> <ResultType beginColumn="19" beginLine="8" endColumn="22" endLine="8" void="true"/> <MethodDeclarator beginColumn="24" beginLine="8" endColumn="42" endLine="8" image="main" parameterCount="1"> <FormalParameters beginColumn="28" beginLine="8" endColumn="42" endLine="8" parameterCount="1"> <FormalParameter abstract="false" array="true" arrayDepth="1" beginColumn="29" beginLine="8" endColumn="41" endLine="8" final="false" modifiers="0" native="false" packagePrivate="true" private="false" protected="false" public="false" static="false" strictfp="false" synchronized="false" transient="false" typeNode="Type" varargs="false" volatile="false"> <Type array="true" arrayDepth="1" beginColumn="29" beginLine="8" endColumn="36" endLine="8" typeImage="String"> <ReferenceType array="true" arrayDepth="1" beginColumn="29" beginLine="8" endColumn="36" endLine="8"> <ClassOrInterfaceType beginColumn="29" beginLine="8" endColumn="34" endLine="8" image="String"/> </ReferenceType> </Type> <VariableDeclaratorId array="false" arrayDepth="0" beginColumn="38" beginLine="8" endColumn="41" endLine="8" exceptionBlockParameter="false" image="args" typeNameNode="ReferenceType" typeNode="Type"/> </FormalParameter> </FormalParameters> </MethodDeclarator> <Block beginColumn="44" beginLine="8" endColumn="5" endLine="13"> <BlockStatement allocation="false" beginColumn="9" beginLine="9" endColumn="9" endLine="11"> <Statement beginColumn="9" beginLine="9" endColumn="9" endLine="11"> <IfStatement beginColumn="9" beginLine="9" endColumn="9" endLine="11"> <Expression beginColumn="12" beginLine="9" endColumn="15" endLine="9"> <PrimaryExpression beginColumn="12" beginLine="9" endColumn="15" endLine="9"> <PrimaryPrefix beginColumn="12" beginLine="9" endColumn="15" endLine="9"> <Literal beginColumn="12" beginLine="9" charLiteral="false" endColumn="15" endLine="9" floatLiteral="false" intLiteral="false" singleCharacterStringLiteral="false" stringLiteral="false"> <BooleanLiteral beginColumn="12" beginLine="9" endColumn="15" endLine="9" true="true"/> </Literal> </PrimaryPrefix> </PrimaryExpression> </Expression> <Statement beginColumn="17" beginLine="9" endColumn="9" endLine="11"> <Block beginColumn="17" beginLine="9" endColumn="9" endLine="11"/> </Statement> </IfStatement> </Statement> </BlockStatement> </Block> </MethodDeclaration> </ClassOrInterfaceBodyDeclaration> </ClassOrInterfaceBody> </ClassOrInterfaceDeclaration> </TypeDeclaration> </CompilationUnit>