トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

Diary/2012-11-12

import文はどこへ?

OpenJDK6の話.
Javaのクラス定義は,JCClassDeclというJCTreeのサブクラスで管理されている.
インスタンス変数は,このクラスの中のどこかにぶらさがっていて,
それが何のクラスのインスタンスかっていうのは,メソッドでとりだすことができる.

一方,メソッド呼び出しは,JCMethodDeclのインスタンスとして管理されているのだけど
どうもこのインスタンスからは,メソッド呼び出しのレシーバがだれなのか,
を取り出せない...ようにみえる.
インスタンス変数ならば,シンボルテーブルみたいなものを辿れば,探せるけど,
(実際,静的に探そうとするとエイリアスの問題があって厄介だけど)
そもそもstaticなメソッドであれば,どこかに誰かがクラスパスをもっていないといけないはず....

でもJCClassDeclには,ない.
でみてみると,com.sun.tools.javac.main.JavaCompiler.javaでは,

JavaFileObject genCode(Env<AttrContext> env, JCClassDecl cdef) throws IOException {
...
}

として,JCClassDeclとは別にEnv<AttrContext>のインスタンスでクラス自身のパスや
import文をもっているということがわかった.

for(Symbol s: env.outer.info.getLocalElements()){
  System.out.println(s);
}

とりあえず,こんな感じで取り出せる.
よく考えれば(よく考えなくても),たしかに,import文ってクラスの外で定義してあるよね.
これで,やっとstaticなメソッド呼び出しのパス検索をごにょごにょできる.よかった.

ちなみに,これは,OpenJDK6の話...OpenJDK7ではどうなっているのか.
そろそろJavaRockも7ベースに移行することを考えるか...