我需要将其他变量声明替换为其他声明。
例如
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是什么意思以及如何与它进行交互?