如何比较clang中的两个源位置?

时间:2014-07-11 06:26:32

标签: c++ c++11 clang oclint

这似乎更像是一个C ++问题,而不是一个Clang问题......

我必须使用C ++来编写OCLint(静态代码分析器)规则。

我希望比较Clang库中具有“SourceLocation”类型的两个对象。

此类型提供有关代码中对象(语句,声明等)的位置(基本上是行和列)的信息。

基本上,我想知道陈述A是否在陈述B之前或之后开始和结束。

在伪代码中,这意味着我想从:

获得一个布尔值 例如,

(stmt_A-> getLocBegin()< stmt_B-> getLocBegin())。当然,这不会编译,因为“<”在“SourceLocation”类型的两个对象之间未定义运算符。

我在Clang文档中找到了一个方法,但由于我不经常使用C ++,我找不到使用它的方法,这是这个方法:

http://clang.llvm.org/doxygen/classclang_1_1BeforeThanCompare_3_01SourceLocation_01_4.html

clang::BeforeThanCompare<SourceLocation>::BeforeThanCompare (SourceManager &SM)


bool clang::BeforeThanCompare< SourceLocation >::operator()(SourceLocation LHS, SourceLocation RHS)  const [inline]

我不知道如何使用SourceManager,或者只是如何在上面获得这个布尔值。

1 个答案:

答案 0 :(得分:2)

这是最终代码,展示了如何在Clang库中使用SourceManager,以及如何比较两个SourceLocation:

// Declaration of a SourceManager
SourceManager & loc_SM = _carrier->getSourceManager();

// Declaration of an object BeforeThanCompare<SourceLocation>
BeforeThanCompare<SourceLocation> isBefore(loc_SM); SourceLocation stmt_A, stmt_B;

// Get whether stmt_A is before or after Stmt_B 
bool A_before_B = isBefore(stmt_A,stmt_B);