Java ベースの言語 - 処理用にコンパイルする前に、いくつかのコードを前処理する必要があります。この言語では、タイプ color のすべてのインスタンスを int に置き換える必要があります。たとえば、コード スニペットは次のとおりです。
color red = 0xffaabbcc;
color[][] primary = new color[10][10];
前処理後、上記のコードは次のようになります。
int red = 0xffaabbcc;
int[][] primary = new int[10][10];
私は日食以外の環境で働いています。これを行うためにEclipse JDT ASTParserを使用しています。すべての SimpleType ノードにアクセスする ASTVisitor を実装しました。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 行目では、newSimpleName() が int などの Java キーワードを受け入れないため、IllegalArgumentException がスローされます。
色のすべてのインスタンスを見つけて正規表現で置き換えることは、不必要な変更を引き起こす可能性があるため、私には正しい方法のようには思えません。しかし、私は間違っているかもしれません。
どうすればこれを達成できますか?または、私が取ることができる代替の解決策やアプローチはありますか?
ありがとう
更新編集: 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 は、上記の visit メソッドを含むビジター クラスです。私が実行している、正しく実行される他の置換があります。これだけが問題を引き起こします。