いろいろ諦めた
これまで,
class A { ... public static A1 extends A { ... } } interface AVisitor { void visit(A.A1 a1); void visit(A.A2 a2); }
みたいな風に定義してました.
ポイントは,staticなインナークラスとして定義していることで,名前空間が分かれていることです.Expr.LetとかDefinition.Letとかあるので,困って.
ところが,こういう定義は,Eclipseと死ぬほど相性が悪い.Eclipseで,a1.accept(new AVisitor(){});とか書くと,赤くなって,クイックフィックスするとAVisitorで必要な定義を自動生成してくれるのですが,この自動生成のときにインナークラスの名前までimportしちゃってくれるもんだからpublic void visit(A1 a1) { ... }みたいのが生成されるわけです.すると,A.A1だけなら良いんですけど,B.A1も同じソースコードにあると完全修飾名になってしまう.かっこ悪い.というか長くなってタイプがしんどい.
インナークラスはimportしないようにするオプションがないかと思って探してたんですけど,どうも無いみたいで.
ちょっと前までは,自動生成しないでいちいち手でpublic void visit(A.A1 a1) { ... }とか書いていたんですが,あまりに馬鹿馬鹿しいもんで諦めることにしました.
インナークラスを止めて,プレフィックス付けることに.機械翻訳だけ使わせて外国人同士を会話させると,機械翻訳しやすい母国語文を書くようになる,という話を思い出しました.Eclipseが処理しやすいソースコードを書く.
で今これまでに書いたソースコードを直したとこ.Expr_Constantとか残念な感じのクラスが沢山できましたけど,まあしかたない.ConstantExprとかの方がかっこ良いきはしますが,これも機械的に処理しやすい…ルールの結果.gsub!(/\bExpr\./, 'Expr_')で済む方が楽.いや,Rubyならどっちでも良いんですけど.Eclipseのエディタで置換することを考えると,ね.