在clang中确定VarDecl的宏展开 我是C++初学者,试图用CLAN把Objul-C代码擦掉。我知道宏是在AST访问节点和属性之前首先展开的
我有一个名为在clang中确定VarDecl的宏展开 我是C++初学者,试图用CLAN把Objul-C代码擦掉。我知道宏是在AST访问节点和属性之前首先展开的,c++,c,clang,oclint,C++,C,Clang,Oclint,我有一个名为NIL\u CHECK的宏,它在许多文件中使用。在执行lint时,我想跳过展开/使用该宏的行的变量声明 例如,本例中的第一行应该是lint,而第二行需要跳过,以便在进行宏扩展时不会抛出误报: // Must be checked NSDictionary *playerParams = @{ @"videoId" : videoId, @"playerVars" : playerVars }; // Must be skipped sinc
NIL\u CHECK
的宏,它在许多文件中使用。在执行lint时,我想跳过展开/使用该宏的行的变量声明
例如,本例中的第一行应该是lint,而第二行需要跳过,以便在进行宏扩展时不会抛出误报:
// Must be checked
NSDictionary *playerParams = @{ @"videoId" : videoId, @"playerVars" : playerVars };
// Must be skipped since there's a macro
PlayerProfile *const playerProfile = [[PlayerProfile alloc] initWithData:NIL_CHECK(playerParams)];
下面是VisitVarDecl
visitor方法,它遍历每个变量声明以执行适当的lint检查:
bool VisitVarDecl(VarDecl *node) {
if (isCollectionType(node -> getType()) && !hasTypeArguments(node -> getType())) {
addViolation(node, this, description(node -> getNameAsString()));
}
return true;
}
如何确定宏并跳过此类变量声明?Valeriy给出了一个很好的答案,我认为它涵盖了您想要实现的目标
总结如下:
您希望在VarDecl中找到字符串NIL\u CHECK
,该字符串在访问AST时已展开。源代码中的原始文本可以在Lexer
的帮助下获得。可以使用完整varDecl expr的位置,也可以仅使用包含宏的零件。然后可以从Lexer的getSourceText
返回的字符串中检测宏名。是Valeriy的一个很好的答案,我认为它涵盖了您想要实现的目标
总结如下:
您希望在VarDecl中找到字符串NIL\u CHECK
,该字符串在访问AST时已展开。源代码中的原始文本可以在Lexer
的帮助下获得。可以使用完整varDecl expr的位置,也可以仅使用包含宏的零件。然后,可以从Lexer的getSourceText
返回的字符串中检测宏名称