Парсить исходный код Java


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

package com.example.sources;

import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.resources.client.ImageResource.ImageOptions;
import com.google.gwt.resources.client.ImageResource.RepeatStyle;

import com.example.sources.MainSceneResource;
import com.example.sources.Preloadable;

public interface MainSceneResources extends ClientBundle, Preloadable {

    @Source("com/example/sources/css/mainscene.css")
    public MainSceneResource mainSceneCss();

    @Source("com/example/sources/img/panorama.jpg")
    @ImageOptions(repeatStyle = RepeatStyle.None)
    public ImageResource mainSceneBackground();

}

Мне нужно:

  1. удалить строку с пакета;
  2. изменение линии с импорта (удалить импорт сайта, пробел, точка с запятой в конце) и добавить раздели пакеты с фабрики'ы способ addImport(линия);
  3. изменение Preloadable , чтобы автоматически
  4. скопируйте остальные линии без изменений с SourceWriterметод ув.код println(линия)

В настоящее время мой код, как:

BufferedReader reader = new BufferedReader(new InputStreamReader(ris));

String line = null;
try {
    while ((line = reader.readLine()) != null) {
        if (line.contains("package") || line.isEmpty()) {
            continue;
            }
        int index = line.indexOf("import");
        if (index != -1) {
            line = line.substring(index + 6, line.lastIndexOf(";")).trim();
            factory.addImport(line);
            continue;
        }
        if (line.contains("Preloadable")) {
            line = line.replace("Preloadable", "Generated");
        }
        sw.println(line);
    }
} catch (IOException e) {
    throw new UnableToCompleteException();
}

Еще обратите внимание, что я не могу использовать SourceWriter метод ув.метод println(линия) до Factrory фабрики.addImport(линия);

Моя самая заботы о призвании линии.содержит("шаблон") в то время какпетля. Как я знаю, "план" будет составлен в Java регулярное выражение Pattern.class. Я знаю, что это не хорошо, чтобы компилировать один и тот же образец снова и снова, пока цикл завершается, но не знаю, как это лучше делать. Также я сомневаюсь насчет этой линии (для прокладки импортных линий)

line = line.substring(index + 6, line.lastIndexOf(";")).trim();

Есть ли лучший способ сделать это?



1829
8
задан 27 июня 2011 в 06:06 Источник Поделиться
Комментарии
1 ответ

Вообще, что ты делаешь-опасно. Более опасно, как вы могли бы ожидать. Как только у вас есть что-то странное, как разрыв строки в пакете или импортировать линии, двойной запятой или нескольких операторов импорта в строке, то код будет перерыв. Если ваши ключевые слова ("пакет", "экспорт", "автоматически") используются где-то внутри интерфейса, его сломают, а также (обратите внимание, что эти слова могли появиться, например, в комментариях).

Если вы не хотите использовать "реальные" Ява парсер, есть некоторые вещи, которые вы можете сделать, чтобы улучшить ваш код: Если вы не нашли закрывающей запятой для упаковки или импорт, добавьте следующую строку, пока вы не имеете один - или бросить, по крайней мере, значимые ошибки. Вы также можете проверить, если у вас есть две точки с запятой в пакете или импортировать линии. Но я думаю, что наиболее важным моментом является, чтобы сломать свой цикл в 4-х частях для того, чтобы внести изменения как "местные", как это возможно. Первый цикл сделки с пакетом, второй с импорта, третий-С и четвертый просто добавляет остальные без изменения. Так что вы находитесь в безопасности, что через шаг сделан, он не может причинить никакого вреда следующий код. Другая вещь, которую вы могли бы попробовать это для предварительной обработки кода с некоторой праматерии / довольно принтер, который может избавиться от некоторых закидонов.

Перед тем, как код попадает хоть немного более защищенной, я бы не слишком беспокоиться о производительности. Рассмотреть вопрос о включении некоторых тестов JUnit (спросите у ваших коллег на некоторые "означает" ввод классов - вы будете удивлены, что странные монстры, они могут представить - и использовать более реалистичные примеры).

4
ответ дан 27 июня 2011 в 10:06 Источник Поделиться