Как я могу сравнить два исходных местоположения в Clang?

Похоже, это скорее проблема C++, чем проблема Clang...

Я должен использовать C++, чтобы написать правило OCLint (статический анализатор кода).

Я хочу сравнить два объекта из библиотеки Clang, которые имеют тип "SourceLocation".

Этот тип предоставляет информацию о местоположении (в основном, строки и столбца) объекта (оператор, объявление и т. Д.) В коде.

В основном, я хотел бы знать, начинается ли утверждение A и заканчивается ли оно до или после утверждения B.

В псевдокоде это означает, что я хотел бы получить логическое значение из:

(stmt_A-> getLocBegin () 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 ответ

Решение

Вот заключительный код, который показывает, как использовать SourceManager в библиотеке Clang и как сравнить два 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);
Другие вопросы по тегам