PyDev Refactoring

Aus Eclipse
Wechseln zu: Navigation, Suche

Es ist möglich, eigene Refactoring-Tools zu entwickeln, die PyDev erweitern, siehe PyDev Refactoring Beispiel. Allerdings ist es oft schwierig, dazu auf Funktionalität von PyDev zurückzugreifen. Im Folgenden sind einige Anmerkungen zu dieser Problematik relativ ungeordnet aufgelistet.

PySelection

org.python.pydev.core.docutils.PySelection ist eine Klasse mit zahlreichen Hilfsfunktionen, beispielsweise zum berechnen des Offset von AST-Knoten im Editor. Der Offset in einem Editor gibt eine Zeichenposition an. Eine Umrechnungsfunktion ist hilfreich, da in den AST-Knoten nur die Zeilennummer und die Spaltennummer gespeichert werden, der Python-Editor jedoch an manchen Stellen (beispielsweise zum Setzen der Auswahlmarkierung) Offsets als Positionsangaben erwartet.

Bei Verwendung des Konstruktors PySelection(PyEdit) in einem Refactoring-Tool gibt es bei der Durchführung des Refactoring einen Internal Error, manchmal mit dem Hinweis dass etwas mit den Threads falsch ist. Bei Verwendung von PySelection.(IDocument, ITextSelection) scheint dieses Problem nicht aufzutreten. Mit

RefactoringInfo info; // irgendwo erzeugen
PySelection ps = new PySelection(info.getDocument(), info.getUserSelection());

lässt sich so bequem auf die Hilfsfunktionen in PySelection zugreifen.

AST Rewriter

In PyDev existiert eine Klasse org.python.pydev.refactoring.ast.visitors.rewriter.Rewriter, die aus einem (Teil-)AST Python-Quelltext erzeugen kann. Allerdings wird der Rewriter nicht exportiert und kann deshalb nicht zum Schreiben von Python-Code zu einem AST-Teilbaum verwendet werden.

org.python.pydev.refactoring.ast.adapters.AdapterPrefs wird ebenfalls nicht exportiert. Das verhindert, dass man einen IRefactoringRequest implementieren kann. Damit kann man auch keine Klassen von AbstractTextEdit ableiten und auf diesem Umweg auf den Rewriter zugreifen.

Es ist, da das Paket org.python.pydev.refactoring.coderefactoring.extractlocal.request nicht exportiert wird, auch nicht möglich, beispielsweise einen org.python.pydev.refactoring.coderefactoring.extractlocal.request.ExtractLocalRequest wiederzuverwenden.

Ebenso mangels Export ist die direkte Verwendung von org.python.pydev.refactoring.coderefactoring.extractlocal.edit.CreateLocalVariableEdit in PyDev_Refactoring_Beispiel nicht möglich.

AST-Zugriff

Es ist leider nicht möglich, den org.python.pydev.refactoring.ast.adapters.ModuleAdapter zu verwenden. Leider wird das Paket org.python.pydev.refactoring.ast.adapters nicht exportiert. Daher reicht zum Zugriff auf den AST ein RefactoringInfo-Objekt nicht aus. Stattdessen wrid zusätzlich stets eine Instanz von PyEdit benötigt.