Belirli bir kod satırı için belirli bir kontrol stili kuralı nasıl devre dışı bırakılır?


185

3'ten fazla giriş parametreleri ile sınıf yöntemleri tanımlamayı yasaklayan benim projede yapılandırılmış bir onay stili doğrulama kuralı var . Kural cezasını çalışır benim sınıfları, ama bazen bu özel kural uymayan üçüncü taraf sınıfları, uzatmak zorundayız.

Belirli bir yöntemin sessizce göz ardı edilmesi gerektiğini "kontrol etme" talimatı verme olasılığı var mı?

BTW, kendi checkstyle paketleyicimle sonuçlandım: qulice.com (bkz . Java Kod Kalitesinin Katı Kontrolü )

Yanıtlar:


292

Http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter adresindeki supressionCommentFilter kullanımını kontrol edin . Modülü checkstyle.xml dosyasına eklemeniz gerekecek

<module name="SuppressionCommentFilter"/>

ve yapılandırılabilir. Böylece, kontrol stilini kapatmak için (çeşitli düzeylerde) kodunuza yorum ekleyebilir ve daha sonra kodunuzdaki yorumları kullanarak tekrar açabilirsiniz. Örneğin

//CHECKSTYLE:OFF
public void someMethod(String arg1, String arg2, String arg3, String arg4) {
//CHECKSTYLE:ON

Ya da daha iyisi, bu daha ince sürümü kullanın:

<module name="SuppressionCommentFilter">
    <property name="offCommentFormat" value="CHECKSTYLE.OFF\: ([\w\|]+)"/>
    <property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/>
    <property name="checkFormat" value="$1"/>
</module>

belirli kod satırları için belirli kontrolleri kapatmanıza olanak tanır:

//CHECKSTYLE.OFF: IllegalCatch - Much more readable than catching 7 exceptions
catch (Exception e)
//CHECKSTYLE.ON: IllegalCatch

* Not: Ayrıca şunları eklemeniz gerekir FileContentsHolder:

<module name="FileContentsHolder"/>

Ayrıca bakınız

<module name="SuppressionFilter">
    <property name="file" value="docs/suppressions.xml"/>
</module>

SuppressionFilterkalıpla eşleşen kaynaklar için ayrı ayrı kontrolleri kapatmanıza olanak tanıyan aynı sayfadaki bölümün altında .

Yani, checkstyle.xml dosyanızda varsa:

<module name="ParameterNumber">
   <property name="id" value="maxParameterNumber"/>
   <property name="max" value="3"/>
   <property name="tokens" value="METHOD_DEF"/>
</module>

Bastırma xml dosyanızda aşağıdakilerle kapatabilirsiniz:

<suppress id="maxParameterNumber" files="YourCode.java"/>

Şimdi Checkstyle 5.7'de bulunan başka bir yöntem, @SuppressWarningsjava açıklaması yoluyla ihlalleri bastırmaktır . Bunu yapmak için yapılandırma dosyanıza iki yeni modül ( SuppressWarningsFilterve SuppressWarningsHolder) eklemeniz gerekir :

<module name="Checker">
   ...
   <module name="SuppressWarningsFilter" />
   <module name="TreeWalker">
       ...
       <module name="SuppressWarningsHolder" />
   </module>
</module> 

Ardından, kodunuz dahilinde aşağıdakileri yapabilirsiniz:

@SuppressWarnings("checkstyle:methodlength")
public void someLongMethod() throws Exception {

veya birden fazla baskı için:

@SuppressWarnings({"checkstyle:executablestatementcount", "checkstyle:methodlength"})
public void someLongMethod() throws Exception {

Not: " checkstyle:" öneki isteğe bağlıdır (ancak önerilir). Dokümanlara göre parametre adının tümüyle küçük harfle yazılması gerekir, ancak uygulama her durumda çalışır.


7
TreeWalter'a FileContentsHolder eklemeyi unutmayın. Bkz. Stackoverflow.com/a/5764666/480483
djjeck

2
kullanır //CHECKSTYLE.OFF: ve sonra tekrar açmayı unutursanız, yalnızca dosyada //CHECKSTYLE.OFF: veya daha sonra işlenen tüm dosyalarda da kapalı kalır mı?
Roland

1
@Roland, sadece bu test sınıfı süresince kapalı kalır.
Chris Knight

1
"parametre adı küçük harfle yazılmalıdır." @SuppressWarnings("checkstyle:VariableDeclarationUsageDistance")benim için küçük harf eşdeğeri kadar iyi çalıştı.
Anders Rabo Thorbeck

2
Yana checkstyle 8.1 SuppressionCommentFilter altında olmalıdır TreeWalkerve FileContentHolderartık gerekli (mevcut) değildir.
avandeursen

71

Kuralları seçmeli olarak susturmak için ek açıklamaları kullanmayı tercih ederseniz, bu @SuppressWarningsek açıklama artık Checkstyle 5.7 ile başlayarak (ve Checkstyle Maven Plugin 2.12+ tarafından desteklenmektedir) kullanılabilir.

İlk olarak, modülünüze aşağıdakileri checkstyle.xmlekleyin :SuppressWarningsHolderTreeWalker

<module name="TreeWalker">
    <!-- Make the @SuppressWarnings annotations available to Checkstyle -->
    <module name="SuppressWarningsHolder" />
</module>

Ardından, SuppressWarningsFilterorada etkinleştirin (bir kardeş olarak TreeWalker):

<!-- Filter out Checkstyle warnings that have been suppressed with the @SuppressWarnings annotation -->
<module name="SuppressWarningsFilter" />

<module name="TreeWalker">
...

Şimdi örneğin belirli bir Checkstyle kuralından hariç tutmak istediğiniz yönteme açıklama ekleyebilirsiniz:

@SuppressWarnings("checkstyle:methodlength")
@Override
public boolean equals(Object obj) {
    // very long auto-generated equals() method
}

checkstyle:İçin argüman önek @SuppressWarningsbu uyarı geldi bir hatırlatma olarak böyle ben isteğe bağlıdır, ancak. Kural adı küçük harf olmalıdır.

Son olarak, Eclipse kullanıyorsanız, argümanın bilinmediğinden şikayet edecektir:

Desteklenmeyen @SuppressWarnings ("checkstyle: methodlength")

İsterseniz bu Eclipse uyarısını tercihlerde devre dışı bırakabilirsiniz:

Preferences:
  Java
  --> Compiler
  --> Errors/Warnings
  --> Annotations
  --> Unhandled token in '@SuppressWarnings': set to 'Ignore'

2
Bunu çoğu durumda en iyi sonucu vermesi gereken bir çözüm olduğunu düşündüğüm için bu konuyu işaretli cevap olarak belirledim.
avandeursen

34

Ayrıca iyi çalışan, denetim olaylarını bastırmak için bireysel yorumları kullanan SuppressWithNearbyCommentFilter .

Örneğin

// CHECKSTYLE IGNORE check FOR NEXT 1 LINES
public void onClick(View view) { ... }

Bir filtreyi CHECKSTYLE IGNORE KONTROL EDİN SONRAKİ LİNLER İÇİN KONTROL EDİN, geçerli hat ve sonraki var hatlar (toplam var + 1 hatlar için) için verilen kontrolün tetiklenmesini önler:

<module name="SuppressWithNearbyCommentFilter">
    <property name="commentFormat" value="CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES"/>
    <property name="checkFormat" value="$1"/>
    <property name="influenceFormat" value="$2"/>
</module>

http://checkstyle.sourceforge.net/config.html


CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES?Yoksay komutunu daha okunabilir kılacak normal ifadeyi değiştirirdim . ("SONRAKİ 1 HATTI İÇİN CHECKSTYLE IGNORE kontrolü" ve "SONRAKİ 3 HAT İÇİN CHECKSTYLE IGNORE kontrolü" kullanabilirsiniz).
Matt3o12

@ matt3o12 CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINEda (hem maçları benim için çalışıyor lineve lines).
Slava Semushin

4

SuppressWarningsFilter ile ilgili her cevapta önemli bir ayrıntı eksik. Tüm küçük harf kimliğini yalnızca checkstyle-config.xml dosyasında olduğu gibi tanımlanmışsa kullanabilirsiniz. Değilse orijinal modül adını kullanmalısınız.

Örneğin, benim checkstyle-config.xml içinde varsa:

<module name="NoWhitespaceBefore"/>

Kullanamam:

@SuppressWarnings({"nowhitespacebefore"})

Ancak şunu kullanmalıyım:

@SuppressWarnings({"NoWhitespaceBefore"})

İlk sözdiziminin çalışması için checkstyle-config.xml dosyasında şunlar olmalıdır:

<module name="NoWhitespaceBefore">
  <property name="id" value="nowhitespacebefore"/>
</module>

En azından CheckStyle 6.17 sürümünde bu benim için işe yaradı.



1
<module name="Checker">
    <module name="SuppressionCommentFilter"/>
    <module name="TreeWalker">
        <module name="FileContentsHolder"/>
    </module>
</module>

BEGIN OLUŞTURULAN KOD içeren bir yorum ile END OLUŞTURULAN KOD içeren bir yorum arasındaki denetim olaylarını bastırmak üzere bir filtre yapılandırmak için:

<module name="SuppressionCommentFilter">
  <property name="offCommentFormat" value="BEGIN GENERATED CODE"/>
  <property name="onCommentFormat" value="END GENERATED CODE"/>
</module>

//BEGIN GENERATED CODE
@Override
public boolean equals(Object obj) { ... } // No violation events will be reported

@Override
public int hashCode() { ... } // No violation events will be reported
//END GENERATED CODE

Daha fazla gör


0

Deneyebilirsin Https://checkstyle.sourceforge.io/config_filters.html#SuppressionXpathFilter'i

Bunu şu şekilde yapılandırabilirsiniz:


<module name="SuppressionXpathFilter">
  <property name="file" value="suppressions-xpath.xml"/>
  <property name="optional" value="false"/>
</module>
        

-G seçeneğiyle CLI kullanarak Xpath baskılamaları oluşturun ve -o anahtarını kullanarak çıktıyı belirtin.

https://checkstyle.sourceforge.io/cmdline.html#Command_line_usage

İşte Checkstyle bastırmaları otomatik oluşturmanızı ayarlamanıza yardımcı olacak bir karınca snippet'i; Antrun eklentisini kullanarak Maven'e entegre edebilirsiniz .


<target name="checkstyleg">
    <move file="suppressions-xpath.xml"
      tofile="suppressions-xpath.xml.bak"
      preservelastmodified="true"
      force="true"
      failonerror="false"
      verbose="true"/>
    <fileset dir="${basedir}"
                    id="javasrcs">
    <include name="**/*.java" />
    </fileset>
    <pathconvert property="sources"
                            refid="javasrcs"
                            pathsep=" " />
    <loadfile property="cs.cp"
                        srcFile="../${cs.classpath.file}" />
    <java classname="${cs.main.class}"
                logError="true">
    <arg line="-c ../${cs.config} -p ${cs.properties} -o ${ant.project.name}-xpath.xml -g ${sources}" />
    <classpath>
        <pathelement path="${cs.cp}" />
        <pathelement path="${java.class.path}" />
    </classpath>
</java>
<condition property="file.is.empty" else="false">
     <length file="${ant.project.name}-xpath.xml" when="equal" length="0" />
   </condition>
   <if>
     <equals arg1="${file.is.empty}" arg2="false"/>
     <then>
     <move file="${ant.project.name}-xpath.xml"
      tofile="suppressions-xpath.xml"
      preservelastmodified="true"
      force="true"
      failonerror="true"
  verbose="true"/>
   </then>
</if>
    </target>

Suppressions-xpath.xml, Checkstyle kuralları yapılandırmasında Xpath supressions kaynağı olarak belirtilir. Yukarıdaki snippet'te, bir cs.cp dosyasından Checkstyle sınıfyolunu bir özelliğe yüklüyorum. Sınıf yolunu doğrudan belirtmeyi seçebilirsiniz.

Ya da Maven ( veya Ant ) içindeki mükemmel olanı kullanarak aynı şeyi yapabilirsiniz:


import java.nio.file.Files
import java.nio.file.StandardCopyOption  
import java.nio.file.Paths

def backupSuppressions() {
  def supprFileName = 
      project.properties["checkstyle.suppressionsFile"]
  def suppr = Paths.get(supprFileName)
  def target = null
  if (Files.exists(suppr)) {
    def supprBak = Paths.get(supprFileName + ".bak")
    target = Files.move(suppr, supprBak,
        StandardCopyOption.REPLACE_EXISTING)
    println "Backed up " + supprFileName
  }
  return target
}

def renameSuppressions() {
  def supprFileName = 
      project.properties["checkstyle.suppressionsFile"]
  def suppr = Paths.get(project.name + "-xpath.xml")
  def target = null
  if (Files.exists(suppr)) {
    def supprNew = Paths.get(supprFileName)
    target = Files.move(suppr, supprNew)
    println "Renamed " + suppr + " to " + supprFileName
  }
  return target
}

def getClassPath(classLoader, sb) {
  classLoader.getURLs().each {url->
     sb.append("${url.getFile().toString()}:")
  }
  if (classLoader.parent) {
     getClassPath(classLoader.parent, sb)
  }
  return sb.toString()
}

backupSuppressions()

def cp = getClassPath(this.class.classLoader, 
    new StringBuilder())
def csMainClass = 
      project.properties["cs.main.class"]
def csRules = 
      project.properties["checkstyle.rules"]
def csProps = 
      project.properties["checkstyle.properties"]

String[] args = ["java", "-cp", cp,
    csMainClass,
    "-c", csRules,
"-p", csProps,
"-o", project.name + "-xpath.xml",
"-g", "src"]

ProcessBuilder pb = new ProcessBuilder(args)
pb = pb.inheritIO()
Process proc = pb.start()
proc.waitFor()

renameSuppressions()

Xpath baskılamalarını kullanmanın tek dezavantajı - desteklemediği kontrollerin yanında --- aşağıdaki gibi bir kodunuz varsa:

package cstests;

public interface TestMagicNumber {
  static byte[] getAsciiRotator() {
    byte[] rotation = new byte[95 * 2];
    for (byte i = ' '; i <= '~'; i++) {
      rotation[i - ' '] = i;
      rotation[i + 95 - ' '] = i;
    }
    return rotation;
  }
}

Bu durumda üretilen Xpath bastırma Checkstyle tarafından yutulmaz ve denetleyici oluşturulan bastırmada bir istisna dışında başarısız olur:

<suppress-xpath
       files="TestMagicNumber.java"
       checks="MagicNumberCheck"
       query="/INTERFACE_DEF[./IDENT[@text='TestMagicNumber']]/OBJBLOCK/METHOD_DEF[./IDENT[@text='getAsciiRotator']]/SLIST/LITERAL_FOR/SLIST/EXPR/ASSIGN[./IDENT[@text='i']]/INDEX_OP[./IDENT[@text='rotation']]/EXPR/MINUS[./CHAR_LITERAL[@text='' '']]/PLUS[./IDENT[@text='i']]/NUM_INT[@text='95']"/>

Diğer tüm ihlalleri giderdiğinizde ve gerisini bastırmak istediğinizde Xpath bastırması oluşturmanız önerilir. Gizlemek için koddaki belirli örnekleri seçmenize izin vermez. Ancak, bunu yapmak için oluşturulan dosyadan baskıları seçebilir ve seçebilirsiniz.

SuppressionXpathSingleFilter, belirli bir kuralı, dosyayı veya hata mesajını tanımlamak ve bastırmak için daha uygundur. Her birini id özelliğine göre tanımlayan birden çok filtre yapılandırabilirsiniz.

https://checkstyle.sourceforge.io/config_filters.html#SuppressionXpathSingleFilter

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.