Как использовать ASTRewrite для замены конкретного SimpleType на PrimitiveType?

Мне нужно предварительно обработать некоторый код перед компиляцией для языка на основе Java - Processing. В этом языке все экземпляры типа color необходимо заменить на int. Например, вот фрагмент кода:

color red = 0xffaabbcc;
color[][] primary = new color[10][10];

После предварительной обработки приведенный выше код должен выглядеть так:

int red = 0xffaabbcc;
int[][] primary = new int[10][10];

Я работаю в среде без затмения. Для этого я использую Eclipse JDT ASTParser. Я реализовал свой ASTVisitor, который посещает все узлы SimpleType. Вот фрагмент кода из реализации ASTVisitor:

public boolean visit(SimpleType node) {
    if (node.toString().equals("color")) {
        System.out.println("ST color type detected: "
                + node.getStartPosition());
        // 1
        rewrite.replace(node,
                rewrite.getAST().newPrimitiveType(PrimitiveType.INT), null);
        // 2
        node.setStructuralProperty(SimpleType.NAME_PROPERTY, rewrite
                .getAST().newSimpleName("int")); // 2
    }
    return true;
}

Здесь rewrite является экземпляром ASTRewrite. Строка 1 не действует (строка 2 закомментирована). И строка 2 вызывает исключение IllegalArgumentException, потому что newSimpleName() не будет принимать какие-либо ключевые слова Java, такие как int.

Поиск и замена всех экземпляров цвета регулярным выражением не кажется мне правильным, поскольку это может привести к ненужным изменениям. Но я могу ошибаться.

Как я могу этого добиться? Или есть какие-то альтернативные решения или подходы, которые я могу использовать?

Спасибо

Update Edit: Вот фрагмент, который выполняет ASTRewrite:

    CompilationUnit cu = (CompilationUnit) parser.createAST(null);
    cu.recordModifications();
    rewrite = ASTRewrite.create(cu.getAST());
    cu.accept(new XQASTVisitor());

    TextEdit edits = cu.rewrite(doc, null);
    try {
        edits.apply(doc);
    } catch (MalformedTreeException e) {
        e.printStackTrace();
    } catch (BadLocationException e) {
        e.printStackTrace();
    }

XQAstVisitor — это класс посетителя, который содержит указанный выше метод посещения. Есть и другие замены, которые я выполняю правильно. Только это вызывает проблемы.


person Manindra Moharana    schedule 23.07.2012    source источник
comment
Что вы делаете после посещения AST? Вы вызываете ASTRewrite#rewriteAST(), а затем применяете TextEdit? Возможно, дополнительные фрагменты кода помогут ответить.   -  person Alexandre Dupriez    schedule 18.08.2012
comment
Спасибо. Глядя на код, он кажется правильным. Что является родителем узла SimpleType AST, имя которого — цвет? Кроме того, для объявлений массива color[][] я думаю, вы используете метод посещения для ArrayType ?   -  person Alexandre Dupriez    schedule 19.08.2012
comment
Родителем типа color может быть любой astnode, включая ICompilationUnit, объявление метода и т. д. Это просто фиктивный псевдоним в языке программирования, который внутренне обрабатывается как int. Да, для объявлений массивов я посещаю объявление ArrayType. (Надеюсь, я правильно понял ваш вопрос)   -  person Manindra Moharana    schedule 19.08.2012
comment
Спасибо. Когда вы говорите, что цвет — это псевдоним, что вы имеете в виду? Это класс или перечисление, верно?   -  person Alexandre Dupriez    schedule 19.08.2012
comment
Нет, это ни то, ни другое. Все типы цветов просто заменяются текстом на int. На самом деле это довольно простой поиск/замена, ничего сложного в этом нет.   -  person Manindra Moharana    schedule 19.08.2012
comment
Спасибо. Но разве это Ява? Как вы можете определить такое ключевое слово в Java?   -  person Alexandre Dupriez    schedule 19.08.2012


Ответы (1)


Я нашел твои ошибки! Это утверждение:

TextEdit edits = cu.rewrite(doc, null);

это не так. И следует заменить следующим утверждением:

TextEdit edits = rewrite.rewriteAST(doc, null);

В конце снова проанализируйте измененный документ в CompilationUnit, изменения будут применены. Более того, заявление:

node.setStructuralProperty(SimpleType.NAME_PROPERTY, rewrite.getAST().newSimpleName("int"));

не требуется.

person yixiao yang    schedule 08.03.2017
comment
Я проверил ваш код своими манипуляциями на своей машине, и он действительно работает! - person yixiao yang; 08.03.2017
comment
Спасибо за ответ! Никогда не поздно. :) Мы придумали другой обходной путь для редактирования источника. - person Manindra Moharana; 08.03.2017