2015-02-06 66 views
11

我想定製Checkstyle JavadocVariable規則,以便它不會抱怨具有@FindBy註釋的字段。如何使Checkstyle忽略丟失的JavaDoc,只要有特定註釋

class Demo{ 

    @FindBy(id = "new-button") 
    public WebElement createButton; //<- no JavaDoc required because it is a field "injected" by selenium 

    public String otherField; //<- complain about missing Java doc 
} 

但我沒有線索如何在checkstyle.xml文件中指定此項。有人有想法嗎?

的事情,不這個用例的工作:

  • Modifyng的檢查類也無解!
  • ​​將無法​​正常工作,因爲它是一個註釋,但沒有評論

回答

10

我知道幾個解決方案,但它們都需要額外的工作要做。

  1. 實現自己的JavadocVariableCheck有可能跳過檢查提供註釋的情況。
  2. 實施CheckStyle的過濾器(如SuppressWarningsHolder + SuppressWarningsFilter但註釋支持)
  3. 或實現簡單的過濾器,其掃描@FindBy後它忽略了兩行。

我的解決辦法(最簡單的一個):

package org.aap.checks; 

import com.google.common.collect.Lists; 
import com.puppycrawl.tools.checkstyle.api.AuditEvent; 
import com.puppycrawl.tools.checkstyle.api.AutomaticBean; 
import com.puppycrawl.tools.checkstyle.api.FileContents; 
import com.puppycrawl.tools.checkstyle.api.Filter; 
import com.puppycrawl.tools.checkstyle.checks.FileContentsHolder; 

import java.lang.ref.WeakReference; 
import java.util.Collections; 
import java.util.Iterator; 
import java.util.List; 

public class SuppressWithAnnotationFilter 
     extends AutomaticBean 
     implements Filter { 

    public class Tag implements Comparable<Tag> { 
     private final int firstLine; 
     private final int lastLine; 

     public Tag(int firstLine, int lastLine) { 
      this.firstLine = firstLine; 
      this.lastLine = lastLine; 
     } 

     @Override 
     public int compareTo(Tag other) { 
      if (firstLine == other.firstLine) { 
       return lastLine - other.lastLine; 
      } 
      return (firstLine - other.firstLine); 
     } 

     public boolean isMatch(AuditEvent event) { 
      final int line = event.getLine(); 
      return line >= firstLine && line <= lastLine; 
     } 

     @Override 
     public final String toString() { 
      return "Tag[lines=" + firstLine + " to " + lastLine + "]"; 
     } 
    } 

    private final List<Tag> tags = Lists.newArrayList(); 
    private WeakReference<FileContents> fileContentsReference = 
      new WeakReference<FileContents>(null); 

    public FileContents getFileContents() { 
     return fileContentsReference.get(); 
    } 

    public void setFileContents(FileContents fileContents) { 
     fileContentsReference = new WeakReference<FileContents>(fileContents); 
    } 

    @Override 
    public boolean accept(AuditEvent event) { 
     if (event.getLocalizedMessage() == null) { 
      return true;  // A special event. 
     } 

     final FileContents currentContents = FileContentsHolder.getContents(); 
     if (currentContents == null) { 
      return true; 
     } 
     if (getFileContents() != currentContents) { 
      setFileContents(currentContents); 
      tagSuppressions(); 
     } 
     for (final Iterator<Tag> iter = tags.iterator(); iter.hasNext();) { 
      final Tag tag = iter.next(); 
      if (tag.isMatch(event)) { 
       return false; 
      } 
     } 
     return true; 
    } 

    private void tagSuppressions() { 
     tags.clear(); 
     final FileContents contents = getFileContents(); 

     String[] contentsLines = contents.getLines(); 
     for (int i = 0; i < contentsLines.length; i++) { 
      if (contentsLines[i].contains("@FindBy")) { 
       tags.add(new Tag(i+1, i+2)); 
      } 
     } 

     Collections.sort(tags); 
    } 
} 

添加結果類到的CheckStyle任務的類路徑,然後在指定checkstyle.xml過濾:

<?xml version="1.0"?> 
<!DOCTYPE module PUBLIC 
    "-//Puppy Crawl//DTD Check Configuration 1.3//EN" 
    "http://www.puppycrawl.com/dtds/configuration_1_3.dtd"> 
<module name="Checker"> 
    <module name="TreeWalker"> 
    .... 
    <!-- your Check goes here --> 
    <module name="org.aap.checks.SuppressWithAnnotationFilter"/> 
    .... 
    </module> 
</module>