我需要用其他变量声明替换一些变量声明。
例如
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 是什么意思以及如何与之交互?