Мне нужно предварительно обработать некоторый код перед компиляцией для языка на основе 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 — это класс посетителя, который содержит указанный выше метод посещения. Есть и другие замены, которые я выполняю правильно. Только это вызывает проблемы.