eclipseコンパイラ調査報告書

株式会社デュオシステムズ

$Revision: 1.47 $

目次
eclipseのコンパイラ
eclipseのコンパイラの概要
JDTのAST
JDTを効率的に読む
文法定義ファイルからのコンパイル方法
jikesPGの入手とインストール
jikesPGについて
eclipse 2.1のソースの入手と展開
eclipse 2.1のフルビルド
パーサーの生成
eclipseソースへの盛り込み
eclipseの再ビルド
Java構文拡張
方針
Optimistic Try文の追加
文法の変更
スキャナーの変更
トークンの開始位置の記憶
構文木の生成
Map初期化子の追加
文法の変更
スキャナーの変更
パーサーの変更
ASTの追加
コード変更のノウハウ
Java構文拡張を組み込んだeclipseを動かす
Java構文拡張を組み込んだeclipseのビルド方法
動作確認
既知の問題
今回の構文拡張方法の限界
pxmlをJDTに組み込める実装可能性
pxmlの文法がLALR(1)でない
pxmlとJDTがスキャナーに求める要件の違い
JDTで文法はプラガブルでない
本ドキュメントの生成方法
JDTファイルリスティング

eclipseのコンパイラ

ここでは、eclipseのコンパイラを変更する際に、念頭に置くべき事柄を述べる。


eclipseのコンパイラの概要

eclipseでのJavaの開発支援は、org.eclipse.jdt.coreプラグインが行っており、Javaのコンパイラもこのプラグインの中に含まれる。 JDTのコンパイラはJikesで使用されているパーサージェネレータJikesPGで生成されている。文法定義は、plugins/org.eclipse.jdt.core/grammarディレクトリに収められており、J2SE1.4用の文法定義ファイルは、java_1_4.gである。 文法定義ファイルからJDTをビルドする方法は、文法定義ファイルからのコンパイル方法を参照。

後述のjikesPGがLALR(1)の文法を扱うため、eclipseのコンパイラはLALR(1)の文法を扱う。

JDTのコンパイラのコードには、ほとんどコメントが付いていない(APIとして公開されている一部を除く)。また、publicなフィールドも多い(アクセッサが用意されていないことが多い)。したがって、例えば「インスタンスがどういう値に設定されていれば正常な状態か」など、多くの事柄をソースから推測するしかない。 「正しく動くはず」のコードを記述するのは困難なので、「多分これで動くのではないか」と言うコードを書いてテストすることになった。eclipseのコミュニティと密に連携しなければ、 安心してコードやテストコードを書いたり、eclipseのバージョンアップに対応するのは困難と思われる。

JDTのコードを見ると、軽快な動作を実現するための努力が多く見られる(中には無意味と思われる努力も)。javaの文法定義を見ても、パーサーの状態遷移表が大きくならないようになっている。JDTでは編集中に何度もパーサーを呼び出すので、高速なパーサーは必要不可欠である。


JDTのAST

通常、コンパイラはAST(抽象構文木)を使用してコンパイル処理を実現する。 JDTもASTを利用するが、JDTでは、次のような4種類ものASTが存在する。コンパイルに必要なのは、org.eclipse.jdt.internal.compiler.astパッケージにあるASTである。

表 1. JDTのAST

ASTの種類用途
org.eclipse.jdt.core.IJavaElementを親とするクラスPackageExplorerに表示する単位。クラス、フィールド、メソッド(、インポート文も?)。
org.eclipse.jdt.core.jdomJava ドキュメント・オブジェクト・モデル (DOM) をサポートしており、Java コンパイル単位の構造を確認しながら移動することができる。粒度はorg.eclipse.jdt.core.IJavaElementとほぼ同じ。
org.eclipse.jdt.core.domコンパイル単位の構造をステートメント・レベルまで検査するために使用する抽象構文ツリー
org.eclipse.jdt.internal.compiler.astコンパイルするための抽象構文ツリー。粒度はorg.eclipse.jdt.core.domとほぼ同じ。

JDTを効率的に読む

JDTのソースを読むとき、大量のソースを縦横無尽に行き来する必要がある。ソースのブラウズにeclipse自身を使うと 非常に便利である。次のようなことが、単一のファイル単位ではなく、ワークスペースレベルでできる。

  1. 選択した識別子の定義個所にジャンプ

  2. 選択した識別子の参照個所を検索

  3. 選択したクラスまたはインターフェイスの階層構造を表示

  4. 選択した変数を変更している個所を検索

  5. 選択した変数を参照している個所を検索

eclipseを構成するプラグインをeclipseで参照するには、次のようにする。

  1. eclipseのソースを展開する。展開先(pluginsディレクトリを含むディレクトリ)を${ECLIPSESRC}とする。

  2. eclipseを起動し、 File->New->Projectで、Simple Projectを選択。Plug-in Project等を選ばない。

  3. 図1のダイアログで、Use defaultのチェックをはずし、${ECLIPSESRC}/plugins/<プラグイン名> をDirectoryに指定し、Project nameに<プラグイン名>を指定する。

  4. 取り込んだプラグインが依存する他のプラグインがないとエラーが出るので、適宜足りないプラグインを取り込む。JDTのソースを読むのに最低限必要なのは、次のプラグイン。

    
org.apache.ant
    org.apache.xerces
    org.eclipse.ant.core
    org.eclipse.ant.optional.junit
    org.eclipse.core.boot
    org.eclipse.core.resources
    org.eclipse.core.runtime
    org.eclipse.jdt
    org.eclipse.jdt.core
    

  5. 作成したプロジェクトを、JavaパースペクティブやPDEパースペクティブで開く。

図 1. eclipseプラグインをeclipseプロジェクトとして取り込む


文法定義ファイルからのコンパイル方法

JDTのコンパイラを変更するには、まずJDTのビルド方法を知る必要がある。 ここでは、JDTのコンパイラを変更した際の、eclipseの再構築方法を述べる。

文法定義ファイルからのパーサーを生成しJDTをコンパイルする方法は、eclipseのサイトに示されている(ただし、一部記述されていない作業もある)。

文法定義ファイルを変更しJDTをビルドするまでの大まかな流れを、図1に示す。実際には、図1に示した作業以外にも、jikesPGのインストールなどが必要である。

図 1. 文法変更の流れ

以下に、Red Hat Linux 8.0(x86)上でのコンパイル手順を詳細に示す。


jikesPGの入手とインストール

まず、パーサー生成に必要なjikesPGをインストールする。jikesのホームページから、jikesPGの1.3(jikespg-1.3.tar.gz)をダウンロードする。ダウンロードしたファイルへのパスが、/path/to/jikespg-1.3.tar.gzで、/opt/jikespgにインストールする場合、次のようにする。


# mkdir /opt
# cd /opt
# tar zxvf /path/to/jikespg-1.3.tar.gz
# cd jikespg/src
# make clean all
# mkdir ../bin
# cp jikespg ../bin
# make clean

以後の作業では、/opt/jikespg/binにパスが通してあるものとする。


jikesPGについて

jikesPGは、Java言語で記述されたパーサーを生成するパーサージェネレータである。jikesPG自身は、C言語で記述されており、非常に高速に動作する。

jikesPGは、主にjikes(IBMのjavaコンパイラ)を作るために使用されているようで、Java向けの汎用パーサージェネレータとしてはあまり認知されていないようだ。 その為か、jikesPGに関する情報は、非常に限られており、文法定義ファイルの記述方法のドキュメントすら見つけられなかった。 jikesPGに付属のexampleやjava_1_4.gの技術を見て、使用方法を推測した。 また、エラー処理などがいい加減で、長いパス名などをパラメータに渡すと、バッファオーバーランで誤動作する。今回は、gcc バージョン 3.2 20020903 (Red Hat Linux 8.0 3.2-7)でコンパイルしたものを使用した。jikesPGの移植性はかなり低いらしく、使用しているコンパイラや実行環境によっては、ユニークに割り当てられるべき整数が重複することがある。


WindowsでjikesPGを使用できるか?

WindowsでjikesPGをコンパイルするには、Free Borland C++ CompilerGNU utilities for Win32をインストールし、jikespg/src/Makefileを修正し makeを実行する。Makefileの主な変更点は、オブジェクトファイルの拡張子を.objにするのと、リンクのコマンドを

$(CC) -ejikespg.exe ....
と変更することである。

ただし、出来上がったjikespgでパーサーを作成したところ、トークンにユニークに割り当てられるべき整数が重複していた。そのため、Parser.javaをコンパイル中にcaseラベルが重複している旨のエラーが出て、使い物にならなかった。bcc32でコンパイル時に、警告がいくつか出るのでそれを修正すれば使えるかもしれない。cygwin&gccでコンパイルすれば 問題ないかもしれないが、未確認。Linux for x86でも、gccのバージョンによってはbcc32と同じ現象が見られるようだ。


eclipse 2.1のソースの入手と展開

eclipseのホームページから、eclipse 2.1のソース(eclipse-sourceBuild-srcIncluded-2.1.zip)をダウンロードする。ダウンロードしたファイルへのパスが、/path/to/eclipse-sourceBuild-srcIncluded-2.1.zipで、/opt/eclipse-2.1(以下、/opt/eclipse-2.1を${eclipse}と表記)に展開する場合、次のようにする。


# eclipse=/opt/eclipse-2.1
# mkdir -p ${eclipse}
# cd ${eclipse}
# unzip /path/to/eclipse-sourceBuild-srcIncluded-2.1.zip

eclipse 2.1のフルビルド

後述するが、JDTのパーサーを変更してビルドするには、JDT自身のjarファイル(${eclipse}/plugins/org.eclipse.jdt.core/jdtcore.jar)が必要になる。 したがって、まずeclipse全体をビルドし、jdtcore.jarを作成する。 eclipseをビルドするには、ant(>=1.4)、JDK(>=1.4.1)が利用可能な状態で、次のようにする。


# cd ${eclipse}
# build -os <osType> -ws <windowSystemType>

<osType>や<windowSystemType>に指定する値は、表1を参照。

表 1. プラットフォームの選択オプション

osTypewindowSystemType
win32win32
linuxmotif
linuxgtk
solarismotif
aixmotif
hpuxmotif
qnxphoton

パーサーの生成

ここまでで、eclipseのコンパイラをJavaの文法定義ファイルからビルドする準備が整った。 以降、Javaの文法定義ファイルからJDTをビルドしなおす方法を述べる。まず、次のように、Javaの文法定義ファイルから、jikesPGを使用してパーサーを生成する。Javaの文法定義ファイルは、${eclipse}/plugins/org.eclipse.jdt.core/grammar/java_1_4.gである。


# cd ${eclipse}/plugins/org.eclipse.jdt.core/grammar
# jikespg java_1_4.g
  …
This grammar is LALR(1).
  …
# ls
JavaAction.java  java_1_4.l  javadcl.java  javahdr.java  javasym.java
java_1_4.g       java_1_5.g  javadef.java  javaprs.java

すると、表2に示すファイル群が生成される。生成されたファイルは、そのままJDTのパーサーとして使えるわけではなく、後述のように切り貼りや修正を加えてJDTに組み込んでいく必要がある。

表 2. 生成されるファイル群

ファイル名説明
JavaAction.java構文を認識した際(reduce時)に実行するアクションが出力される。
java_1_4.lパーサーを生成した際のログ情報。
javahdr.java通常、空のファイルとなっている。
javadcl.javaトークン名を表す文字列定数や状態遷移表などが出力される。
javasym.java各トークンを表す定数が出力される。
javadef.java状態遷移表に関する基本的な情報が入っている。
javaprs.javaeclipseでは必要ないファイル。${eclipse}/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.javaに、ほぼ同等の機能のものが存在する。

eclipseソースへの盛り込み

次に、生成されたこれらのファイルをeclipseのソースに盛り込む。盛り込み方法を表3に示す。

表 3. JDTへの盛り込み方法

jikesPGによって生成されたファイル盛り込み先のeclipseのソースファイル修正の仕方
JavaAction.java${eclipse}/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.javaJavaAction.javaの中身で、Parser.javaのメソッドconsumeRule(int)を置き換える。
javadcl.javajavadcl.javaの文字列"$eof"を定数UNEXPECTED_EOFに、文字列"$error"を文字列"Invalid Character"に書き換える。その後、javadcl.javaのrhsとname定数フィールドで、Parser.javaのrhsとnameを置き換える。
java_1_4.gjava_1_4.gの中身で、Parser.javaのgrammar()メソッド内のコメントを置き換える。
javasym.java${eclipse}/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/TerminalTokens.javajavasym.java中の文字列"TokenName$eof"を"TokenNameEOF"に、文字列"TokenName$error"を"TokenNameERROR"に書き換えてから、ITerminalSymbols.javaとTerminalTokens.javaに盛り込む。その際、次の定数を消さないように注意する。 TokenNameWHITESPACE,TokenNameCOMMENT_LINE,TokenNameCOMMENT_BLOCK,TokenNameCOMMENT_JAVADOC
${eclipse}/plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/compiler/ITerminalSymbols.java
javadef.java${eclipse}/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.javajavadef.javaのフィールド定義で、ParserBasicInformation.java内のフィールド定義を置き換える。

上記に加えて、javadcl.javaからUpdateParserFiles.javaを使用してリソースファイルを作成しなければならない。このとき使用するjdtcore.jarは、最初にフルビルドしたときものを使用する。


# cd ${eclipse}/plugins/org.eclipse.jdt.core
# wget 'http://dev.eclipse.org/viewcvs/index.cgi/~checkout~/jdt-core-home/howto/generate%20parser/UpdateParserFiles.java'
# javac -classpath jdtcore.jar UpdateParserFiles.java
# base=$PWD
# cd compiler/org/eclipse/jdt/internal/compiler/parser
# java -cp ${base}/jdtcore.jar:${base} UpdateParserFiles ${base}/grammar/javadcl.java

eclipseの再ビルド

ここまでの作業で、JDTのコンパイラのソースの更新が完了した。後は、eclipseを再ビルドすることで、新しいコンパイラを組み込んだeclipseが出来上がる。org.eclipse.jdt.coreプラグインだけを再コンパイルすることもできるが、org.eclipse.jdt.coreに依存した他のプラグイン(例:org.eclipse.jdt.uiなど)も存在するので、eclipse全体をフルビルドした方がよい。


# cd ${eclipse}
# build -os <osType> -ws <windowSystemType>

Java構文拡張

JDTのパーサーのビルド方法が理解できたところで、次は具体的にJavaの構文を拡張してみる。


方針

Javaの構文拡張をJDTのコンパイラに組み込む際、次の点に留意して方針を決めた。

  1. eclipseおよびJDTの構造に合わせて、素直に拡張する。

  2. コーディング量を極力抑える。

その結果、次のような方針でJavaの構文を拡張することにした。

  1. 新たな拡張構文を、JikesPGの文法定義ファイルに追加する。

  2. 必要であればAST(org.eclipse.jdt.internal.compiler.ast.*)に新たなノードを加える。 そうでなければ、既存のASTを組み合わせる。

具体的には、Optimistic Try文(tryブロック内で発生した例外を無視するtry文)と、 java.util.Mapインスタンスの初期化子を追加する。


Optimistic Try文の追加

構文拡張の具体例として、Optimistic(楽観的) Try文を追加する。これは、APIインターフェイス上は例外が発生し得るが、 実際には例外が発生し得ない場合のコーディングを楽にするシンタックスシュガーである。


ByteArrayOutputStream os = new ByteArrayOutputStream();
try __optimistic__ {
	os.close();
}
これは、下記のコードと等価であり、実際に下記のコードの構文木と同じ構文木に変換する。

ByteArrayOutputStream os = new ByteArrayOutputStream();
try  {
	os.close();
} catch (Throwable th) {
}
__optimistic__により付加されるcatch節は、最後のcatch節(finally節よりは前)として追加される。また、__optimistic__を付加したtry文は、catch節もfinally節も省略してよい。

実際の変更作業の流れは次のようになる。

  1. 文法定義ファイルの変更(文法の変更)

  2. スキャナーの変更(スキャナーの変更)

  3. パーサーの変更(トークンの開始位置の記憶構文木の生成)


文法の変更

まず、新しく導入した__optimistic__キーワードに相当するトークンを文法定義ファイルに加える。トークンは、文法定義ファイルの$Terminalsというセクションに記述するので、次のように「__optimistic__」と言う単語を追加する。


$Terminals
	__optimistic__

既存の文法定義ファイルのコードでは、try文は次のように記述されている。


TryStatement ::= 'try'    Block Catches
/.$putCase consumeStatementTry(false); $break ./
TryStatement ::= 'try'    Block Catchesopt Finally
/.$putCase consumeStatementTry(true); $break ./
これは、このような構文を認識した際、org.eclipse.jdt.internal.compiler.parser.Parser.consumeStatementTry(boolean withFinally)メソッドを呼ぶ という記述である。 そこで、次の文法定義を追加する。

-- Extended Grammar {
TryStatement ::= 'try'    '__optimistic__' Block Catchesopt
/.$putCase consumeStatementOptimisticTry(false); $break ./
TryStatement ::= 'try'    '__optimistic__' Block Catchesopt Finally
/.$putCase consumeStatementOptimisticTry(true); $break ./
-- Extended Grammar }
"--"から行末まではコメントである。この追加により、Optimistic Try拡張構文を認識した場合、org.eclipse.jdt.internal.compiler.parser.Parser.consumeOptimisticStatementTry(boolean withFinally)メソッドが呼び出される。


スキャナーの変更

今回、__optimistic__というキーワードを追加するので、字句解析メソッドを修正し、パーサーに新しく追加したトークンを返すようにする。 具体的には、org.eclipse.jdt.internal.compiler.parser.Scanner.scanIdentifierOrKeyword()メソッドに次のコードを追加する。


		case '_' : //__optimistic__
			switch (length) {
				case 14 :
					if ((data[++index] == '_')
						&& (data[++index] == 'o')
						&& (data[++index] == 'p')
						&& (data[++index] == 't')
						&& (data[++index] == 'i')
						&& (data[++index] == 'm')
						&& (data[++index] == 'i')
						&& (data[++index] == 's')
						&& (data[++index] == 't')
						&& (data[++index] == 'i')
						&& (data[++index] == 'c')
						&& (data[++index] == '_')
						&& (data[++index] == '_'))
						return TokenName__optimistic__;
					else
						return TokenNameIdentifier;

				default :
					return TokenNameIdentifier;
			}

もう一箇所、org.eclipse.jdt.internal.compiler.parser.Scanner.toStringAction(int act)メソッドに次のコードを追加する。


		case TokenName__optimistic__ :
			return "__optimistic__"; //$NON-NLS-1$

トークンの開始位置の記憶

JDTではシンタックスエラーの指摘やデバッグ情報の出力などのために、主要な構文要素の開始位置と終了位置を覚えている。 新しく追加した__optimistic__トークンの位置も記憶できるように、パース時に__optimistic__トークンの開始位置を記憶するようにorg.eclipse.jdt.internal.compiler.parser.Parser.consumeToken(int)メソッドを修正する。具体的には、下記のように__optimistic__用のcaseラベルを追加する。


		case TokenNameassert :
		case TokenNameimport :
		case TokenNamepackage :
		case TokenNamethrow :
		case TokenNamenew :
		case TokenNamedo :
		case TokenNameif :
		case TokenNamefor :
		case TokenNameswitch :
		case TokenNametry :
		case TokenNamewhile :
		case TokenNamebreak :
		case TokenNamecontinue :
		case TokenNamereturn :
		case TokenNamecase :
		case TokenName__optimistic__ :                          (1)
			pushOnIntStack(scanner.startPosition);
			break;
(1)
__optimistic__トークン用のラベル追加


構文木の生成

前述の文法定義の追加により、consumeOptimisticStatementTry(boolean withFinally)メソッドが呼ばれるようになったが、このメソッドは 今回新たに追加するものであり、既存のメソッドではない。このメソッドを、org.eclipse.jdt.internal.compiler.parser.Parserクラスに直接追加する。 org.eclipse.jdt.internal.compiler.parser.Parserのサブクラスを作成し、それに追加しないのは、JDT内でorg.eclipse.jdt.internal.compiler.parser.Parserを 継承しているクラスが他にもあるためだ。 Parserクラスは、インスタンス変数としてAST(org.eclipse.jdt.internal.compiler.ast.*)のスタック(astStack)をメインテナンスしている。構文を認識したら、このASTスタックを操作してreduce操作を行うようにする。他にも、expressionStackやintStack(ソース上の位置や、modifierの指定状態などを表す)、identifierStackもある。先ほどの主要なトークンの開始位置もintStack上に一時的に保存それる。実際にconsumeOptimisticStatementTry(boolean withFinally)メソッドを実装すると次のようになる。


protected void consumeStatementOptimisticTry(boolean withFinally) {
	//TryStatement ::= 'try' '__optimistic__' Block Catchesopt
	//TryStatement ::= 'try' '__optimistic__' Block Catchesopt Finally

	consumeStatementTry(withFinally);                        (1)

	// create OptimisticTryStatement node from TryStatement on ast stack
	// and pushOnAstStack
	TryStatement tryStmt = (TryStatement)astStack[astPtr];   (2)

	final int optimisticLen = "__optimistic__".length();

	// swap try and __optimistic__ start positions
	int optimisticStart = tryStmt.sourceStart;
	long optimisticRange = (((long)optimisticStart) << 32) | (optimisticStart + optimisticLen);
	tryStmt.sourceStart = intStack[intPtr--];                (3)

	if (tryStmt.catchBlocks == null) {
		tryStmt.catchBlocks = new Block[0];
	}
	// add a catch block to ignore a throwable.
	{                                                        (4)
		Block[] catchBlocks = tryStmt.catchBlocks;
		tryStmt.catchBlocks = new Block[catchBlocks.length + 1];
		System.arraycopy(catchBlocks, 0, tryStmt.catchBlocks, 0, catchBlocks.length);
		tryStmt.catchBlocks[catchBlocks.length] = Block.EmptyWith(optimisticStart,
			optimisticStart + optimisticLen); // start, end
	}
	if (tryStmt.catchArguments == null) {
		tryStmt.catchArguments = new Argument[0];
	}
	// add a catch argument to ignore a throwable.
	{                                                        (4)
		Argument[] catchArguments = tryStmt.catchArguments;
		tryStmt.catchArguments = new Argument[catchArguments.length + 1];
		System.arraycopy(catchArguments, 0, tryStmt.catchArguments, 0, catchArguments.length);
		char[][] throwableType = {
			"java".toCharArray(),
			"lang".toCharArray(),
			"Throwable".toCharArray()
		};
		long[] pos = { optimisticRange, optimisticRange, optimisticRange }; // (start<<32 | end), ...
			
		Argument arg = 
			new Argument(
				"th".toCharArray(), 
				optimisticRange,  // name pos
				new QualifiedTypeReference(throwableType, pos), 
				AccDefault); // modifiers
		arg.declarationSourceStart = optimisticStart; //pos
		arg.declarationSourceEnd = optimisticStart + optimisticLen;
		tryStmt.catchArguments[catchArguments.length] = arg;
	}
}
(1)
まず、consumeStatementTry(boolean withFinally)を呼び出す。consumeStatementTry()は、__optimistic__トークンをtryトークンと勘違いしながらも、 tryブロックやcatch節finally節を正しく処理する。この時点で、intStackにtryトークンの開始位置が残っている。
(2)
次にASTスタックから、consumeStatementTry()がリデュースした結果のTryStatementオブジェクトを取り出す。
(3)
このTryStatementの開始位置は、__optimistic__トークンの開始位置からとなっており不適切なので修正する。このときintStackからtryトークンの開始位置をポップする。
(4)
あとは、例外を無視するためのcatch節をTryStatementに加える。このとき、catch節を構成する各要素のソース上の位置として、__optimistic__トークンの 位置を使用した。

Optimistic Tryの追加では、ASTを生成する時点でTryStatementノードに細工するすることにしたので、新たなASTノードの追加は行わなかった。


Map初期化子の追加

もう一つの構文拡張の具体例として、Map初期化子を追加する。これは、Perlで連想配列を初期化するイメージで、Mapインスタンスを初期化する構文を提供するものである。


Map colors = %{
	"red" => new Integer(0xff0000),
	"green" => new Integer(0x00ff00),
	"blue" => new Integer(0x0000ff)
};

上記のように記述すると、下記のコードと同じ動作をする。


Map colors = new HashMap();
colors.put("red", new Integer(0xff0000));
colors.put("green", new Integer(0x00ff00));
colors.put("blue", new Integer(0x0000ff));

=>の両辺は、リファレンス型でなければならない。

%{は、%と{の組み合わせではなく、単一のトークンとした。%と{の組み合わせにした場合、パーサー生成時にconflictが発生したためである。既存のJavaの文法定義で、 キャストが次のように定義されている。


-- Expression is here only in order to make the grammar LL1
CastExpression ::= PushLPAREN Expression PushRPAREN InsideCastExpressionLL1 UnaryExpressionNotPlusMinus
/.$putCase consumeCastExpressionLL1(); $break ./

そのため、次のコードの%が、剰余演算子なのか、Map初期化子を導くものなのか、(意味解析前の)構文解析時に判定できないためと思われる。


(1) % { "k"=>"v" } // 意味的には正しくない。構文解析上、キャスト式か算術式か曖昧。

実際の変更作業の流れは次のようになる。

  1. 文法定義ファイルの変更(文法の変更)

  2. スキャナーの変更(スキャナーの変更)

  3. パーサーの変更(パーサーの変更)

  4. ASTの追加(ASTの追加)


文法の変更

まず、下記のようにトークンを2つ追加する。文法定義ファイルでは、通常、トークンはEQUAL_GREATERのようなシンボルで表す。しかし、可読性を挙げるために、'=>'のようなリテラル風の表記をするためのエイリアスを定義できる。


$Terminals
	EQUAL_GREATER
	MAP_START
…
$Alias
        '=>'   ::= EQUAL_GREATER
        '%{'   ::= MAP_START
…

既存のArrayInitializerを参考にし、次のように、構文を追加した。


-- Extended Grammar {
Primary -> MapInitializer
MapInitializer ::= '%{' ,opt '}'
/.$putCase consumeEmptyMapInitializer(); $break ./
MapInitializer ::= '%{' MapEntries '}'
/.$putCase consumeMapInitializer(); $break ./
MapInitializer ::= '%{' MapEntries , '}'
/.$putCase consumeMapInitializer(); $break ./

MapEntries ::= MapEntry
MapEntries ::= MapEntries ',' MapEntry
/.$putCase consumeMapEntries(); $break ./
MapEntry ::= Expression '=>' Expression
/.$putCase consumeMapEntry(); $break ./
-- Extended Grammar }

上記の変更を行ったあと、jikesPGでパーサーを生成する。生成された、 javadcl.javaの中のpublic final staticString[]name の中の"MAP_START"と"EQUAL_GREATER"を、それぞれ、"%{"と"=>"に変更し、Parser.javaに反映させる。 これを行わないと、エラーメッセージなどで、%{などの代わりにMAP_STARTとシンボル名が表示されてしまう。


スキャナーの変更

今回、%{、 =>というキーワードを追加するので、字句解析メソッドを修正し、パーサーに新しく追加したトークンを返すようにする。 具体的には、org.eclipse.jdt.internal.compiler.parser.Scanner.getNextToken()メソッドに次のようにコードを変更する。


				case '%' :
					if (getNextChar('='))
						return TokenNameREMAINDER_EQUAL;
					else if (getNextChar('{'))
						return TokenNameMAP_START;
					return TokenNameREMAINDER;

                                …

   				case '=' :
					if (getNextChar('='))
						return TokenNameEQUAL_EQUAL;
					else if (getNextChar('>'))
						return TokenNameEQUAL_GREATER;
					return TokenNameEQUAL;

もう一箇所、org.eclipse.jdt.internal.compiler.parser.Scanner.toStringAction(int act)メソッドに次のコードを追加する。


		case TokenNameEQUAL_GREATER :
			return "=>"; //$NON-NLS-1$
 		case TokenNameMAP_START :
 			return "%{"; //$NON-NLS-1$

パーサーの変更

新たに追加した構文要素に対応するconsumeXxx()メソッドを、次のようにorg.eclipse.jdt.internal.compiler.parser.Parserクラスに追加する。


protected void consumeEmptyMapInitializer() {
	mapInitializer(0);                                       (1)
}

protected void consumeMapInitializer() {
	mapInitializer(expressionLengthStack[expressionLengthPtr--]);(1)
}

/**
 * 
 * @param length length is the size of the Map Initializer
 * expressionPtr points on the last elt of the mapInitializer, 
 * in other words, it has not been decremented yet.
 */
public final void mapInitializer(int length) {
	MapInitializer mi = new MapInitializer();
	if (length != 0) {                                       (2)
		expressionPtr -= length;
		System.arraycopy(expressionStack, expressionPtr + 1,
			mi.expressions = new Expression[length],
			0, length);
		for (int i = 0; i < length; i++) {
			((MapEntryExpression)mi.expressions[i]).mapInit = mi;
		}
	}
	pushOnExpressionStack(mi);                               (3)
	//positionning                                           (4)
	mi.sourceEnd = endStatementPosition;
	int searchPosition = length == 0 ? endPosition + 1 : mi.expressions[0].sourceStart;
	try {
		//does not work with comments(that contain '%{') nor '%{' describes as a unicode....		
		while (! (scanner.source[--searchPosition] == '%' &&
			scanner.source[searchPosition + 1] == '{')) {
		}
	} catch (IndexOutOfBoundsException ex) {
		//should never occur (except for strange cases like whose describe above)
		searchPosition = (length == 0 ? endPosition : mi.expressions[0].sourceStart) - 1;
	}
	mi.sourceStart = searchPosition;
}

protected void consumeMapEntries() {
	concatExpressionLists();                                 (5)
}

protected void consumeMapEntry() {
	expressionPtr -= 1;                                      (6)
	expressionLengthPtr -= 1;
	expressionStack[expressionPtr] =
		new MapEntryExpression(
			expressionStack[expressionPtr],
			expressionStack[expressionPtr + 1]);
}
(1)
expressionStack上のMapEntryExpressionの数を引数に、mapInitializer()を呼び出し、MapInitializerExpressionをスタックに積む。
(2)
expressionStack上のMapEntryExpressionを取り出し、MapInitializerのインスタンスに設定する。
(3)
出来上がったMapInitializerexpressionStackに積む。
(4)
MapInitializer構文の範囲を設定する。構文の開始点を探すのに、単純に%{というパターンを探しているため、コメント中の%{やユニコードシーケンスで書かれた%{を正しく扱えない。これと同じ制約が既存のarrayInitializer()メソッドにもあるため、今回は厳密な開始位置検索にしなかった。厳密に開始位置を求めるには、__optimistic__トークンを追加したときと同じように、%{トークンの開始位置をconsumeToken()でintStackに保存する方式がよい。
(5)
expressionStack上に積まれた式を結合する。詳細は、コード変更のノウハウを参照。
(6)
expressionStackから式を2つ取り出して、MapEntryExpressionを作りexpressionStackに積む。

ASTの追加

今回は、新たなASTノードとして、MapEntryExpressionとMapInitializerを追加する。両者とも、Expressionのサブクラスとした(表1参照)。ASTの型の階層構造を、図1に示す。 Statementが提供するメソッドは、通常、resolve→analyseCode→generateCodeの順で実行される。

図 1. コンパイルに使用するASTの種類

表 1. 関連するASTノード

ASTの種類用途
org.eclipse.jdt.internal.compiler.ast.Statement

Statementが提供するメソッド

void resolve(org.eclipse.jdt.internal.compiler.lookup.BlockScope scope)

引数のscopeを用いて、名前解決を行う。

org.eclipse.jdt.internal.compiler.flow.FlowInfo analyseCode(org.eclipse.jdt.internal.compiler.lookup.BlockScope scope, org.eclipse.jdt.internal.compiler.flow.FlowContext flowContext, org.eclipse.jdt.internal.compiler.flow.FlowInfo flowInfo)

意味解析を行う。

void generateCode(org.eclipse.jdt.internal.compiler.lookup.BlockScope scope, rg.eclipse.jdt.internal.compiler.codegen.CodeStream codeStream)

コード生成を行う。

org.eclipse.jdt.internal.compiler.ast.Expression

Expressionが提供するメソッド

org.eclipse.jdt.internal.compiler.lookup.TypeBinding resolveType(org.eclipse.jdt.internal.compiler.lookup.BlockScope scope)

名前解決を行う。Statementクラスのresolveと違うのは、式の型を返す点である。

org.eclipse.jdt.internal.compiler.ast.MapEntryExpression構文「key => value」を表すノード。Map.put(key,value)の呼び出しに相当するコードを生成する。このノード全体としての型は、voidとした。
org.eclipse.jdt.internal.compiler.ast.MapInitializer構文「%{ MapEntriesopt }」 を表すノード。new java.util.HashMap()に相当するコードを生成する。このノード全体としての型は、java.util.Mapとした。

MapEntryExpression

まず、MapEntryExpressionresolveTypeの実装を示す。


	public TypeBinding resolveType(BlockScope scope) {
		constant = NotAConstant;                                (1)
		TypeBinding keyType =                                   (2)
			key.resolveTypeExpecting(scope, scope.getJavaLangObject());
		TypeBinding valueType =                                 (2)
			value.resolveTypeExpecting(scope, scope.getJavaLangObject());

		if (putMsg == null) {                                   (3)
			putMsg = new MessageSend();
			putMsg.selector = new char[] { 'p', 'u', 't' };
			putMsg.receiver = mapInit.mapObj;
			putMsg.arguments = new Expression[] { key, value };
			putMsg.resolveType(scope);
		}
		return VoidBinding;
	}
(1)
このconstantフィールドは、Expressoinクラスで定義されており、定数の場合はその定数値を表すorg.eclipse.jdt.internal.compiler.impl.Constantオブジェクトを設定する。定数でない場合は、org.eclipse.jdt.internal.compiler.impl.Constant.NotAConstantを設定する。MapEntryExpressionの型は、常にvoidで定数とも考えられるが、定数扱いになって、=>の両辺の式が評価されないと困るので、NotAConstantを設定した。
(2)
=>の両辺のkeyとvalueを型解決する。
(3)
Map.put(key, value)メソッドを呼び出すために、MessageSendノードを作成し、名前解決しておく。putMsgはMapEntryExpressionで内部的に使っているだけで、ASTのトラバースの対象などにはならない。

次に、MapEntryExpressionのanalyseCodeの実装を示す。


	public FlowInfo analyseCode(
		BlockScope currentScope,
		FlowContext flowContext,
		FlowInfo flowInfo) {
		flowInfo = key.analyseCode(currentScope, flowContext, flowInfo)(1)
				.unconditionalInits();
		flowInfo = value.analyseCode(currentScope, flowContext, flowInfo)(1)
				.unconditionalInits();
		return flowInfo;
	}
(1)
このメソッドでは、単純に子ノードのanalyseCodeメソッドを呼び出し、その戻り値に対して、unconditionalInitsメソッドを呼び出している。このノードのように、無条件に自分以下のすべての子ノードが評価される場合は、このように簡単である。しかし、?:演算子や ||や&&等のように、ある項の評価結果によって別の項が評価されるかどうかが決まる場合は、もっと複雑である。また、実行未到達文の検出なども、このメソッドで行う。

最後に、MapEntryExpressionのgenerateCodeの実装を示す。


	public void generateCode(
		BlockScope currentScope,
		CodeStream codeStream,
		boolean valueRequired) {
		// objref on the operand stack

		int pc = codeStream.position;                           (1)

		// save objref                                          (2)
		codeStream.dup();
		// generate arguments
		if (putMsg.arguments != null) {                         (3)
			for (int i = 0; i < putMsg.arguments.length; i++) {
				putMsg.arguments[i].generateCode(currentScope, codeStream, true);
			}
		}
		// actual message invocation                            (4)
		if (putMsg.codegenBinding.declaringClass.isInterface()) {
			codeStream.invokeinterface(putMsg.codegenBinding);
		} else {
			codeStream.invokevirtual(putMsg.codegenBinding);
		}
		// operation on the returned value                      (5)
		if (valueRequired) {
			// implicit conversion if necessary
			codeStream.generateImplicitConversion(putMsg.implicitConversion);
		} else {
			// pop return value if any
			switch (putMsg.binding.returnType.id) {
				case T_long :
				case T_double :
					codeStream.pop2();
					break;
				case T_void :
					break;
				default :
					codeStream.pop();
			}
		}
		codeStream.recordPositionsFrom(pc,                      (6)
			(int) (putMsg.nameSourcePosition >>> 32));
	}
(1)
まず、現在のPCの位置を保存する。
(2)
親ノードであるMapInitializerが、HashMapを作成しそのオブジェクトリファレンスをオペランドスタックに積んだ状態で、MapEntryExpressionが呼ばれる。MapEntryExpressionは複数回呼ばれることがあるので、スタック上のオブジェクトリファレンスが失われないように複製をプッシュしておく。
(3)
引数を評価するコードを生成する。評価結果はオペランドスタック上に残る。
(4)
Map.put()メソッドを呼ぶ。
(5)
引数valueRequiredは、式の値が必要かどうかを表している。必要な場合は、必要であれば型変換し、オペランドスタックに値をのこしたままにする。不要な場合は、オペランドスタックから値をポップする。
(6)
生成したバイトコードと、ソースの対応位置を記録する。これは、デバッガなどが使用する情報になる。

MapInitializer

MapInitializerのresolveTypeの実装を示す。


	public TypeBinding resolveType(BlockScope scope) {
		constant = NotAConstant;
		if (alloc == null) {                                    (1)
			alloc = new AllocationExpression();
			final char[][] mapClass = {
				{ 'j', 'a', 'v', 'a' },
				{ 'u', 't', 'i', 'l' },
				{ 'H', 'a', 's', 'h', 'M', 'a', 'p' }
			};
			final long sourceRange = (((long) sourceStart) << 32) | sourceEnd;
			final long[] poss = { sourceRange, sourceRange, sourceRange };
			alloc.type = new QualifiedTypeReference(mapClass, poss);
			alloc.sourceStart = sourceStart;
			alloc.sourceEnd = sourceEnd;
			alloc.arguments = null;
			alloc.resolveType(scope);
			mapObj = alloc;
		}

		if (expressions != null) {                              (2)
			for (int i = 0; i < expressions.length; i++) {
				expressions[i].resolveType(scope);
			}
		}

		if (resolvedBinding == null) {                          (3)
			final char[][] mapClass = {
				{ 'j', 'a', 'v', 'a' },
				{ 'u', 't', 'i', 'l' },
				{ 'M', 'a', 'p' }
			};
			resolvedBinding = scope.getType(mapClass);
		}

		return resolvedBinding;
	}
(1)
HashMapインスタンスを生成するために、AllocationExpressionを借用している。これは、MapInitializerの内部でのみ使用するものなので、ASTのトラバースの対象とはならない。
(2)
子ノード(MapEntryExpression)の名前解決を行う。
(3)
MapInitializerの型としては、java.util.Mapを返す。

MapInitializeranalyseCodeは、無条件に子ノードを評価するだけなので、MapEntryExpression同様、次のような単純な実装となる。


	public FlowInfo analyseCode(
		BlockScope currentScope,
		FlowContext flowContext,
		FlowInfo flowInfo) {
		if (alloc != null) {
			flowInfo = alloc.analyseCode(currentScope, flowContext, flowInfo)
					.unconditionalInits();
		}
		if (expressions != null) {
			for (int i = 0; i < expressions.length; i++) {
				flowInfo = expressions[i].analyseCode(currentScope, flowContext, flowInfo)
						.unconditionalInits();
			}
		}
		return flowInfo;
	}

最後に、MapInitializergenerateCodeの実装を示す。


	public void generateCode(
		BlockScope currentScope,
		CodeStream codeStream,
		boolean valueRequired) {
		alloc.generateCode(currentScope, codeStream, true);     (1)
		// objref on operand stack
		if (expressions != null) {                              (2)
			for (int i = 0; i < expressions.length; i++) {
				expressions[i].generateCode(currentScope, codeStream, false);
			}
		}
		if (!valueRequired) {                                   (3)
			codeStream.pop();
		}
	}
(1)
HashMapインスタンスを生成するコード生成を、alloc(AllocationExpression)に委譲している。オペランドスタックに生成されたMapのオブジェクトリファレンスが積まれる。
(2)
子のMapEntryExpressionを呼び出し、Mapの要素をputしていく。この間、Mapのオブジェクトリファレンスは常にオペランドスタック上にある。
(3)
MapInitializerの式の値が不要であれば、オペランドスタック上のMapのオブジェクトリファレンスをポップする。

ビジターの変更

ASTをトラバースするビジターインターフェイス(org.eclipse.jdt.internal.compiler.IAbstractSyntaxTreeVisitor)に、上記の追加した二つのノードをvisitするメソッドを追加する。


	// Extention
	void endVisit(MapEntryExpression mapEntryExpression, BlockScope scope);
	boolean visit(MapEntryExpression mapEntryExpression, BlockScope scope);
	void endVisit(MapInitializer mapInitializer, BlockScope scope);
	boolean visit(MapInitializer mapInitializer, BlockScope scope);

上記のインターフェイスを実装したアダプター(org.eclipse.jdt.internal.compiler.AbstractSyntaxTreeVisitorAdapter)にも、メソッドを追加する。


	// Extention
	public void endVisit(MapEntryExpression mapEntryExpression, BlockScope scope) {
	}
	public boolean visit(MapEntryExpression mapEntryExpression, BlockScope scope) {
		return true;
	}
	public void endVisit(MapInitializer mapInitializer, BlockScope scope) {
	}
	public boolean visit(MapInitializer mapInitializer, BlockScope scope) {
		return true;
	}

コード変更のノウハウ

以下に、JDTのコンパイラを変更する際のノウハウをいくつか示す。

表 2. コード変更のノウハウ

表題詳細
org.eclipse.jdt.internal.compiler.lookup.TypeBindingの作り方org.eclipse.jdt.internal.compiler.lookup.BlockScope.getType()やgetJavaLangObject()など、getXxxメソッドを使う。
パーサーのスタック管理前述のようにorg.eclipse.jdt.internal.compiler.parser.Parserではいくつかのスタックを管理している。これらのスタックは、単純なスタックではなく論理的にはスタック(またはリスト)のスタックである。これを、一つのスタックと、そのスタック上に積まれた要素数のスタックとして実装している。

図 2. コンパイルに使用するASTの種類

eclipseのソースを読むにはeclipseを使うJDTを効率的に読むeclipseのコンパイラを参照。

Java構文拡張を組み込んだeclipseを動かす

前述の二つの構文拡張をeclipseに盛り込んでビルド&起動し、動作を確認する方法を以下に述べる。


Java構文拡張を組み込んだeclipseのビルド方法

前述のJava構文拡張を行うためのorg.eclipse.jdt.coreプラグインに対する差分ファイル(jdt-patch.zip)からeclipseをビルドする方法を述べる。

まず、文法定義ファイルからのコンパイル方法で述べたように、eclipse2.1のソースをフルビルドする。その後、次のようにして差分ファイルでJDTのソースを上書きする。


# cd ${eclipse}/plugins
# unzip /path/to/jdt-patch.zip

次に、新しい文法定義ファイルからjikesPGを使用してパーサーを生成し、結果をJDTのソースに盛り込む。下記のAntのプロパティを各自の環境に合わせて設定した後、次のコマンドを実行する。これにより、パーサーの生成文法定義ファイルからのコンパイル方法eclipseソースへの盛り込み文法定義ファイルからのコンパイル方法で述べた手順が自動的に実行される。

表 3. パーサー生成に設定が必要なAntプロパティ

プロパティ名設定すべき値
jdtcore.jar事前のフルビルドで出来上がったjdtcore.jarファイルへのパス。eclipse 2.1のフルビルド文法定義ファイルからのコンパイル方法参照。
jikespg.homejikesPGをインストールしたディレクトリへのパス。jikesPGの入手とインストール文法定義ファイルからのコンパイル方法参照。
jikespgjikespgコマンドへのパス。省略した場合は、${jikespg.home}/bin/jikespgが使用される。


# cd ${eclipse}/plugins/org.eclipse.jdt.core
# ant -f build-grammar.xml clean                          (1)
# ant -f build-grammar.xml                                (2)
# ant clean                                               (3)
# ant                                                     (3)
(1)
Parser.javaやITerminalSymbols.javaなど、jikesPGで生成されたファイルから派生するファイルを削除する。
(2)
jikesPGを実行し、生成されたファイルからParser.javaやITerminalSymbols.javaなどを生成する。
(3)
org.eclipse.jdt.coreプラグインを再ビルドするオプショナルな作業。この作業はデバッグ中などに行う。org.eclipse.jdt.coreプラグインに依存した他のプラグインも存在するので、最終的には、eclipse全体を再ビルドする必要がある。

最後に、文法定義ファイルからのコンパイル方法で述べたようにeclipse全体を再ビルドする。


動作確認

以下に動作確認用のコードを示す。J2SE1.4で追加されたassert文を使用しているので、eclipseを次のように設定して、1.4の機能を有効にする。 Window->PreferencesでPreferencesダイアログを開き、左側の設定項目のツリー表示から、 Java->Compilerを選ぶ。その後、右側のタブの中からCompliance and Classfilesタブを選び、Compiler compliance levelを1.4にし、Use default compliance settingsにチェックをつける。


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class Test {
	static void testOptimistic() {
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		try __optimistic__ {
			os.close();
			throw new Exception("error");
		}
		os = new ByteArrayOutputStream();
		try __optimistic__ {
			os.close();
			throw new Exception("error");
		} finally {
			System.out.println("fin1 ok");
			assert true;
		}
		try __optimistic__ {
			os.close();
			throw new IOException("error");
		} catch (IOException e) {
			System.out.println("IOE ok");
		} finally {
			System.out.println("fin2 ok");
			assert true;
		}
		try __optimistic__ {
			os.close();
			throw new Exception("error");
		} catch (IOException e) {
			assert false;
			throw new RuntimeException("error");
		} finally {
			System.out.println("fin3 ok");
			assert true;
		}
	}
	static void testMapInit() {
		Map a = %{
			"key" => "value",
			"key2" => new Integer(100*40),
			"abc" => null
		};
		assert a.size() == 3;
		System.out.println(a.get("key2"));
		assert a.get("abc") == null;
		assert new Integer(4000).equals(a.get("key2"));
		assert "xx".equals(%{"key" => "xx"}.get("key"));
		System.out.println(%{ "key2" => "vv"}.get("key2"));
		HashMap hm = (HashMap)%{ "a" => "a" + "key" + "value" };
		a = %{ null => null, };
		assert a.get(null) == null;
		a = %{ null => "1", };
		assert "1".equals(a.get(null));
		a = %{, };
		assert a.size() == 0;
		a = %{};
		assert a.size() == 0;
	}
	public static void main(String[] args) {
		testOptimistic();
		testMapInit();
		System.out.println("Everything is ok.");
	}
}

上記のコードをコンパイル&実行し、下記の出力が得られれば正しく動作している。


fin1 ok
IOE ok
fin2 ok
fin3 ok
4000
vv
Everything is ok.

また、ソースとeclipseにより生成された.classファイルを、次のようにJDK付属のデバッガ(jdb)を使用してステップ実行すると、デバッグ情報(バイトコードに対応する行番号)も正しく設定されていることが確認できる。


# jdb -classpath . -sourcepath .
jdb の初期化中です...
> stop in Test.main(java.lang.String[])
ブレークポイント Test.main(java.lang.String[]) を保留しています。
クラスがロードされた後に設定されます。
> run Test
 Test を実行します
uncaught java.lang.Throwable を設定しました
保留した uncaught java.lang.Throwable を設定しました
>
VM が起動しました: 保留した ブレークポイント Test.main(java.lang.String[]) を設定しました

ブレークポイントのヒット: "スレッド=main", Test.main(), line=64 bci=0
64              testOptimistic();

main[1] step
>
ステップ完了: "スレッド=main", Test.testOptimistic(), line=8 bci=0
8               ByteArrayOutputStream os = new ByteArrayOutputStream();
…

既知の問題

JDTでは、Javaの文法はorg.eclipse.jdt.internal.compiler.parserパッケージに集約されているわけではない。例えば、org.eclipse.jdt.core.dom.ASTConverter.convert(org.eclipse.jdt.internal.compiler.ast.TryStatement statement)では、次のような状況にある。

  1. このメソッドは、コンパイル用のorg.eclipse.jdt.internal.compiler.astパッケージのASTから、検査/エラー指摘用のorg.eclipse.jdt.core.domパッケージのASTに変換する。

  2. コンパイル用のAST(org.eclipse.jdt.internal.compiler.ast.*)ではトークンや非終端記号の位置を部分的に持っているが、検査/エラー指摘用のAST(org.eclipse.jdt.core.dom.*)ではより多くの位置情報が必要である。例えば、catch節の開始位置は、コンパイル用のASTにはないが、検査/エラー指摘用のASTには必要になる。

  3. 不足分の位置情報を取得するために、org.eclipse.jdt.core.dom.ASTConverter.convert()メソッドはorg.eclipse.jdt.core.dom.ASTConverter.retrieveStartingCatchPosition(int start, int end)メソッドを呼び出す。

  4. org.eclipse.jdt.core.dom.ASTConverter.retrieveStartingCatchPosition(int start, int end)メソッドは、文法定義とは無関係に、指定された範囲内にcatchトークンがあるか探す。(その際に使うスキャナーはコンパイル用のものを流用している)

このように、リファクタリングツール、エラー指摘/修正、コーディングアシスト、デバッガなどの機能には、文法に依存したコードが散在すると思われる。これらのコードも精査&修正しないと、最悪eclipseがフリーズする。実際、ブレークポイントを設定したり、次のコードのエラー個所を修正させようと何度か試みるとフリーズする。


		ByteArrayOutputStream os = new ByteArrayOutputStream();
		int x = 1000000000L;  // キャストが必要
		try __optimistic__ {
			os.close();
			throw new Exception("error");
		}

その他に、Map初期化子の構文中に、ユニコードシーケンスで書かれた%{やコメント中の%{があった場合、Map初期化子の開始位置を正しく判定できないという問題もある。


今回の構文拡張方法の限界

今回の構文拡張では、方針Java構文拡張で述べたように、JDTの構造に素直に従って拡張した。 そのため、JDTの構造に由来するいくつかの限界が存在する。

表 1. 構文拡張の限界

限界/制限理由
LALR(1)の文法でなくてはならない。パーサージェネレータjikesPGがLALR(1)しかサポートしていない。仮にLALR(1)で 表現できる文法でも、既存の文法定義を大きく変更しなければならない場合は、JDTの修正量が多く実現が難しい。
JDTに手を加えなければならない。JDTには、文法に関するエクステンションポイントが用意されていないので、 JDTのコードを直接変更する必要がある。
文法は動的に変更できないJDTのコンパイラを実行時に再構築/再ロードする仕組みが用意されていないので、 プラグインなどにより、実行時に文法を変えることはできない。
コンパイラのみの変更では安定動作しない文法に依存したコードが、デバッガやリファクタリングツールなどにも存在するため、それらもあわせて変更しないと、一貫性が損なわれ誤動作することがある。
テストが困難(推測)eclipseのCVSリポジトリにテストコードがあるので、それを利用することができる。しかし、文法変更の影響範囲がわからないため、とりあえずテストコードを実行して、テストに失敗した所を調べるという手順になると思われる。テストコードの変更個所もまた分散していると思われる。

pxmlをJDTに組み込める実装可能性

今回、新しい構文をJDTに組み込んでみた結果、pxmlを組み込む際の障害がいくつか明らかになった。 しかしながら、結論を先に述べると、多少pxmのl文法を変更することでpxmlをJDTに組み込むことは(開発工数を度外視すれば)十分可能と思われる。 以下、その障害と回避方法等の検討結果を述べる。


pxmlの文法がLALR(1)でない

jikesPGはLALR(1)の文法しかサポートしていない。JDTのJavaの既存の文法と合わせた場合、pxmlの文法がLALR(1)でないので、pxmlの文法をLALR(1)に変更しなければならない。


pxmlとJDTがスキャナーに求める要件の違い

pxmlの文法では、TagIdentifierから構成されるが、JDTで使用されているパーサーは キーワード("if"や"class"など)はIdentifierではなく、個別ににシンボルを割り当てられたトークンである。


# pxmlの文法
Tag: Identifier
	Identifier : Identifier
この点でpxmlのEPPによる実装と大きく異なる。 JDTでは下記のコードは、パース時点でif文と確定するが、EPPではメソッド呼び出しかif文か パース時点では曖昧である。

if(true);
XMLでJava(pxml)のキーワードをタグや属性名に使用する場合、JDTのパーサーではタグとして 認識されない。また、XMLでは"xml-valid.tag"もタグ名や属性名になりうる。

この問題を回避するにはいくつかの方法がある。

  1. Tagの構成要素にキーワードも含める。ただしこの方法では"xml-valid.tag"というタグ名には対応できない。"-"や"."が演算子扱いになってしまい、"-"や"."の前後にスペースがあった場合、エラーにできない。

  2. Tagの定義を次のように変更して、StringLiteralも書けるようにする。キーワードや"-"や"."を含む場合はStringLiteralとして記述する。

    
Tag: TagElement
    	TagElement : TagElement
    TagElement: Identifier
    	StringLiteral
    
    ただし、AtomTagか曖昧になるケースがある。したがって、 pxmlの文法を変更して曖昧性を取り除く必要がある。


JDTで文法はプラガブルでない

JDTでは、文法はプラガブルな可変なものになっていない。文法に依存したコードが分散している。そのため、文法の変更に伴って変更すべきところが多く、JDTのバージョンアップに対応して、毎回手を加えなければならない。開発工数や保守コストの点でマイナス要素となる。


本ドキュメントの生成方法

本ドキュメントは、DocBook XML 4.2で記述されており、HTML、Plain Text、PDF等の形式への変換が可能である。 変換には、XSLTを利用したツール(docbook-xsl)や、Linuxのディストリビューションに含まれるDSSSLを利用したツール(Open Jade, docbook2htmlなど)を利用することができる。


JDTファイルリスティング


plugins/org.eclipse.jdt.core
plugins/org.eclipse.jdt.core/build.xml
plugins/org.eclipse.jdt.core/compiler
plugins/org.eclipse.jdt.core/compiler/org
plugins/org.eclipse.jdt.core/compiler/org/eclipse
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser4.rsc
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/SourceConstructorDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/NLSLine.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser2.rsc
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredElement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredInitializer.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser5.rsc
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/TerminalTokens.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser3.rsc
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredType.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredField.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/SourceMethodDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredUnit.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser1.rsc
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredBlock.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredImport.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredLocalVariable.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/SourceFieldDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/ExceptionLabel.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/IntegerCache.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/MethodNameAndTypeCache.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CaseLabel.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/ResetStateForCodeGenerationVisitor.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/FloatCache.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/Opcodes.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/FieldNameAndTypeCache.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/Label.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CharArrayCache.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/AttributeNamesConstants.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/LongCache.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/DoubleCache.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/QualifiedNamesConstants.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/ObjectCache.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/DoubleConstant.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/ShortConstant.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/ByteConstant.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/BooleanConstant.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CharConstant.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/LongConstant.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/Constant.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/ITypeRequestor.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/StringConstant.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/ReferenceContext.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IntConstant.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/FloatConstant.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ImportReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Break.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ArrayAllocationExpression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/PostfixExpression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MagicLiteral.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SuperReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Block.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/BranchStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/EqualExpression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/WhileStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Case.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MessageSend.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Argument.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SynchronizedStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Reference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/OperatorExpression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CompoundAssignment.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedSuperReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AnonymousLocalTypeDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/OR_OR_Expression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/StringLiteral.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Statement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NameReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalTypeDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AbstractVariableDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedThisReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Clinit.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TryStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FloatLiteral.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AssertStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ClassLiteralAccess.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/PrefixExpression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Continue.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Expression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MemberTypeDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CharLiteral.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/OperatorIds.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/DefaultCase.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TrueLiteral.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/IfStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/DoubleLiteral.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LabeledStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ForStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FalseLiteral.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Initializer.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ThisReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LongLiteral.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReturnStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SingleTypeReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/DoStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ThrowStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/UnaryExpression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/InnerTypeDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NumberLiteral.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FieldReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AstNode.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ArrayReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/EmptyStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedTypeReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/IntLiteral.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SwitchStatement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ArrayInitializer.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AND_AND_Expression.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/IntLiteralMinValue.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AbstractMethodDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NullLiteral.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Assignment.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ArrayTypeReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ExtendedStringLiteral.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Literal.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ArrayQualifiedTypeReference.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LongLiteralMinValue.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ICompilerRequestor.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/InnerClassInfo.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/ClassFormatException.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/ClassFileReader.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/ClassFileStruct.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/ClassFileConstants.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/MethodInfo.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/FieldInfo.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeConstants.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LocalTypeBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Binding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeIds.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BaseTypeBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ProblemPackageBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MemberTypeBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InnerEmulationDependency.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ProblemReferenceBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/FieldBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TagBits.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SyntheticAccessMethodBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CompilerModifiers.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/VariableBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BaseTypes.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ArrayBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SyntheticFieldBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InvocationSite.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Scope.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ProblemMethodBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/PackageBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ImportBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BindingIds.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ProblemReasons.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ProblemFieldBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SyntheticArgumentBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ProblemBinding.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodScope.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/Util.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/HashtableOfObject.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/messages.properties
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/SimpleNameVector.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/HashtableOfLong.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/ObjectVector.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/CompoundNameVector.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/HashtableOfType.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/HashtableOfPackage.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/HashtableOfInt.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/ISourceType.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/INameEnvironment.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/ISourceField.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/IBinaryType.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/ISourceMethod.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/IGenericType.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/IBinaryNestedType.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/IBinaryField.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/IBinaryMethod.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/IGenericMethod.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/IDependent.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/IGenericField.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/ICompilationUnit.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/IConstants.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/NameEnvironmentAnswer.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/AbortType.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/AbortMethod.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemHandler.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/DefaultProblem.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/AbortCompilation.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ShouldNotImplement.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemSeverities.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/AbortCompilationUnit.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/IProblemFactory.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/DefaultErrorHandlingPolicies.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/InsideSubRoutineFlowContext.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/FlowContext.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/ConditionalFlowInfo.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/FlowInfo.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/SwitchFlowContext.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/FinallyFlowContext.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/ExceptionHandlingFlowContext.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/LabelFlowContext.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/InitializationFlowContext.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/SourceElementRequestorAdapter.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/IDebugRequestor.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/IErrorHandlingPolicy.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ISourceElementRequestor.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/IAbstractSyntaxTreeVisitor.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/Compiler.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ConfigurableOption.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/DocumentElementParser.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/SourceElementParser.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/IDocumentElementRequestor.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ClassFile.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/CompilationResult.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/AbstractSyntaxTreeVisitorAdapter.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/package.html
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CharOperation.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/InvalidInputException.java
plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
plugins/org.eclipse.jdt.core/search
plugins/org.eclipse.jdt.core/search/org
plugins/org.eclipse.jdt.core/search/org/eclipse
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/OrPathCombiner.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/SuperInterfaceReferencePattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/OrPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MultipleSearchPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/OrNameCombiner.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/TypeDeclarationPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/SearchPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchSet.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/DeclarationOfReferencedMethodsPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/TypeReferencePattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MethodReferencePattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/FieldDeclarationPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/DeclarationOfReferencedTypesPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchingOpenable.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment2.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/PotentialMatch.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/SuperTypeNamesCollector.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/FieldReferencePattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchingOpenableSet.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/PotentialMatchSet.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator2.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/SuperTypeReferencePattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/AndPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MethodPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/PackageDeclarationPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/ClasspathSourceDirectory.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/DeclarationOfAccessedFieldsPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/ConstructorDeclarationPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MethodDeclarationPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchingNodeSet.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/QualifiedTypeDeclarationPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/ConstructorReferencePattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/PackageReferencePattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/IIndexSearchRequestor.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/AbstractIndexer.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexManager.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/AddCompilationUnitToIndex.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/AddFolderToIndex.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/RemoveFromIndex.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/ReadWriteMonitor.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/SaveIndex.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/SourceIndexerRequestor.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IIndexConstants.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexRequest.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/BinaryIndexer.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/AddClassFileToIndex.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/RemoveFolderFromIndex.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/AddFileToIndex.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/SourceIndexer.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/IndexSelector.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/SubTypeSearchJob.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/processing
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/processing/JobManager.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/processing/IJob.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/IInfoConstants.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/PathCollector.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/IndexSearchAdapter.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/messages.properties
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/Util.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/HierarchyScope.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/PatternSearchJob.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/JavaWorkspaceScope.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/JavaSearchScope.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/AbstractSearchScope.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/IndexOutput.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/IIndexConstants.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/BlocksIndexOutput.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/Field.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/FileDocument.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/Index.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/BlocksIndexInput.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/IndexInput.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/Block.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/WordEntryHashedArray.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/SimpleIndexBlock.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/IndexSummary.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/JarFileDocument.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/IndexedFile.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/PropertyDocument.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/MergeFactory.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/WordEntry.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/JarFileEntryDocument.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/IndexerOutput.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/IndexedFileHashedArray.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/GammaCompressedIndexBlock.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/LRUCache.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/InMemoryIndex.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/SafeRandomAccessFile.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/CodeByteStream.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/SimpleIndexInput.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/FileListBlock.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/Util.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/ILRUCacheable.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/ICacheEnumeration.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/IndexBlock.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/IFileDocument.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/EntryResult.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/impl/Int.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/IDocument.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/IEntryResult.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/IQueryResult.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/DocumentFactory.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/IIndexer.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/IIndex.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/IIndexerOutput.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/core
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/ISearchPattern.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/IJavaSearchResultCollector.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/package.html
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/ITypeNameRequestor.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchEngine.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/IJavaSearchConstants.java
plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/IJavaSearchScope.java
plugins/org.eclipse.jdt.core/dom
plugins/org.eclipse.jdt.core/dom/org
plugins/org.eclipse.jdt.core/dom/org/eclipse
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BreakStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableBinding.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnitResolver.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ConditionalExpression.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IMethodBinding.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeLiteral.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SynchronizedStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodDeclaration.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperConstructorInvocation.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NullLiteral.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnonymousClassDeclaration.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnit.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleType.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingResolver.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ContinueStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayType.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationExpression.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ExpressionStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ClassInstanceCreation.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodInvocation.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CharacterLiteral.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayCreation.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperMethodInvocation.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ThisExpression.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/package.html
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayAccess.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Assignment.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NaiveASTFlattener.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CastExpression.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ThrowStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SwitchCase.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EmptyStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NumberLiteral.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PostfixExpression.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationFragment.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeDeclaration.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PrefixExpression.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IPackageBinding.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Type.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTVisitor.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ParenthesizedExpression.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Message.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Statement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PrimitiveType.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PackageDeclaration.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AssertStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/LabeledStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleName.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Block.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BodyDeclaration.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/InfixExpression.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IVariableBinding.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IBinding.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IfStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTNode.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperFieldAccess.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ReturnStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Javadoc.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/FieldDeclaration.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SingleVariableDeclaration.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DoStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/QualifiedName.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayInitializer.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TryStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ImportDeclaration.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodBinding.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeDeclarationStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTSyntaxErrorPropagator.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Initializer.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/WhileStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Modifier.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTMatcher.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BooleanLiteral.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PackageBinding.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SwitchStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Expression.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/FieldAccess.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ConstructorInvocation.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/StringLiteral.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclaration.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ForStatement.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CatchClause.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Name.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/InstanceofExpression.java
plugins/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ITypeBinding.java
plugins/org.eclipse.jdt.core/model
plugins/org.eclipse.jdt.core/model/org
plugins/org.eclipse.jdt.core/model/org/eclipse
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IFieldInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IClassFileAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IClassFileDisassembler.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/ILineNumberAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IConstantPool.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/package.html
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/ClassFormatException.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/ISourceAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/OpcodeStringValues.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IExceptionTableEntry.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IBytecodeVisitor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IInnerClassesAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IModifierConstants.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/ICodeAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IConstantPoolEntry.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/CompilationUnitSorter.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IClassFileReader.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IConstantValueAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/ClassFileBytesDisassembler.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/ILocalVariableAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/ByteCodeVisitorAdapter.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/ILocalVariableTableEntry.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IMethodInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IAttributeNamesConstants.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IConstantPoolConstant.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IInnerClassesAttributeEntry.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IExceptionAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/util/IOpcodeMnemonics.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMMethod.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMImport.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMNode.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/package.html
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMField.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMMember.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMPackage.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMFactory.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMCompilationUnit.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/DOMFactory.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/DOMException.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMType.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMInitializer.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IImportDeclaration.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IClasspathEntry.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IWorkingCopy.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ISourceReference.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IJavaElementDelta.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IOpenable.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IPackageFragmentRoot.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICodeCompletionRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/CorrectionEngine.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/compiler
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/compiler/IScanner.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/compiler/ITerminalSymbols.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ElementChangedEvent.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/NamingConventions.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IJavaModel.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IJavaElement.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IClasspathContainer.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IElementChangedListener.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IType.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ClasspathVariableInitializer.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IJavaProject.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICodeAssist.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IMethod.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/Flags.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IPackageFragment.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IJavaModelMarker.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/CompletionRequestorAdapter.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ClasspathContainerInitializer.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/eval
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/eval/IEvaluationContext.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/eval/package.html
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/eval/IGlobalVariable.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/eval/ICodeSnippetRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IProblemRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICorrectionRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ToolFactory.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IBuffer.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IPackageDeclaration.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IMember.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IImportContainer.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IClassFile.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICompilationUnit.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ITypeHierarchyChangedListener.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IParent.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IInitializer.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ITypeHierarchy.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICodeFormatter.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IBufferChangedListener.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IRegion.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaConventions.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ISourceManipulation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICompletionRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IJavaModelStatus.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/package.html
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ISourceRange.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IJavaModelStatusConstants.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IField.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IBufferFactory.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/Signature.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaModelException.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/core/BufferChangedEvent.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFile.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CreatePackageFragmentOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/InternalNamingConventions.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompilationUnitElementInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/CharArrayOps.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/IDumpable.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/ExceptionAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/LRUCache.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/AnonymousFileSource.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/ReferenceInfoAdapter.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/ToStringSorter.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Disassembler.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/SourceFileAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/ClassFileReader.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/ClassFileAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/LocalVariableTableEntry.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/ILRUCacheable.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Util.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/ClassFileStruct.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/ConstantPoolEntry.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/LineNumberAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/InnerClassesAttributeEntry.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/PublicScanner.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/FieldInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/ICacheEnumeration.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/ExceptionTableEntry.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/PerThreadObject.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/messages.properties
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/CharArrayBuffer.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/SimpleLookupTable.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Dumper.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/ConstantPool.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/DefaultBytecodeVisitor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/ConstantValueAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/LocalVariableAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/MethodInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/InnerClassesAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/CodeAttribute.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CreateTypeMemberOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/WorkingCopyElementInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/NameLookup.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/RegionBasedHierarchyBuilder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyType.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyBinaryType.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyBuilder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IHierarchyRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/Region.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CopyResourceElementsOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/MoveResourceElementsOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BufferManager.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CreateElementInCUOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ModelUpdater.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/IncrementalImageBuilder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ImageBuilderInternalException.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/JavaBuilder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/AdditionalTypeCollection.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/BatchImageBuilder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/AbstractImageBuilder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/State.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/BuildNotifier.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ProblemFactory.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathLocation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/AbortIncrementalBuildException.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/MissingClassFileException.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJar.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/SourceFile.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ReferenceCollection.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/WorkQueue.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/MissingSourceFileException.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaElement.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/OverflowingLRUCache.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CreateFieldOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CreateTypeOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryField.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryMember.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRootInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/eval
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/eval/RequestorWrapper.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/eval/GlobalVariableWrapper.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProject.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/DOMCompilationUnit.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/DOMMethod.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/DOMBuilder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/DOMImport.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/ILineStartFinder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/DOMMember.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/DOMType.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/SiblingEnumeration.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/DOMNode.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/SimpleDOMBuilder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/DOMField.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/DOMPackage.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/AbstractDOMBuilder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/CompilationUnit.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/jdom/DOMInitializer.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceTypeElementInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/MoveElementsOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaElementInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/OpenableElementInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/PackageFragment.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMethodElementInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SingleTypeRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironmentRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompilationUnitVisitor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/HandleFactory.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CreateInitializerOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/IJavaElementRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SortElementsOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CreateWorkingCopyOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelCache.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/MemberElementInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/TypeConverter.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/TypeVector.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SortElementBuilder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CreatePackageDeclarationOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileWorkingCopy.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModel.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CopyElementsOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMapper.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CopyPackageFragmentRootOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CreateCompilationUnitOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/Openable.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/INamingRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ImportContainer.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeleteElementsOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/Util.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceFieldElementInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/Initializer.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DestroyWorkingCopyOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BatchOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompilationUnitProblemFinder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompilationUnit.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaElementRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeletePackageFragmentRootOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/RenameResourceElementsOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceType.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/Buffer.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/MovePackageFragmentRootOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/PackageFragmentInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarEntryFile.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceRefElement.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/LRUCacheEnumerator.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/MultiOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/Member.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/PackageFragmentRootInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/RenameElementsOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/FailedReconciliationException.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelStatus.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BufferCache.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragment.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/Assert.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceRange.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SortJavaElement.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompletionRequestorWrapper.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CommitWorkingCopyOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ReconcileWorkingCopyOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BasicCompilationUnit.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClasspathEntry.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CreateImportOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CreateTypeHierarchyOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/messages.properties
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFileInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CreateMethodOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaElementDeltaBuilder.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/IPathRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaElementDelta.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/PackageFragmentRoot.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryType.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SelectionRequestor.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeleteResourceElementsOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ImportDeclaration.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BinaryMethod.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ElementCache.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProjectElementInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMethod.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/PackageDeclaration.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SetClasspathOperation.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/WorkingCopy.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceField.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceRefElementInfo.java
plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/InitializerElementInfo.java
plugins/org.eclipse.jdt.core/codeassist
plugins/org.eclipse.jdt.core/codeassist/org
plugins/org.eclipse.jdt.core/codeassist/org/eclipse
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnArgumentName.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnLocalName.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnSuperReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnExplicitConstructorCall.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnPackageReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnSingleTypeReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnSingleNameReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnFieldType.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedSuperReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedTypeReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnMessageSend.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnFieldReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedNameReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnQualifiedAllocationExpression.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionNodeFound.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionScanner.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionOnImportReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedAllocationExpression.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/InvalidCursorLocation.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnFieldName.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnLocalName.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword1.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedInterfaceReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword2.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword3.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedExceptionReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleTypeReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedClassReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMessageSend.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnExplicitConstructorCall.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnInterfaceReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnPackageReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnSingleNameReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodReturnType.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMemberAccess.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionNodeDetector.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionNodeFound.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnMethodName.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionScanner.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnExceptionReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnFieldType.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnClassLiteralAccess.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedTypeReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnImportReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnClassReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnArgumentName.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedNameReference.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/Keywords.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/Engine.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistOptions.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/ISearchRequestor.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/ISearchableNameEnvironment.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/RelevanceConstants.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/ISelectionRequestor.java
plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java
plugins/org.eclipse.jdt.core/scripts
plugins/org.eclipse.jdt.core/scripts/export-batch-jdtcom.xml
plugins/org.eclipse.jdt.core/scripts/buildExtraJars.xml
plugins/org.eclipse.jdt.core/scripts/exportplugin.xml
plugins/org.eclipse.jdt.core/about.html
plugins/org.eclipse.jdt.core/grammar
plugins/org.eclipse.jdt.core/grammar/java_1_4.g
plugins/org.eclipse.jdt.core/grammar/java_1_5.g
plugins/org.eclipse.jdt.core/eval
plugins/org.eclipse.jdt.core/eval/org
plugins/org.eclipse.jdt.core/eval/org/eclipse
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetParser.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetMessageSend.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetQualifiedNameReference.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/IRequestor.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetClassFile.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetSkeleton.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetCodeStream.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetScope.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/VariablesInfo.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetFieldReference.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/EvaluationContext.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/GlobalVariable.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetThisReference.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/VariablesEvaluator.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetCompiler.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetConstantPool.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetEnvironment.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetSuperReference.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/EvaluationResult.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetToCuMapper.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetEvaluator.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetTypeDeclaration.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetAllocationExpression.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/InstallException.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/EvaluationConstants.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetReturnStatement.java
plugins/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/Evaluator.java
plugins/org.eclipse.jdt.core/antadapter
plugins/org.eclipse.jdt.core/antadapter/org
plugins/org.eclipse.jdt.core/antadapter/org/eclipse
plugins/org.eclipse.jdt.core/antadapter/org/eclipse/jdt
plugins/org.eclipse.jdt.core/antadapter/org/eclipse/jdt/core
plugins/org.eclipse.jdt.core/antadapter/org/eclipse/jdt/core/JDTCompilerAdapter.java
plugins/org.eclipse.jdt.core/build.properties
plugins/org.eclipse.jdt.core/batch
plugins/org.eclipse.jdt.core/batch/org
plugins/org.eclipse.jdt.core/batch/org/eclipse
plugins/org.eclipse.jdt.core/batch/org/eclipse/jdt
plugins/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal
plugins/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler
plugins/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch
plugins/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/CompilationUnit.java
plugins/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
plugins/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java
plugins/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/FileSystem.java
plugins/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/FileFinder.java
plugins/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.java
plugins/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.java
plugins/org.eclipse.jdt.core/plugin.xml
plugins/org.eclipse.jdt.core/schema
plugins/org.eclipse.jdt.core/schema/classpathVariableInitializer.exsd
plugins/org.eclipse.jdt.core/schema/classpathContainerInitializer.exsd
plugins/org.eclipse.jdt.core/schema/codeFormatter.exsd
plugins/org.eclipse.jdt.core/formatter
plugins/org.eclipse.jdt.core/formatter/org
plugins/org.eclipse.jdt.core/formatter/org/eclipse
plugins/org.eclipse.jdt.core/formatter/org/eclipse/jdt
plugins/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal
plugins/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter
plugins/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/options.properties
plugins/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/impl
plugins/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/impl/FormatterOptions.java
plugins/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/impl/SplitLine.java
plugins/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/CodeFormatter.java
plugins/org.eclipse.jdt.core/notes
plugins/org.eclipse.jdt.core/notes/R20_buildnotes_jdt-core.html
plugins/org.eclipse.jdt.core/plugin.jars
plugins/org.eclipse.jdt.core/.classpath
plugins/org.eclipse.jdt.core/plugin.properties
plugins/org.eclipse.jdt.core/.project
plugins/org.eclipse.jdt.core/.options
plugins/org.eclipse.jdt.core/buildnotes_jdt-core.html