2016-07-14 26 views
0

EDITED:Gibt es trotzdem eine Funktion zum Umschalten der Funktionen mit Hilfe von ladtooling?

Ich und mein Kollege sind sehr neu zu Clang und Llvm.

Ich habe drei Funktionen ..

function 1{} 
function 2{} 
function 3{} 

Gibt es trotzdem, um die Funktionen zu

function 3{} 
function 2{} 
function 1{} 

mit Klirren libtooling/rewriter zu tauschen und in der Funktion aus dem Funktionsnamen und auch die Parameter drucken ?

+0

Möchten Sie ihre Standorte im Quellcode tauschen? Ich glaube, da clang Ihnen nur die Möglichkeit gibt, eine Übersetzungseinheit (Funktion) gleichzeitig zu betrachten, wird es schwer sein, dies zu tun. –

+0

Sie möchten die Reihenfolge der Funktion * Deklarationen * tauschen? [gerade bestätigt]. Wenn Sie das nur einmal machen wollen, warum bearbeiten Sie nicht einfach die Datei? Oder ist da etwas Größeres dahinter? –

+0

@iraBaxter apprainent, wir machen und ausführbare Datei, wo wir diese ausführbare Datei ausführen und dann eine Datei mit C++ - Quellcode erzeugen, wird es uns dann mit Ergebnissen produzieren, wo die Funktionen Standorte wechseln (durcheinander). Also ich denke, durch die Bearbeitung der Datei ist nicht der Weg, es zu tun. – HiWorld

Antwort

0

Sie können den AST zuerst mit einem ASTConsumer analysieren. Sie erhalten jeweils den AST einer Funktion, den Sie eventuell global speichern möchten, und Sie können sie dann der REWRITTER-API des Clangs hinzufügen und den Puffer schließlich in eine Datei zurückspeichern.

This ist ein Beispiel für die Bearbeitung einiger AST-Knoten und das Zurückschreiben in Datei. In Ihrem Fall werden Sie die ASTs nicht bearbeiten, sondern nur die Puffer-Push-Aufrufe neu anordnen, um die Funktionen neu anzuordnen. In VisitFunctionDecl:

bool VisitFunctionDecl(FunctionDecl *f) { 
    // Only function definitions (with bodies), not declarations. 
    if (f->hasBody()) { 
     //store in a global array/vector 
    } 

    return true; 
} 

Im Haupt nach ParseAST und bevor die Datei zu schreiben, müssen Sie ein rearrangeFunctionDecls tun.

+0

ist rearrangleFunctionDecls ein clang Methoden/Funktionen? – HiWorld

+0

Nein, es wird eine benutzerdefinierte Funktion sein. Was ich meinte war, dass du die Funktion Decls bereits irgendwo gespeichert hast. Jetzt können Sie sie neu anordnen (wie wenn es ein Vektor wäre, die Elemente zufällig neu anordnen) und dann den Puffer schreiben. –

+0

Mein Kollege kann jetzt ** NUR ** den Methodennamen tauschen. Wie erhält man stattdessen den gesamten Funktionskörper und nicht nur den Funktionsnamen? – HiWorld