clang中的SourceLocation无效以及如何与它进行交互?

时间:2012-07-30 08:58:49

标签: c++ clang abstract-syntax-tree

我需要将其他变量声明替换为其他声明。

例如

int a = 5; 

成为

T<int> a = 5;

更通用

X a = _const; 

成为

T<X> a = _const; 

我试图在clang中实现一个ASTVisitor后代:

bool VisitVarDecl(Decl *f) {
    if (VarDecl* VD = dyn_cast_or_null<VarDecl>(f)){
    Expr* init = VD->getInit();

    SourceRange definition = VD->getDefinition()->getSourceRange();
    FullSourceLoc exprLoc = ctx.getFullLoc(init->getLocStart());
    FullSourceLoc vLoc = ctx.getFullLoc(VD->getLocStart());
    ...

我想以下一种方式替换变量的定义:

TheRewriter.ReplaceText(VD->getLocStart(), exprLoc.getSpellingColumnNumber()-vLoc.getSpellingColumnNumber(), someSting);

但是任何调用exprLoc.getSpellingColumnNumber()都会导致分段错误。例如,我只是尝试打印exprLoc.getSpellingColumnNumber():

llvm::outs()<< "init start at " 
    <<exprLoc.getSpellingColumnNumber(&isValid)
    <<" is "<<(isValid?"valid ":"invalid ")
    <<", decl start at "
    <<vLoc.getSpellingColumnNumber()
    <<".\n";

输出是 init从9开始无效,decl从1开始。 &LT; ...&GT; 分段错误

“无效”SourceLocation是什么意思以及如何与它进行交互?

0 个答案:

没有答案