2010-07-28 4 views
6

Я недавно пришел к необходимости изменения кода Java (добавления методов, изменения подписи некоторых полей и методов удаления), и я думаю, что все это можно выполнить, хотя использование Eclipse SDK АСТ.Использование Eclipse AST

Я знаю из какого-то исследования, как разбирать исходный файл, но я не знаю, как это сделать. Кто-нибудь знает хороший учебник или может кто-нибудь дать мне краткое объяснение того, как решить эти проблемы?

Спасибо большое,

ExtremeCoder


Edit:

Я теперь начал смотреть больше в JCodeModel, и я думаю, что это могло бы быть гораздо проще в использовании, но я не знаю, может ли быть загружен существующий документ?

Если это может работать, дайте мне знать;)

Еще раз спасибо.

ответ

4

Я не буду публиковать весь исходный код этой проблемы здесь, потому что он довольно длинный, но я заставлю людей начать.

Все документы, которые вам нужно будет здесь:. http://publib.boulder.ibm.com/infocenter/iadthelp/v6r0/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-summary.html

Document document = new Document("import java.util.List;\n\nclass X\n{\n\n\tpublic void deleteme()\n\t{\n\t}\n\n}\n"); 
ASTParser parser = ASTParser.newParser(AST.JLS3); 
parser.setSource(document.get().toCharArray()); 
CompilationUnit cu = (CompilationUnit)parser.createAST(null); 
cu.recordModifications(); 

Это создаст модуль компиляции для вас из исходного кода, который вы передаете в

Теперь это простая функция, выдает все методы внутри определений классов в том, что вы прошли:

List<AbstractTypeDeclaration> types = cu.types(); 
for(AbstractTypeDeclaration type : types) { 
    if(type.getNodeType() == ASTNode.TYPE_DECLARATION) { 
     // Class def found 
     List<BodyDeclaration> bodies = type.bodyDeclarations(); 
     for(BodyDeclaration body : bodies) { 
      if(body.getNodeType() == ASTNode.METHOD_DECLARATION) { 
       MethodDeclaration method = (MethodDeclaration)body; 
       System.out.println("method declaration: "); 
       System.out.println("name: " + method.getName().getFullyQualifiedName()); 
       System.out.println("modifiers: " + method.getModifiers()); 
       System.out.println("return type: " + method.getReturnType2().toString()); 
      } 
     } 
    } 
} 

Это должно заставить вас всех начать.

Это займет некоторое время, чтобы привыкнуть к этому (много в моем случае). Но он работает, и это лучший способ, которым я мог бы справиться.

удачи;)

ExtremeCoder


Edit:

Прежде чем я забыл, это импорт, который я использовал, чтобы получить эту работу (я взял довольно мало время, необходимое для их организации):

org.eclipse.jdt.core_xxxx.jar 
org.eclipse.core.resources_xxxx.jar 
org.eclipse.core.jobs_xxxx.jar 
org.eclipse.core.runtime_xxxx.jar 
org.eclipse.core.contenttype_xxxx.jar 
org.eclipse.equinox.common_xxxx.jar 
org.eclipse.equinox.preferences_xxxx.jar 
org.eclipse.osgi_xxxx.jar 
org.eclipse.text_xxxx.jar 

Где xxxx представляет номер версии.

1

Вы можете сделать это с помощью Eclipse, позвонив в API, который позволит вам управлять АСТ.

Или вы можете применять программные преобразования для достижения своего эффекта таким образом, чтобы он не зависел от микроскопических деталей АСТ.

В качестве примера можно записать следующее преобразование программы:

add_int_parameter(p:parameter_list, i: identifier): parameters -> parameters 
    " \p " -> " \p , int \i"; 

добавить целочисленный параметр с произвольным именем в списке параметров. Это приводит к такому же эффекту, что и целый набор вызовов API, но он намного читабельнее, поскольку он находится в поверхностном синтаксисе вашего языка (в данном случае Java).

Наши DMS Software Reengineering Toolkit могут принимать такие program transformations и применять их на многих языках, включая Java.

 Смежные вопросы

  • Нет связанных вопросов^_^