C++ Refactoring Support für Eclipse-CDT
Aufgabenstellung
Eclipse ist eine professionelle Software-Entwicklungsumgebung. Die Programmiersprache Java wird von Eclipse standardmässig unterstützt, allerdings existiert mit dem CDT (C/C++ Development Tooling) auch eine Erweiterung für die Entwicklung mit den Programmiersprachen C und C++.
Während in den Eclipse Java Development Tools (JDT) verschiedene Refactorings angeboten werden, steht für CDT erst ein automatisiertes Refactoring zur Verfügung.
Unter Refactoring versteht man eine Vorgehensweise in der Softwareentwicklung bei der die Qualität von Quellcode gesteigert wird, ohne dabei dessen Funktionalität zu verändern. Refactoring reduziert mittelfristig den Aufwand für die Fehleranalyse und für funktionale Erweiterun-gen. Refactorings sind in klar definierte Schritte aufgeteilt. Wenn diese automatisch ausgeführt werden können, erleichtert dies die Arbeit der Entwickler und ist deshalb für Entwicklungs-umgebungen ein starker Wettbewerbsvorteil.
Ziel der Arbeit
Es sollen verschiedene Refactorings implementiert werden um den Entwicklern ihre Alltagsarbeit zu erleichtern. Die Refactorings sollen möglichst viele Eigenschaften von C++ unterstützen, Kommentare und Makros sollen bei den Codetransformationen behandelt werden und wieder richtig zurückgeschrieben werden. Die bestehende Infrastruktur von Eclipse im Allgemeinen und CDT im Speziellen soll verwendet werden und wo nötig erweitert werden.
Lösung
Der bestehende Code des CDT wurde so erweitert, dass die Refactorings „Replace Magic Number with Symbolic Constant“, „Move Field“, „Move Method“, „Extract Subclass“ und „Extract Method“ automatisiert möglich sind.
Durch das Erweitern des Parsers und des Abstract-Syntax-Tree war es uns möglich auch von Eclipse CDT nicht behandelte Codestellen zu parsen und korrekt zu erkennen. Durch diese Erweiterung der bestehenden Infrastruktur können nun auch Kommentare und Makros erkannt und während der Durchführung des Refactorings korrekt behandelt werden.
Damit der Code aus dem Abstract-Syntax-Tree wieder in Quellcode umgewandelt werden kann, wurde ein Codegenerator implementiert.
Um die Refactorings effizient zu testen, wurde das Testingframework JUnit so erweitert, dass die Testdefinitionen aus einer Datei gelesen werden können. Um die Testdefinitionen möglichst einfach zu bearbeiten, wurde ein kleiner Editor für Eclipse entwickelt. Mit CruiseControl wurde die von uns angepasste Version von Eclipse CDT bei jeder Änderung getestet und für sieben verschiedene Plattformen übersetzt.
comments
Vielen Dank Robin. Belohnungsbier gibts am 15ten!
Heiko: Es ist geplant das ganze in den offiziellen CDT-Code einfliessen zu lassen. Leider haben wir bis jetzt noch keinen Comiter für unsere Arbeit begeistern können (hatten aber natürlich auch noch nicht allzu viel Zeit um dafür zu werben). Entsprechend wird dieser Prozess vermutlich noch eine Weile dauern. Nach Projektschluss wird man aber ein angepasstes CDT-Plugin bei uns downloaden können.
Was ist denn nun daraus geworden?? Sehe davon in der CDT leider nichts...
Da sind wir noch dran. Auch im Europa-Release der Ende Juni kommen wird sind unsere Refactorings noch nicht drin. Die Prioritäten für diese Version lag beim neuen Projektmodel. Immerhin schafften es die wichitgsten Ergänzungen am cdt.core in offizelle CDT. Wir (http://ifs.hsr.ch) werden nach dem Europa-Release ein C++ Refactoring-Plugin veröffentlichen das mit dem original CDT funktioniert und unsere Arbeit enthält. Für Ganymede hoffe ich, dass wird die Refactorings dann auch im CDT drin haben.
Vielen Dank Herr Graf! Hätte ich nicht besser erklähren können ;-) Auch die Open-Source-Projekte mahlen bisweilen langsam.
add a comment
The Trackback URL to this comment is:
http://leo.freeflux.net/blog/plugin=trackback(1781).xml
This blog is gravatar enabled.
Your email adress will never be published.
Comment spam will be deleted!






Liest sich meiner Meinung nach recht gut :). Hab nur drei Verbesserungsvorschläge:
- reduziert mittelfristig der Aufwand -> den Aufwand
- Schritte aufgeteilt, wenn -> aufgeteilt. Wenn
- aus einem File -> aus einer Datei