Tôi đang cố gắng tạo một trận đấu enum typedef
Và typedef 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ó 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());
Tôi là một lập trình viên xuất sắc, rất giỏi!