Làm cách nào để vô hiệu hóa quy tắc kiểu kiểm tra cụ thể cho một dòng mã cụ thể?


183

Tôi có một checkstyle quy tắc xác nhận cấu hình trong dự án của tôi, rằng cấm để xác định phương pháp lớp học với hơn 3 thông số đầu vào. Quy tắc hoạt động tốt cho các lớp của tôi , nhưng đôi khi tôi phải mở rộng các lớp của bên thứ ba, không tuân theo quy tắc cụ thể này.

Có khả năng hướng dẫn "checkstyle" rằng một phương thức nhất định nên âm thầm bỏ qua không?

BTW, tôi đã kết thúc với trình bao bọc của kiểu kiểm tra của riêng mình: qulice.com (xem Kiểm soát nghiêm ngặt về chất lượng mã Java )

Câu trả lời:


290

Kiểm tra việc sử dụng supressionVerFilter tại http://checkstyle.sourceforge.net/config_filters.html#SuppressionVerFilter . Bạn sẽ cần thêm mô-đun vào tệp checkstyle.xml của bạn

<module name="SuppressionCommentFilter"/>

và nó có thể cấu hình. Do đó, bạn có thể thêm nhận xét vào mã của mình để tắt kiểu kiểm tra (ở nhiều cấp độ khác nhau) và sau đó bật lại thông qua việc sử dụng nhận xét trong mã của bạn. Ví dụ

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

Hoặc thậm chí tốt hơn, sử dụng phiên bản tinh chỉnh hơn này:

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

cho phép bạn tắt kiểm tra cụ thể cho các dòng mã cụ thể:

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

* Lưu ý: bạn cũng sẽ phải thêm FileContentsHolder:

<module name="FileContentsHolder"/>

Xem thêm

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

phía dưới cái SuppressionFilter phần trên cùng trang đó, cho phép bạn tắt các kiểm tra riêng lẻ cho các tài nguyên phù hợp với mẫu.

Vì vậy, nếu bạn có trong checkstyle.xml của mình:

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

Bạn có thể tắt nó trong tệp xml đàn áp của mình bằng:

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

Một phương pháp khác, hiện có sẵn trong Checkstyle 5.7 là ngăn chặn các vi phạm thông qua @SuppressWarningschú thích java. Để làm điều này, bạn sẽ cần thêm hai mô-đun mới ( SuppressWarningsFilterSuppressWarningsHolder) trong tệp cấu hình của mình:

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

Sau đó, trong mã của bạn, bạn có thể làm như sau:

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

hoặc, cho nhiều lần đàn áp:

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

NB: Các " checkstyle:" là tùy chọn (nhưng khuyến khích). Theo các tài liệu, tên tham số phải ở dạng chữ thường, nhưng thực tế chỉ ra bất kỳ trường hợp nào hoạt động.


7
Hãy nhớ thêm FileContentsHolder trên TreeWalter. Xem stackoverflow.com/a/5764666/480483
djjeck

2
nếu bạn sử dụng //CHECKSTYLE.OFF: và sau đó quên bật lại, nó sẽ chỉ được kiểm tra trong tệp có chứa //CHECKSTYLE.OFF: hoặc tất cả các tệp được xử lý sau đó chứ?
Roland

1
@Roland, nó vẫn duy trì trong suốt thời gian của lớp kiểm tra đó.
Chris Knight

1
"tên tham số phải có trong tất cả chữ thường." @SuppressWarnings("checkstyle:VariableDeclarationUsageDistance")làm việc tốt cho tôi như là trường hợp tương đương.
Anders Rabo Thorbeck

2
Vì kiểu kiểm tra 8.1 , SuppressionVerFilter sẽ nằm dưới TreeWalkerFileContentHolderkhông cần thiết (có sẵn) nữa.
avandeursen

69

Nếu bạn thích sử dụng các chú thích để chọn lọc các quy tắc im lặng, giờ đây có thể sử dụng @SuppressWarningschú thích, bắt đầu với Checkstyle 5.7 (và được hỗ trợ bởi Plugin Checkaven Maven 2.12+).

Đầu tiên, trong của bạn checkstyle.xml, thêm SuppressWarningsHoldermô-đun vào TreeWalker:

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

Tiếp theo, kích hoạt tính năng SuppressWarningsFilterđó (như anh chị em với TreeWalker):

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

<module name="TreeWalker">
...

Bây giờ bạn có thể chú thích, ví dụ phương thức bạn muốn loại trừ khỏi quy tắc Kiểm tra kiểu nhất định:

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

Các checkstyle:tiền tố trong đối số để @SuppressWarningslà tùy chọn, nhưng tôi thích nó như là một lời nhắc nhở nơi cảnh báo này đến từ đâu. Tên quy tắc phải là chữ thường.

Cuối cùng, nếu bạn đang sử dụng Eclipse, nó sẽ phàn nàn về đối số mà nó không biết:

@SuppressWarnings không được hỗ trợ ("checkstyle: methodlength")

Bạn có thể tắt cảnh báo Eclipse này trong các tùy chọn nếu bạn muốn:

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

2
Tôi chỉ định đây là câu trả lời được kiểm tra, vì tôi nghĩ đây là giải pháp nên hoạt động tốt nhất trong hầu hết các trường hợp.
avandeursen

33

Những gì cũng hoạt động tốt là SuppressWithNearbyVerFilter sử dụng các bình luận riêng lẻ để ngăn chặn các sự kiện kiểm toán.

Ví dụ

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

Để định cấu hình bộ lọc sao cho CHECKSTYLE IGNORE kiểm tra FOR NEXT var LINES tránh kích hoạt bất kỳ kiểm toán nào cho kiểm tra đã cho cho dòng hiện tại và các dòng var tiếp theo (cho tổng số var + 1 dòng):

<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


Tôi sẽ thay đổi biểu thức chính quy để CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES?làm cho lệnh bỏ qua dễ đọc hơn. .
Matt3o12

@ matt3o12 CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINEcũng hoạt động với tôi (nó phù hợp với cả hai linelines).
Slava Semushin

3

Mỗi câu trả lời đề cập đến SuppressWarningsFilter đều thiếu một chi tiết quan trọng. Bạn chỉ có thể sử dụng id chữ thường nếu nó được định nghĩa như vậy trong checkstyle-config.xml của bạn. Nếu không bạn phải sử dụng tên mô-đun ban đầu.

Chẳng hạn, nếu trong checkstyle-config.xml của tôi, tôi có:

<module name="NoWhitespaceBefore"/>

Tôi không thể sử dụng:

@SuppressWarnings({"nowhitespacebefore"})

Tôi phải, tuy nhiên, sử dụng:

@SuppressWarnings({"NoWhitespaceBefore"})

Để cú pháp đầu tiên hoạt động, checkstyle-config.xml nên có:

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

Đây là những gì làm việc cho tôi, ít nhất là trong phiên bản CheckStyle 6.17.


1

Tôi gặp khó khăn với các câu trả lời ở trên, có khả năng vì tôi đặt các cảnh báo checkStyle là lỗi. Những gì đã làm là SuppressionFilter: http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

Hạn chế của điều này là phạm vi dòng được lưu trữ trong một tệp đàn áp riêng biệt, do đó, một nhà phát triển xa lạ có thể không thực hiện ngay kết nối.


Cảm ơn bạn, đó là điều duy nhất làm việc cho tôi quá
jonathanrz

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

Để định cấu hình bộ lọc để chặn các sự kiện kiểm toán giữa một bình luận chứa dòng BEGIN GENERATED CODE và một bình luận chứa dòng END GENERATED CODE:

<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

Xem thêm


0

Bạn có thể thử https://checkstyle.sourceforge.io/config_filters.html#SuppressionXpathFilter

Tạo các triệt tiêu Xpath bằng CLI với tùy chọn -g. Sau đó, chọn phần tử triệt tiêu cụ thể cho dòng bạn muốn triệt tiêu. Lưu nó trong một tệp triệt tiêu và chỉ định đường dẫn tệp đó trong phần tử SuppressionXpathFilter ở trên.

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

Nếu bạn đang sử dụng ant, bạn có thể xem bài đăng này như một tác vụ ant sẽ được sử dụng để tạo tệp Xpath bị chặn.

https://github.com/checkstyle/checkstyle/issues/6934#issuecomment-522289083

Kiểm tra chủ đề này về cách sử dụng bộ lọc:

https://groups.google.com/forum/m/#!topic/checkstyle/F_f6R_Qk1EM

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.