Clang Tool: переписать ObjCMessageExpr
Я хочу переписать все сообщения в моем коде, мне нужно заменить только селекторы, но мне нужно иметь возможность заменить вложенные выражения f. е. :
[super foo:[someInstance someMessage:@""] foo2:[someInstance someMessage2]];
Я пытался сделать это сclang::Rewriter replaceText
и просто генерировать новую строку, но есть проблема: не будет работать, если я изменю длину селекторов, потому что я заменяю вложенные сообщения этими старыми позициями
Итак, я предположил, что мне нужно использоватьclang::Rewriter ReplaceStmt(originalStatement, newStatement);
я используюRecursiveASTVisitor
чтобы посетить все сообщения, и я хочу скопировать объекты этих сообщений и заменить селекторы:
Как я могу это сделать?
Я пытался использоватьObjCMessageExpr::Create
но там так много аргументовне знаю, как получитьASTContext &Context
and ArrayRef SeLocs
а такжеExpr *Receiver
параметры из исходного сообщения.
Как правильно заменить селекторы во вложенных сообщениях, используя инструмент clang (интерфейс инструмента clang)?
Обновить:
Должен ли я использоватьReplaceStmtWithStmt
обратный звонок и?ASTMatchFinder
Обновить:
Я использую следующую функцию для перезаписи текста в файле:
void ReplaceText(SourceLocation start, unsigned originalLength, StringRef string) {
m_rewriter.ReplaceText(start, originalLength, string);
m_rewriter.overwriteChangedFiles();
}
И я хочу заменить все messageExpr в коде новым селектором f.e: как это было:
[object someMessage:[object2 someMessage:obj3 calculate:obj4]];
как это должно быть:
[object newSelector:[object2 newSelector:obj3 newSelector:obj4]];
Я использую ReqoursiveASTVisitor:
bool VisitStmt(Stmt *statement) {
if (ObjCMessageExpr *messageExpr = dyn_cast(statement)) {
ReplaceMessage(*messageExpr)
}
return true;
}
Я создал метод для генерации новой строки expr сообщения:
string StringFromObjCMessageExpr(ObjCMessageExpr& messageExpression) {
std::ostringstream stringStream;
const string selectorString = messageExpression.getSelector().getAsString();
cout < selectorString < endl;
vector