cuốn sách gpt4 ai đã làm

c++ - OCLint quy tắc ASTMatcher. Trận đấu NS_ENUM

In lại Tác giả: Hồ Xil Thời gian cập nhật: 2023-11-01 16:23:58 28 4
mua khóa gpt4 Nike

Tôi đang cố gắng tạo một trận đấu enum typedeftypedef NS_ENUM Đã khai báo các quy tắc OCLint nhưng có rất ít tác dụng. Tôi có tệp Objective-C (TestClass.m) chứa khai báo liệt kê sau:

typedef NS_ENUM(NSInteger, TestEnum) {
TestEnumNone,
TestEnumSome,
TestEnumTất cả
};

typedef enum {
giá trị kiểm tra khác = 0,
giá trị thử nghiệm khác1,
giá trị thử nghiệm khác2
} OtherTestEnum;

Sử dụng lệnh này để kết xuất AST:

clang -Xclang -ast-dump -fsyntax-only Class/TestClass.m -- grep Enum

mang lại cho tôi đầu ra này có chứa cái này:

|-TypedefDecl 0x7f9d3accd630  col:28 TestEnum 'enum TestEnum':'enum TestEnum'
|-EnumDecl 0x7f9d3accd6a8 trước 0x7f9d3accd530 dòng:67:28 TestEnum 'NSInteger':'long '
|-EnumConstantDecl 0x7f9d3accd738 col:5 TestEnumNone 'NSInteger':'long'
|-EnumConstantDecl 0x7f9d3accd788 col:5 TestEnumSome 'NSInteger':'long'
| `-EnumConstantDecl 0x7f9d3accd7d8 col:5 TestEnumAll 'NSInteger':'long'
|-EnumDecl 0x7f9d3accd828 line:73:9
|-EnumConstantDecl 0x7f9d3accd900 col:5 othertestvalue 'int'
|-EnumConstantDecl 0x7f9d3accd950 col:5 othertestvalue1 'int'
| `-EnumConstantDecl 0x7f9d3accd9a0 col:5 othertestvalue2 'int'
|-TypedefDecl 0x7f9d3accda40 col:3 OtherTestEnum 'enum OtherTestEnum':'OtherTestEnum'

Tôi có một ASTMatcherRule (ObjCNsEnumRule) mà tôi đang cố gắng khớp enum typedef cũng như typedef NS_ENUM Đây là mã của nó:

#include "oclint/AbstractASTMatcherRule.h"
#include "oclint/RuleSet.h"

using namespace std;
sử dụng tiếng vang không gian tên;
sử dụng không gian tên clang::ast_matchers;
sử dụng không gian tên oclint;

lớp ObjCNsEnumRuleRule : public Tóm tắtASTMatcherRule
{
public:
tên chuỗi const ảo() ghi đè const
{
trả về "quy tắc enum obj c ns";
}

ưu tiên int ảo () ghi đè const
{
trở lại 3;
}

ghi đè cuộc gọi lại void ảo(const MatchFinder::MatchResult &result)
{
const EnumDecl *enumDecl = result.Nodes.getNodeAs("enum");
nếu (enumDecl) {
addViolation(enumDecl, this, "Đã tìm thấy enum");
}
}

ghi đè khoảng trống ảo setUpMatcher()
{
addMatcher(enumDecl().bind("enum"));
}

};

quy tắc Bộ quy tắc tĩnh (ObjCNsEnumRuleRule mới());

Tuy nhiên, khi tôi chạy quy tắc này, tôi chỉ nhận được enum typedef Đầu ra được khai báo.

Các lớp/TestClass.m:73:9: obj c ns quy tắc enum P3 Đã tìm thấy enum

Tôi đang làm gì sai ở đây? Cả hai bảng liệt kê đều xuất hiện trong kết xuất AST nhưng chỉ có một kết quả trùng khớp trong quy tắc OCLint.

biên tập

Tôi nghĩ điều này có thể liên quan đến việc hiển thị được xác định trong một tệp nguồn khác NS_ENUM của EnumDecl Kết xuất AST có liên quan đến nó (có thể là do macro NS_ENUM), vì tôi có thể khớp với typedef nhưng không khớp với enumdecl.

câu trả lời hay nhất

Có vẻ như không có cách nào để làm điều này trong oclint vào lúc này. Macro không được tiếp xúc với ASTKhách truy cập hoặc ASTMacher Quy tắc cho quy tắc oclint. Nhìn ở đây:https://github.com/oclint/oclint/issues/148

Tôi đã kết thúc việc thực hiện điều này một cách đơn giản Mã NguồnĐọcRule,如下所示:

#include "oclint/AbstractSourceCodeReaderRule.h"
#include "oclint/RuleSet.h"
#include
#include
#include

using namespace std;
sử dụng không gian tên oclint;

lớp TypedefEnumStatementRule : public Tóm tắtSourceCodeReaderRule
{
public:
tên chuỗi const ảo() ghi đè const {
trả về "câu lệnh enum typedef";
}

ưu tiên int ảo () ghi đè const {
return 1;
}

virtual void eachLine(int lineNumber, string line) ghi đè {
biểu thức chính quy rgx("typedef\\senum");
trận đấu;
if (regex_search(line, rgx,regex_constants::match_continuous)) {
string description = "Không nên khai báo Enum bằng 'typedef enum', thay vào đó hãy sử dụng 'typedef NS_ENUM'";
addViolation(lineNumber, 1, lineNumber, 1, this, description);
}
}
};

quy tắc Bộ quy tắc tĩnh (TypedefEnumStatementRule mới());

Giới thiệu về c++ - OCLint ASTMatcher quy tắc. Phù hợp với NS_ENUM, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/29754500/

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress