3

我需要用其他变量声明替换一些变量声明。

例如

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 start at 9 is invalid , decl start at 1. <…> 分段错误

“无效”的 SourceLocation 是什么意思以及如何与之交互?

4

0 回答 0