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

Ответы на вопрос(1)

Ваш ответ на вопрос