Editing Cs-doclet

Jump to navigation Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
<meta name="keywords" content="java, doclet, javadoc, checkstyle"></meta>
<meta name="description" content="A doclet that generates the metadata files for CHECKSTYLE and ECLIPSE-CS from annotations and DOC tags in the source code of the checks and filters"></meta>
== Abstract ==
== Abstract ==


Cs-doclet is a [http://docs.oracle.com/javase/8/docs/technotes/guides/javadoc/ JAVADOC doclet] that generates the metadata files for [http://checkstyle.sourceforge.net/ CheckStyle] and [http://eclipse-cs.sourceforge.net/ eclipse-cs] from annotations and [http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html#CHDJGIJB doc tags] in the source code of your checks and filters.
Cs-doclet is a [http://docs.oracle.com/javase/8/docs/technotes/guides/javadoc/ JAVADOC doclet] that generates the metadata files for [http://checkstyle.sourceforge.net/ CheckStyle] and [http://eclipse-cs.sourceforge.net/ eclipse-cs] from 'doc tags' in the source code of your checks and filters.
 
This doclet is useful only for authors of CheckStyle extensions, like [[Cs-contrib.unkrig.de|cs-contrib]].


== Intended audience ==
== Intended audience ==


This tool is useful for the development of [http://checkstyle.sourceforge.net/ CheckStyle] checks and filters, and for their integration in [http://eclipse-cs.sourceforge.net/ eclipse-cs] and [http://www.mediawiki.org/wiki/MediaWiki MediaWiki].
This tool is useful for development of [http://checkstyle.sourceforge.net/ CheckStyle] checks and filters, and for their integration in [http://eclipse-cs.sourceforge.net/ eclipse-cs] and [http://www.mediawiki.org/wiki/MediaWiki MediaWiki].


== Extending CheckStyle ==
== Extending CheckStyle ==


CheckStyle comes with an API to [http://checkstyle.sourceforge.net/writingchecks.html extend] it with custom checks and filters. Here is a completely useless, yet typical example of a custom check:
CheckStyle comes with an API to [http://checkstyle.sourceforge.net/writingchecks.html extend] it with custom checks and filters. Here is completely useless, yet typical example of a custom check:


'''File "src/com/pany/cs/checks/ColorCheck.java":'''
'''File "src/com/pany/cs/checks/ColorCheck.java":'''
Line 53: Line 49:
   <property name="severity" value="warning" />
   <property name="severity" value="warning" />
   <module name="TreeWalker">
   <module name="TreeWalker">
     <module name="com.pany: ColorCheck">
     <module name="com.pany.cs.checks.ColorCheck">
       <property name="color" value="blue" />
       <property name="color" value="blue" />
     </module>
     </module>
Line 62: Line 58:


  $ javac -d bin src/com/pany/cs/checks/ColorCheck.java
  $ javac -d bin src/com/pany/cs/checks/ColorCheck.java
  $ java -classpath '<span style="color:red">bin</span>;path/to/checkstyle-6.1-all.jar' \
  $ java -classpath bin;path/to/checkstyle-6.1-all.jar \
  > com.puppycrawl.tools.checkstyle.Main \
  > com.puppycrawl.tools.checkstyle.Main \
  > -c checkstyle-config.xml \
  > -c checkstyle-config.xml \
Line 76: Line 72:
Obviously, the Java code and the "messages.properties" files must be kept in sync with the Java code at all times, which is naturally very error-prone.
Obviously, the Java code and the "messages.properties" files must be kept in sync with the Java code at all times, which is naturally very error-prone.


Cs-doclet facilitates the task by generating the "messages.properties" file from annotations in the source code:
Cs-doclet facilitates the task by generating the "messages.properties" file from doc tags in the source code:


'''File "src/com/pany/cs/checks/MyCheck.java":'''
'''File "src/com/pany/cs/checks/MyCheck.java":'''
Line 88: Line 84:
  class ColorCheck extends Check {
  class ColorCheck extends Check {
   
   
     <span style="color:red">@Message("The color is ''{0}''")
     <span style="color:red">/** @cs-message The color is ''{0}'' */
     private static final String MESSAGE_KEY_THE_COLOR_IS = "theColorIs";</span>
     public static final String MESSAGE_KEY_THE_COLOR_IS = "theColorIs";</span>
   
   
     public void
     public void
Line 105: Line 101:
  $ javadoc \
  $ javadoc \
  > <span style="color:red">-doclet de.unkrig.doclet.cs.CsDoclet</span> \
  > <span style="color:red">-doclet de.unkrig.doclet.cs.CsDoclet</span> \
  > <span style="color:red">-docletpath "path/to/cs-doclet.jar;bin;path/to/checkstyle-6.1-all.jar;path/to/net.sf.eclipsecs.core-6.1.jar"</span> \
  > <span style="color:red">-docletpath path/to/cs-doclet.jar;bin;path/to/checkstyle-6.1-all.jar;path/to/net.sf.eclipsecs.core-6.1.jar</span>
  > <span style="color:red">-messages.properties-dir src</span> \
  > <span style="color:red">-messages.properties-dir src</span>
  > -sourcepath src \
  > -sourcepath src
  > -classpath ../net.sf.checkstyle-6.1/checkstyle-6.1/checkstyle-6.1-all.jar \
  > -classpath ../net.sf.checkstyle-6.1/checkstyle-6.1/checkstyle-6.1-all.jar
  > com.pany.cs.checks
  > com.pany.cs.checks
  Loading source files for package com.pany.cs.checks...
  Loading source files for package com.pany.cs.checks...
Line 118: Line 114:
The generated "src/com/pany/cs/checks/messages.properties" file looks like this:
The generated "src/com/pany/cs/checks/messages.properties" file looks like this:


  # This file was generated by the CS doclet; see http://cs-doclet.unkrig.de/
  # This file was generated by the CS doclet; see http://cs-contrib.unkrig.de
   
   
  # Custom check messages, in alphabetical order.
  # Custom check messages, in alphabetical order.
   
   
  # --------------- com.pany: ColorCheck ---------------
  # --------------- com.pany.cs.ColorCheck ---------------
  <span style="color:red">theColorIs</span> = <span style="color:red">The color is ''{0}''</span>
  theColorIs = The color is ''{0}''


And voilà! All the messages are where they belong: In the source code.
Now all the messages are where they belong: In the source code.


== Integrating with eclipse-cs ==
== Integrating with eclipse-cs ==
Line 142: Line 138:
             internal-name="com.pany.cs.checks.ColorCheck"
             internal-name="com.pany.cs.checks.ColorCheck"
             parent="TreeWalker"
             parent="TreeWalker"
             name="%ColorCheck.name"
             name="%com.pany.cs.checks.ColorCheck.name"
         >
         >
             <alternative-name internal-name="com.pany.cs.checks.ColorCheck" />
             <alternative-name internal-name="com.pany.cs.checks.ColorCheck" />
             <description>%ColorCheck.desc</description>
             <description>%com.pany.cs.checks.ColorCheck.desc</description>
   
   
             <property-metadata
             <property-metadata
Line 152: Line 148:
                 default-value="Yellow"
                 default-value="Yellow"
             >
             >
                 <description>%ColorCheck.color</description>
                 <description>%com.pany.cs.checks.ColorCheck.color</description>
             </property-metadata>
             </property-metadata>
             <message-key key="theColorIs" />
             <message-key key="theColorIs" />
Line 161: Line 157:
'''File "checkstyle-metadata.properties":'''
'''File "checkstyle-metadata.properties":'''
  Whitespace.group = Whitespace
  Whitespace.group = Whitespace
  ColorCheck.name = com.pany: ColorCheck
  com.pany.cs.checks.ColorCheck.name = com.pany.cs.ColorCheck
  ColorCheck.desc =\
  com.pany.cs.checks.ColorCheck.desc =\
     A completely useless check which merely prints a (localizable) message each \
     A completely useless check which merely prints a (localizable) message each \
     time it encounters an annotation.
     time it encounters an annotation.
  ColorCheck.color = A completely useless check parameter.
  com.pany.cs.checks.ColorCheck.color = A completely useless check parameter.


Tedious, isn't it? Well, you can tell cs-doclet to also generate ''these'' files from annotations (and doc comments):
Tedious, isn't it? Well, you can tell cs-doclet to also generate ''these'' files from doc comments:


'''File "src/com/pany/cs/checks/MyCheck.java":'''
'''File "src/com/pany/cs/checks/MyCheck.java":'''
Line 178: Line 174:
  import com.puppycrawl.tools.checkstyle.api.TokenTypes;
  import com.puppycrawl.tools.checkstyle.api.TokenTypes;
   
   
  import de.unkrig.csdoclet.StringRuleProperty;
  <span style="color:red">/**
import de.unkrig.csdoclet.Rule;
  * A completely useless check which merely prints a (localizable) message each time it encounters an annotation.
   *
/**
  * @cs-rule-group         %Whitespace.group
  * <span style="color:red">A completely useless check which merely prints a</span>
  * @cs-rule-name         com.pany.cs.ColorCheck
  * <span style="color:red">(localizable) message each time it encounters an annotation.</span>
  * @cs-rule-parent       TreeWalker
   */
  */</span>
<span style="color:red">@Rule(
    group     = "%Whitespace.group",
    groupName  = "Whitespace",
    name       = "com.pany: ColorCheck",
    parent     = "TreeWalker"
)</span>
  public
  public
  class ColorCheck extends Check {
  class ColorCheck extends Check {
   
   
     @Message("The color is ''{0}''")
     /** @cs-message The color is ''{0}'' */
     private static final String MESSAGE_KEY_THE_COLOR_IS = "theColorIs";
     public static final String MESSAGE_KEY_THE_COLOR_IS = "theColorIs";
   
   
     /**
     <span style="color:red">/**
      * <span style="color:red">A completely useless check parameter</span>.
      * A completely useless check parameter.
       */
       *
     <span style="color:red">@StringRuleProperty(defaultValue = DEFAULT_COLOR)</span>
      * @cs-property-name          color
      * @cs-property-datatype     String
      * @cs-property-default-value Yellow
      */</span>
     public void
     public void
     setColor(String value) { this.color = value; }
     setColor(String value) { this.color = value; }
     private String color = "Yellow";
     private String color = <span style="color:red">DEFAULT_COLOR</span>;
    <span style="color:red">private static final String DEFAULT_COLOR = "Yellow";</span>
   
   
     @Override public int[]
     @Override public int[]
Line 217: Line 207:
  $ javadoc \
  $ javadoc \
  > -doclet de.unkrig.doclet.cs.CsDoclet \
  > -doclet de.unkrig.doclet.cs.CsDoclet \
  > -docletpath "path/to/cs-doclet.jar;bin;path/to/checkstyle-6.1-all.jar;path/to/net.sf.eclipsecs.core-6.1.jar" \
  > -docletpath path/to/cs-doclet.jar;bin;path/to/checkstyle-6.1-all.jar;path/to/net.sf.eclipsecs.core-6.1.jar
  > <span style="color:red">-checkstyle-metadata.properties-dir src</span> \
  > <span style="color:red">-checkstyle-metadata.properties-dir src</span>
  > <span style="color:red">-checkstyle-metadata.xml-dir src</span> \
  > <span style="color:red">-checkstyle-metadata.xml-dir src</span>
  > -messages.properties-dir src \
  > -messages.properties-dir src
  > -sourcepath src \
  > -sourcepath src
  > -classpath ../net.sf.checkstyle-6.1/checkstyle-6.1/checkstyle-6.1-all.jar \
  > -classpath ../net.sf.checkstyle-6.1/checkstyle-6.1/checkstyle-6.1-all.jar
  > com.pany.cs.checks
  > com.pany.cs.checks
  Loading source files for package com.pany.cs.checks...
  Loading source files for package com.pany.cs.checks...
Line 231: Line 221:


'''File "src/com/pany/cs/checks/checkstyle-metadata.properties":'''
'''File "src/com/pany/cs/checks/checkstyle-metadata.properties":'''
  # This file was generated by the CS doclet; see http://cs-doclet.unkrig.de/
  # This file was generated by the CS doclet; see http://cs-contrib.unkrig.de.
   
   
  # Rule groups:
  # Rule groups:
  <span style="color:red">Whitespace.group</span> = <span style="color:red">Whitespace</span>
  Whitespace.group = Whitespace
   
   
  # Custom checks, in alphabetical order.
  # Custom checks, in alphabetical order.
   
   
  # --------------- <span style="color:red">com.pany: ColorCheck</span> ---------------
  # --------------- com.pany.cs.ColorCheck ---------------
   
   
  <span style="color:red">ColorCheck.name</span> = <span style="color:red">com.pany: ColorCheck</span>
  com.pany.cs.checks.ColorCheck.name = com.pany.cs.ColorCheck
  <span style="color:red">ColorCheck.desc</span> =\
  com.pany.cs.checks.ColorCheck.desc =\
     <span style="color:red">A completely useless check which merely prints a (localizable) message each time it encounters an annotation.</span>
     A completely useless check which merely prints a (localizable) message each time it encounters an annotation.
  <span style="color:red">ColorCheck.color</span>                                 = <span style="color:red">A completely useless check parameter.</span>
  com.pany.cs.checks.ColorCheck.color                                  = A completely useless check parameter.


'''File "src/com/pany/cs/checks/checkstyle-metadata.xml":'''
'''File "src/com/pany/cs/checks/checkstyle-metadata.xml":'''
Line 252: Line 242:
  <checkstyle-metadata>
  <checkstyle-metadata>
   
   
     &lt;!-- This file was generated by the CS doclet; see http://cs-doclet.unkrig.de/ -->
     &lt;!-- This file was generated by the CS doclet; see http://cs-contrib.unkrig.de -->
   
   
     &lt;!-- ColorCheck -->
     &lt;!-- ColorCheck -->
   
   
     <rule-group-metadata name="<span style="color:red">%Whitespace.group</span>" priority="999">
     <rule-group-metadata name="%Whitespace.group" priority="999">
         <rule-metadata
         <rule-metadata
             internal-name="<span style="color:red">com.pany.cs.checks.ColorCheck</span>"
             internal-name="com.pany.cs.checks.ColorCheck"
             parent="<span style="color:red">TreeWalker</span>"
             parent="TreeWalker"
             name="<span style="color:red">%ColorCheck.name</span>"
             name="%com.pany.cs.checks.ColorCheck.name"
         >
         >
             <alternative-name internal-name="<span style="color:red">com.pany.cs.checks.ColorCheck</span>" />
             <alternative-name internal-name="com.pany.cs.checks.ColorCheck" />
             <description><span style="color:red">%ColorCheck.desc</span></description>
             <description>%com.pany.cs.checks.ColorCheck.desc</description>
   
   
             <property-metadata
             <property-metadata
                 name="<span style="color:red">color</span>"
                 name="color"
                 datatype="<span style="color:red">String</span>"
                 datatype="String"
                 default-value="<span style="color:red">Yellow</span>"
                 default-value="Yellow"
             >
             >
                 <description><span style="color:red">%ColorCheck.color</span></description>
                 <description>%com.pany.cs.checks.ColorCheck.color</description>
             </property-metadata>
             </property-metadata>
             <message-key key="theColorIs" />
             <message-key key="theColorIs" />
Line 277: Line 267:
  </checkstyle-metadata>
  </checkstyle-metadata>


== Javadoc-like documentation ==
== MediaWiki markup documentation ==


Typically, you will also want to publish human-readable documentation for your checks and filters, which is more or less identical with the text in the eclipse-cs metadata files. This is also possible with the "-d" command line option:
Typically, you will also want to publish human-readable documentation for your checks and filters, which is more or less identical with the text in the eclipse-cs files. This is also possible with the "-mediawiki-dir" command line option:


  $ javadoc \
  $ javadoc \
  > -doclet de.unkrig.doclet.cs.CsDoclet \
  > -doclet de.unkrig.doclet.cs.CsDoclet \
  > -docletpath "path/to/cs-doclet.jar;bin;path/to/checkstyle-6.1-all.jar;path/to/net.sf.eclipsecs.core-6.1.jar" \
  > -docletpath path/to/cs-doclet.jar;bin;path/to/checkstyle-6.1-all.jar;path/to/net.sf.eclipsecs.core-6.1.jar
  > -d ./csdoc \
  > -checkstyle-metadata.properties-dir src
  > -sourcepath src \
> -checkstyle-metadata.xml-dir src
  > -classpath ../net.sf.checkstyle-6.1/checkstyle-6.1/checkstyle-6.1-all.jar \
> -messages.properties-dir src
> <span style="color:red">-mediawiki-dir mediawiki</span>
  > -sourcepath src
  > -classpath ../net.sf.checkstyle-6.1/checkstyle-6.1/checkstyle-6.1-all.jar
  > com.pany.cs.checks
  > com.pany.cs.checks
  Loading source files for package com.pany.cs.checks...
  Loading source files for package com.pany.cs.checks...
Line 292: Line 285:
  $
  $


This will generate a Javadoc-like HTML documentation for all checks and filters that are declared in the given Java packages.
This will generate:


And you're done!
'''File "mediawiki/com.pany.cs.ColorCheck.mw":'''
<!-- This file was generated by the CS doclet; see http://cs-contrib.unkrig.de -->
A completely useless check which merely prints a (localizable) message each time it encounters an annotation.
== Properties ==
Default values appear <u>underlined</u>.
<dl>
<dt>color = "<i>String</i>" (optional; default value is Yellow)
<dd>A completely useless check parameter.
</dl>


== Summary ==
Upload this text to a MediaWiki repository, and you'll see:


Before, you had to write one Java file and four more or less redundant metadata files per check; now you merely have to throw in a few annotations and doc comments and generate all four metadata files from the source code
[[File:screenshot_mediawiki.jpg]]


== Source code ==
And you're done!


The source code for the plug-in is here:
== Summary ==


    https://github.com/aunkrig/doclet-cs
Before, you had to write one Java file and four more or less redundant metadata files per check; now you merely have to throw in a few doc tags and generate all four metadata files from the source code
    https://github.com/aunkrig/doclet-cs-annotation
Please note that all contributions to unkrig.de may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see Unkrig.de:Copyrights for details). Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)