1

I am writing a module of clang-tidy, which finds declarations of variables with the necessary condition and perform FixItHint:CreateReplacement() for them.

I found VarDecl, which defined via a strange function macro that ignores its arguments. Need to delete the entire macro text to perform the substitution of new text. The problem is that I can not get the source location, which would point outside the parentheses of this macro. Example is below.

#define VAR_DECL(type, name) float other_name;

    VAR_DECL(int, test)
//  |      |           \__ How can i get this SourceLocation?
//  |      \__ VarDecl->getEndLoc()
//  \__ VarDecl->getBeginLoc()

int main(void) { return 0; }

The output of clang-query looks like:

Match #1:

Binding for "root":
VarDecl 0x59d487e8f330 <stck.c:1:30, col:36> col:36 other_name 'float'

1 match.

I tried to find the necessary functions in SourceManager, Lexer and Preprocessor classes but couldn't find anything suitable.

1 Answer 1

1

The thing i was looking for is getExpansionRange(), whose description states: Given a SourceLocation object, return the range of tokens covered by the expansion in the ultimate file.

My resulting code looks like:

begin_loc = var_decl->getBeginLoc().isMacroID() ?
    sm.getExpansionRange(var_decl->getBeginLoc()).getBegin() :
    sm.getExpansionLoc(var_decl->getBeginLoc());

end_loc = var_decl->getEndLoc().isMacroID() ?
    sm.getExpansionRange(var_decl->getEndLoc()).getEnd() :
    sm.getExpansionLoc(var_decl->getEndLoc());
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.