Re: Package and class declaration versus the directory and file names

Oliver Burn <[email protected]> Wed, 11 Aug 2010 20:41:01 +1000
Newsgroups gmane.comp.java.audit.checkstyle.user
Message-ID <[email protected]>
Thanks - do you mind if I add these to the next release of Checkstyle?

On Wed, Aug 4, 2010 at 14:25, Richard Walker <[email protected]>wrote:

> On 4 August 2010 11:12, Oliver Burn <[email protected]> wrote:
> >  All available checks are listed at
> > http://checkstyle.sourceforge.net/availablechecks.html
>
> Yes, I did check that list first.
>
> > There are no checks for what you are looking for. Typically the compiler
> > or IDE warns about these errors.
>
> Except that neither my IDE (Emacs) nor compiler (Sun, oops, Oracle JDK
> javac) does.
>
> So after a few hours, I now have the following two checks working.
> I have not done any polishing; I attach in case anyone else is interested.
>
>
> 1.
>
> import com.puppycrawl.tools.checkstyle.api.*;
>
> public class PackageMatchesDirectory extends Check {
>
>    private String dirSearchString = "";
>    private int dirSearchStringLength;
>
>    public void setDirSearchString(String s) {
>        dirSearchString = s;
>        dirSearchStringLength = dirSearchString.length();
>    }
>
>    @Override
>        public int[] getDefaultTokens()
>    {
>        return new int[]{TokenTypes.PACKAGE_DEF};
>    }
>
>    @Override
>        public void visitToken(DetailAST ast)
>    {
>        DetailAST nameAST = ast.getLastChild().getPreviousSibling();
>        FullIdent full = FullIdent.createFullIdent(nameAST);
>
>        String thisFilename = getFileContents().getFilename();
>
>        /* Strip away everything up to and including dirSearchString */
>        int srcPosition = thisFilename.indexOf(dirSearchString);
>        if (srcPosition == -1) {
>            log(ast.getLineNo(),
>                "attempt to check source code not in " +
>                dirSearchString + " directory");
>            return;
>        }
>
>        thisFilename = thisFilename.substring(srcPosition +
>                                              dirSearchStringLength);
>        srcPosition = thisFilename.lastIndexOf("/");
>        if (srcPosition == -1) {
>            log(ast.getLineNo(),
>                "source file at top level has a package declaration");
>            return;
>        }
>
>        String thisDirname = thisFilename.substring(0,srcPosition);
>
>        if (!(thisDirname.replace('/','.').equals(full.getText()))) {
>            log(ast.getLineNo(),
>                "package declaration does not match directory path");
>
>        }
>    }
>
> }
>
>
> 2.
>
> import com.puppycrawl.tools.checkstyle.api.*;
>
> public class OuterTypeMatchesFilename extends Check {
>
>    private boolean haveSeenFirstToken;
>
>    @Override
>        public int[] getDefaultTokens()
>    {
>        return new int[] {TokenTypes.CLASS_DEF, TokenTypes.INTERFACE_DEF,
>            TokenTypes.ENUM_DEF, TokenTypes.ANNOTATION_DEF, };
>    }
>
>    @Override
>    public void beginTree(DetailAST ast)
>    {
>        haveSeenFirstToken = false;
>    }
>
>    @Override
>    public void visitToken(DetailAST ast)
>    {
>        /* Only check first declaration */
>        if (haveSeenFirstToken) {
>            return;
>        }
>        haveSeenFirstToken = true;
>
>        String outerTypeName =
> ast.findFirstToken(TokenTypes.IDENT).getText();
>
>
>        String thisFilename = getFileContents().getFilename();
>
>        /* Strip away everything up to and including last slash, and
>           .java suffix */
>        int srcPosition = thisFilename.lastIndexOf("/");
>        thisFilename = thisFilename.substring(srcPosition + 1);
>
>        if (!thisFilename.endsWith(".java")) {
>            log(ast.getLineNo(),
>                "filename does not end in .java");
>            return;
>        }
>
>        thisFilename = thisFilename.substring(0,thisFilename.length()-5);
>
>        if (!(thisFilename.equals(outerTypeName))) {
>            log(ast.getLineNo(),
>                "outer type declaration does not match filename");
>
>        }
>    }
>
> }
>
>
> ------------------------------------------------------------------------------
> The Palm PDK Hot Apps Program offers developers who use the
> Plug-In Development Kit to bring their C/C++ apps to Palm for a share
> of $1 Million in cash or HP Products. Visit us here for more details:
> http://p.sf.net/sfu/dev2dev-palm
> _______________________________________________
> Checkstyle-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/checkstyle-user
>

------------------------------------------------------------------------------
This SF.net email is sponsored by 

Make an app they can't live without
Enter the BlackBerry Developer Challenge
http://p.sf.net/sfu/RIM-dev2dev

_______________________________________________
Checkstyle-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/checkstyle-user