2015-02-06 5 views
11

Chcę dostosować regułę Checkstyle JavadocVariable, tak aby nie narzekała na pole z adnotacją @FindBy.Jak dokonać Checkstyle zignoruj ​​brakujące JavaDoc, gdy istnieje specyficzna adnotacja?

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 
} 

Ale nie mam pojęcia jak to określić w pliku checkstyle.xml. Czy ktoś ma pomysł?

Rzeczy, które nie działa w tym przypadku zastosowanie:

  • Modifyng sprawdzonej klasa ma również rozwiązanie!
  • SuppressWithNearbyCommentFilternie będzie działać, bo to jest adnotacja, ale nie jest to komentarz

Odpowiedz

10

Znam kilka rozwiązań, ale wszystkie z nich wymagają dodatkowej pracy do zrobienia.

  1. Wdrażanie własnego JavadocVariableCheck z możliwością pominięcia sprawdzenia w przypadku dodania adnotacji.
  2. Implementacja filtru Checkstyle (jak SuppressWarningsHolder + SuppressWarningsFilter ale ze wsparciem adnotacji)
  3. lub zaimplementować prosty filtr, który skanuje @FindBy i ignoruje dwie linie po niej.

Moje rozwiązanie (najprostsza):

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); 
    } 
} 

dodawania otrzymaną klasa w ścieżce klasy zadania Checkstyle następnie w checkstyle.xml określić filtr:

<?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> 
Powiązane problemy