ソースコードにコードを挿入するプラグインを作ってて、クラスパスの状態によって処理を切り替えたいような状況がありました。 具体的には操作する対象のJavaProject?に、あるjarへのパスが通ってたら、正確にはあるクラスが利用可能なクラスパス設定ならば、そのクラスに依存するコードを挿入する、そうでないパス設定の場合は標準Java APIのコードを挿入する、なんて事がやりたくて、Eclipse JDTのSearchEngine?関連を調べてみました。SearchEngine?はEclipse内でクラスやインタフェースなどを検索する機構なので、そのプロジェクト内でクラス検索をすればよいかななんて思ったわけですね。 やってみる †IJavaProject javaProject = javaElements[0].getJavaProject(); String prefix = "org.apache.commons.lang.builder.ToStringBuilder"; // 検索対象は、IJavaProjectのルートにあるモノ全部。 // (jarとかsrcディレクトリとか、外部のパスが通ってるjarとか) IJavaSearchScope scope = SearchEngine .createJavaSearchScope(new IJavaElement[] { javaProject }); // プロジェクト内のソースや、jar(外部のも)が検索対象。 // クラス検索やり方1。 // new SearchEngine().searchを使う場合はフックするクラスはSearchRequestor。 SearchRequestor requestor = new SearchRequestor() { public void acceptSearchMatch(SearchMatch match) throws CoreException { Object javaElement = match.getElement(); System.out.println(javaElement); if (javaElement instanceof IType) { IType type = (IType) javaElement; String typeName = type.getFullyQualifiedName(); } } }; // http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.jdt.doc.isv/ reference/api/org/eclipse/jdt/core/search/class-use/SearchPattern.html // 例として、prefixはクラス名の場合は、java.lang.Objectとか、Runnableとか、List<String> // とか、らしい。 SearchPattern pattern = SearchPattern.createPattern(prefix, IJavaSearchConstants.CLASS, // クラスだけ。 IJavaSearchConstants.DECLARATIONS, // 宣言を探す。 SearchPattern.R_EXACT_MATCH); // 正確にマッチ。 SearchParticipant participant = SearchEngine .getDefaultSearchParticipant(); new SearchEngine().search(pattern, new SearchParticipant[] { participant }, scope, requestor, monitor); // ////////// // クラス検索やり方2。 // new // SearchEngine().searchAllTypeNamesを使う場合はフックするクラスはTypeNameRequestor。 TypeNameRequestor nameRequestor = new TypeNameRequestor() { public void acceptType(int modifiers, char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path) { System.out.println("------"); System.out.println(new String(packageName)); System.out.println(new String(simpleTypeName)); for (int j = 0; j < enclosingTypeNames.length; j++) { System.out.println(new String(enclosingTypeNames[j])); } System.out.println(path); System.out.println("------"); } }; String pkg = "org.apache.commons.lang.builder"; String clazzName = "ToStringBuilder"; new SearchEngine().searchAllTypeNames(pkg.toCharArray(), SearchPattern.R_EXACT_MATCH, clazzName.toCharArray(), SearchPattern.R_EXACT_MATCH, IJavaSearchConstants.CLASS, scope, nameRequestor, IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, monitor); 関連リンク †
この記事は 現在のアクセス:8326 |