Eclipse/プラグイン開発のTIPS集/ソースコードを解析するパーサASTParser
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
**ASTParserとは [#e7a29459]
さてさて、いままでEclipseのウィジェットとか、リスナーとか...
ASTParserはパッケージエクスプローラなどに表示されているJa...
**やってみる [#nd9bad95]
触ってみましょう。ソースコード情報はパッケージエクスプロ...
package nu.mine.kino.plugin.astsampless;
import java.util.Iterator;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.Javadoc;
import org.eclipse.jdt.core.dom.TagElement;
/**
* Javaソースを解析するリーダーです。
*
* @author Masatomi KINO
* @version $Revision$
*/
public class SourceReader {
private static final Logger logger = Logger.getLogger(...
private final ICompilationUnit element;
public SourceReader(ICompilationUnit element) {
this.element = element;
}
/**
* 渡されたソースコードの解析を行います。
*/
public void read() {
logger.debug("read() - start");
ASTParser parser = ASTParser.newParser(AST.JLS3);
// parser.setResolveBindings(true);
parser.setSource(element);
CompilationUnit unit = (CompilationUnit) parser
.createAST(new NullProgressMonitor());
unit.accept(new ASTVisitorImpl());
logger.debug("ファイル名: " + element.getElementName...
String sourceName = element.getElementName().substri...
element.getElementName().lastIndexOf("."));
logger.debug("クラス名: " + sourceName);
logger.debug("クラスの完全修飾クラス名: "
+ element.getType(sourceName).getFullyQualifiedName...
logger.debug("パッケージ名: " + element.getParent()....
logger.debug("read() - end");
}
/**
* ソースを走査するVisitorの実装クラスです。
*
* @author Masatomi KINO
* @version $Revision$
*/
class ASTVisitorImpl extends ASTVisitor {
private final Logger logger = Logger.getLogger(ASTVi...
public boolean visit(Javadoc node) {
logger.debug("visit(Javadoc) - start");
logger.debug(node);
Iterator iterator = node.tags().iterator();
while (iterator.hasNext()) {
TagElement element = (TagElement) iterator.next();
logger.debug("型:" + element.getClass().getName(...
logger.debug("tagname: " + element.getTagName());
logger.debug(element);
}
logger.debug("visit(Javadoc) - end");
return super.visit(node);
}
}
}
このリーダは、コンストラクタでわたってくるJavaソースモデ...
ここで実際に解析を行っているのが、
-org.eclipse.jdt.core.dom.ASTParser;
-org.eclipse.jdt.core.dom.ASTVisitor;
です。ASTParserはJavaのソースを、コード部分やコメント部分...
class ASTVisitorImpl extends ASTVisitor {
private final Logger logger = Logger.getLogger(ASTVisi...
public boolean visit(Javadoc node) {
logger.debug("visit(Javadoc) - start");
logger.debug(node);
Iterator iterator = node.tags().iterator();
while (iterator.hasNext()) {
TagElement element = (TagElement) iterator.next();
logger.debug("型:" + element.getClass().getName());
logger.debug("tagname: " + element.getTagName());
logger.debug(element);
}
logger.debug("visit(Javadoc) - end");
return super.visit(node);
}
}
となっていて、ここではJavaDoc要素に関する処理だけを実装し...
***ICompilationUnit(ソースコード)から情報を得る [#g0545711]
また、コンストラクタで渡されるICompilationUnitからも情報...
logger.debug("ファイル名: " + element.getElementName());...
String sourceName = element.getElementName().substring(0,
element.getElementName().lastIndexOf("."));
logger.debug("クラス名: " + sourceName);
logger.debug("クラスの完全修飾クラス名: "
+ element.getType(sourceName).getFullyQualifiedName());
logger.debug("パッケージ名: " + element.getParent().getE...
あたりですね。elementがICompilationUnitのインスタンスです...
ファイル名: BL.java
クラス名: BL
クラスの完全修飾クラス名: nu.mine.kino.BL
パッケージ名: nu.mine.kino
ただ 完全修飾クラス名 を取得するメソッドは、そのファイル...
この辺の(ASTParserでなく)ICompilationUnit周りは [[Javaプ...
**ソースを渡して、解析させてみる [#y654fc7d]
ソースを渡すのは拡張ポイント使ってなんとでもできるんで後...
-サンプル
package nu.mine.kino;
import java.util.Date;
import java.util.List;
/**
* クラスコメントです。
* クラスのコメントを記述しています。
* @author m-kino
* @see java.lang.String
*
*/
public class TestMain {
public static void main(String[] args) {
Date date = new Date();
List list = null;
System.out.println("Main.");
}
/**
* helloメソッドのJavaDocコメントです。
* 改行してみた
* @return 文字列。
* @param name 名前。
*/
public String hello(String name) {
System.out.println("Hello "+ name +" .");
return "Hello "+ name +" .";
}
/*
* hello2メソッドのJavaDocコメントです。
* 改行してみた
* @return 文字列。
* @param name 名前。
*/
public String hello2(String name) {
System.out.println("Hello "+ name +" .");
return "Hello "+ name +" .";
}
}
***実行結果 [#p8538c5a]
実行結果は以下のようになりました。
[main] DEBUG - visit(Javadoc) - start
[main] DEBUG - /**
* クラスコメントです。
* クラスのコメントを記述しています。
* @author m-kino
* @see java.lang.String
*/
[main] DEBUG - 型:org.eclipse.jdt.core.dom.TagElement
[main] DEBUG - tagname: null
[main] DEBUG -
* クラスコメントです。
* クラスのコメントを記述しています。
[main] DEBUG - 型:org.eclipse.jdt.core.dom.TagElement
[main] DEBUG - tagname: @author
[main] DEBUG -
* @author m-kino
[main] DEBUG - 型:org.eclipse.jdt.core.dom.TagElement
[main] DEBUG - tagname: @see
[main] DEBUG -
* @see java.lang.String
[main] DEBUG - visit(Javadoc) - end
[main] DEBUG - visit(Javadoc) - start
[main] DEBUG - /**
* helloメソッドのJavaDocコメントです。
* 改行してみた
* @return 文字列。
* @param name 名前。
*/
[main] DEBUG - 型:org.eclipse.jdt.core.dom.TagElement
[main] DEBUG - tagname: null
[main] DEBUG -
* helloメソッドのJavaDocコメントです。
* 改行してみた
[main] DEBUG - 型:org.eclipse.jdt.core.dom.TagElement
[main] DEBUG - tagname: @return
[main] DEBUG -
* @return 文字列。
[main] DEBUG - 型:org.eclipse.jdt.core.dom.TagElement
[main] DEBUG - tagname: @param
[main] DEBUG -
* @param name 名前。
[main] DEBUG - visit(Javadoc) - end
[main] DEBUG nu.mine.kino.plugin.astsampless.SourceReade...
[main] DEBUG nu.mine.kino.plugin.astsampless.SampleActio...
[main] DEBUG nu.mine.kino.plugin.astsampless.SampleActio...
この結果から、以下のようになってることがわかりますね。
-JavaDocひとつが、org.eclipse.jdt.core.dom.Javadoc インス...
-コメント
/**
* クラスコメントです。
* クラスのコメントを記述しています。
* @author m-kino
* @see java.lang.String
*/
は
* クラスコメントです。
* クラスのコメントを記述しています。
と
* @author m-kino
と
* @see java.lang.String
に分割される。この分割されたオブジェクトはorg.eclipse.jdt...
**ASTVisitorの他のメソッドもOverrideしてみる [#ac5dfaa4]
ASTVisitorには他のメソッドたとえば
public boolean visit(ImportDeclaration node);
などOverrideできる物がたくさんあります。これらをOverride...
***ImportDeclaration [#j85c5cae]
インポート文を表現するクラスですね。
public boolean visit(ImportDeclaration node) {
logger.debug("ImportDeclaration: " + node.getName());
return super.visit(node);
}
の実行結果は以下の通り。
[main] DEBUG - ImportDeclaration: java.util.Date
[main] DEBUG - ImportDeclaration: java.util.List
一つのimport文に対して一回 public boolean visit(ImportDec...
logger.debug("ImportDeclaration: " + node);
とするとimport xxxx; のimportまで取得可能です。
***PackageDeclaration [#nd74c8d6]
パッケージを表現するクラスですね。
実行結果は以下の通り。
[main] - PackageDeclaration: nu.mine.kino
パッケージ名が取得できました。
ちなみに
logger.debug("PackageDeclaration: " + node);
とするとpackage nu.mine.kino; のpackageまで取得可能です。
**コンテンツ一覧 [#m1338e28]
#ls2
**関連リンク [#pc0a258d]
-Eclipse/プラグイン開発のTIPS集/Javaプロジェクトを操作する
-[[EclipseのASTParserを試す>http://www-06.ibm.com/jp/deve...
-[[各種のJavaエレメントを取得する>http://www13.plala.or.j...
-[[JavaDocのパースはこちらの方がよいような..>Java/XJavaDo...
-[[Abstract Syntax Tree>http://www.eclipse.org/articles/A...
-[[org.eclipse.stp.sc.common.utils.JDTUtilsのソースコード...
-[[/trunk/org.jalcedo.client.ui/src/org/jalcedo/client/ui...
-[[Eclipseプラグイン開発: 型の仲間達(サブクラス,スーパー...
-[[Java > Open Source Codes > org > eclipse > jdt > inter...
-[[EclipseでAPTするには! - okazukiの日記>http://d.hatena...
----
この記事は
#vote(おもしろかった[10],そうでもない[3])
- すてきな記事。 -- [[いがぴょん]] &new{2019-04-05 (金) 1...
- ありがとうございます。。記事自体はもう、、数年前に書い...
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
終了行:
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
**ASTParserとは [#e7a29459]
さてさて、いままでEclipseのウィジェットとか、リスナーとか...
ASTParserはパッケージエクスプローラなどに表示されているJa...
**やってみる [#nd9bad95]
触ってみましょう。ソースコード情報はパッケージエクスプロ...
package nu.mine.kino.plugin.astsampless;
import java.util.Iterator;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.Javadoc;
import org.eclipse.jdt.core.dom.TagElement;
/**
* Javaソースを解析するリーダーです。
*
* @author Masatomi KINO
* @version $Revision$
*/
public class SourceReader {
private static final Logger logger = Logger.getLogger(...
private final ICompilationUnit element;
public SourceReader(ICompilationUnit element) {
this.element = element;
}
/**
* 渡されたソースコードの解析を行います。
*/
public void read() {
logger.debug("read() - start");
ASTParser parser = ASTParser.newParser(AST.JLS3);
// parser.setResolveBindings(true);
parser.setSource(element);
CompilationUnit unit = (CompilationUnit) parser
.createAST(new NullProgressMonitor());
unit.accept(new ASTVisitorImpl());
logger.debug("ファイル名: " + element.getElementName...
String sourceName = element.getElementName().substri...
element.getElementName().lastIndexOf("."));
logger.debug("クラス名: " + sourceName);
logger.debug("クラスの完全修飾クラス名: "
+ element.getType(sourceName).getFullyQualifiedName...
logger.debug("パッケージ名: " + element.getParent()....
logger.debug("read() - end");
}
/**
* ソースを走査するVisitorの実装クラスです。
*
* @author Masatomi KINO
* @version $Revision$
*/
class ASTVisitorImpl extends ASTVisitor {
private final Logger logger = Logger.getLogger(ASTVi...
public boolean visit(Javadoc node) {
logger.debug("visit(Javadoc) - start");
logger.debug(node);
Iterator iterator = node.tags().iterator();
while (iterator.hasNext()) {
TagElement element = (TagElement) iterator.next();
logger.debug("型:" + element.getClass().getName(...
logger.debug("tagname: " + element.getTagName());
logger.debug(element);
}
logger.debug("visit(Javadoc) - end");
return super.visit(node);
}
}
}
このリーダは、コンストラクタでわたってくるJavaソースモデ...
ここで実際に解析を行っているのが、
-org.eclipse.jdt.core.dom.ASTParser;
-org.eclipse.jdt.core.dom.ASTVisitor;
です。ASTParserはJavaのソースを、コード部分やコメント部分...
class ASTVisitorImpl extends ASTVisitor {
private final Logger logger = Logger.getLogger(ASTVisi...
public boolean visit(Javadoc node) {
logger.debug("visit(Javadoc) - start");
logger.debug(node);
Iterator iterator = node.tags().iterator();
while (iterator.hasNext()) {
TagElement element = (TagElement) iterator.next();
logger.debug("型:" + element.getClass().getName());
logger.debug("tagname: " + element.getTagName());
logger.debug(element);
}
logger.debug("visit(Javadoc) - end");
return super.visit(node);
}
}
となっていて、ここではJavaDoc要素に関する処理だけを実装し...
***ICompilationUnit(ソースコード)から情報を得る [#g0545711]
また、コンストラクタで渡されるICompilationUnitからも情報...
logger.debug("ファイル名: " + element.getElementName());...
String sourceName = element.getElementName().substring(0,
element.getElementName().lastIndexOf("."));
logger.debug("クラス名: " + sourceName);
logger.debug("クラスの完全修飾クラス名: "
+ element.getType(sourceName).getFullyQualifiedName());
logger.debug("パッケージ名: " + element.getParent().getE...
あたりですね。elementがICompilationUnitのインスタンスです...
ファイル名: BL.java
クラス名: BL
クラスの完全修飾クラス名: nu.mine.kino.BL
パッケージ名: nu.mine.kino
ただ 完全修飾クラス名 を取得するメソッドは、そのファイル...
この辺の(ASTParserでなく)ICompilationUnit周りは [[Javaプ...
**ソースを渡して、解析させてみる [#y654fc7d]
ソースを渡すのは拡張ポイント使ってなんとでもできるんで後...
-サンプル
package nu.mine.kino;
import java.util.Date;
import java.util.List;
/**
* クラスコメントです。
* クラスのコメントを記述しています。
* @author m-kino
* @see java.lang.String
*
*/
public class TestMain {
public static void main(String[] args) {
Date date = new Date();
List list = null;
System.out.println("Main.");
}
/**
* helloメソッドのJavaDocコメントです。
* 改行してみた
* @return 文字列。
* @param name 名前。
*/
public String hello(String name) {
System.out.println("Hello "+ name +" .");
return "Hello "+ name +" .";
}
/*
* hello2メソッドのJavaDocコメントです。
* 改行してみた
* @return 文字列。
* @param name 名前。
*/
public String hello2(String name) {
System.out.println("Hello "+ name +" .");
return "Hello "+ name +" .";
}
}
***実行結果 [#p8538c5a]
実行結果は以下のようになりました。
[main] DEBUG - visit(Javadoc) - start
[main] DEBUG - /**
* クラスコメントです。
* クラスのコメントを記述しています。
* @author m-kino
* @see java.lang.String
*/
[main] DEBUG - 型:org.eclipse.jdt.core.dom.TagElement
[main] DEBUG - tagname: null
[main] DEBUG -
* クラスコメントです。
* クラスのコメントを記述しています。
[main] DEBUG - 型:org.eclipse.jdt.core.dom.TagElement
[main] DEBUG - tagname: @author
[main] DEBUG -
* @author m-kino
[main] DEBUG - 型:org.eclipse.jdt.core.dom.TagElement
[main] DEBUG - tagname: @see
[main] DEBUG -
* @see java.lang.String
[main] DEBUG - visit(Javadoc) - end
[main] DEBUG - visit(Javadoc) - start
[main] DEBUG - /**
* helloメソッドのJavaDocコメントです。
* 改行してみた
* @return 文字列。
* @param name 名前。
*/
[main] DEBUG - 型:org.eclipse.jdt.core.dom.TagElement
[main] DEBUG - tagname: null
[main] DEBUG -
* helloメソッドのJavaDocコメントです。
* 改行してみた
[main] DEBUG - 型:org.eclipse.jdt.core.dom.TagElement
[main] DEBUG - tagname: @return
[main] DEBUG -
* @return 文字列。
[main] DEBUG - 型:org.eclipse.jdt.core.dom.TagElement
[main] DEBUG - tagname: @param
[main] DEBUG -
* @param name 名前。
[main] DEBUG - visit(Javadoc) - end
[main] DEBUG nu.mine.kino.plugin.astsampless.SourceReade...
[main] DEBUG nu.mine.kino.plugin.astsampless.SampleActio...
[main] DEBUG nu.mine.kino.plugin.astsampless.SampleActio...
この結果から、以下のようになってることがわかりますね。
-JavaDocひとつが、org.eclipse.jdt.core.dom.Javadoc インス...
-コメント
/**
* クラスコメントです。
* クラスのコメントを記述しています。
* @author m-kino
* @see java.lang.String
*/
は
* クラスコメントです。
* クラスのコメントを記述しています。
と
* @author m-kino
と
* @see java.lang.String
に分割される。この分割されたオブジェクトはorg.eclipse.jdt...
**ASTVisitorの他のメソッドもOverrideしてみる [#ac5dfaa4]
ASTVisitorには他のメソッドたとえば
public boolean visit(ImportDeclaration node);
などOverrideできる物がたくさんあります。これらをOverride...
***ImportDeclaration [#j85c5cae]
インポート文を表現するクラスですね。
public boolean visit(ImportDeclaration node) {
logger.debug("ImportDeclaration: " + node.getName());
return super.visit(node);
}
の実行結果は以下の通り。
[main] DEBUG - ImportDeclaration: java.util.Date
[main] DEBUG - ImportDeclaration: java.util.List
一つのimport文に対して一回 public boolean visit(ImportDec...
logger.debug("ImportDeclaration: " + node);
とするとimport xxxx; のimportまで取得可能です。
***PackageDeclaration [#nd74c8d6]
パッケージを表現するクラスですね。
実行結果は以下の通り。
[main] - PackageDeclaration: nu.mine.kino
パッケージ名が取得できました。
ちなみに
logger.debug("PackageDeclaration: " + node);
とするとpackage nu.mine.kino; のpackageまで取得可能です。
**コンテンツ一覧 [#m1338e28]
#ls2
**関連リンク [#pc0a258d]
-Eclipse/プラグイン開発のTIPS集/Javaプロジェクトを操作する
-[[EclipseのASTParserを試す>http://www-06.ibm.com/jp/deve...
-[[各種のJavaエレメントを取得する>http://www13.plala.or.j...
-[[JavaDocのパースはこちらの方がよいような..>Java/XJavaDo...
-[[Abstract Syntax Tree>http://www.eclipse.org/articles/A...
-[[org.eclipse.stp.sc.common.utils.JDTUtilsのソースコード...
-[[/trunk/org.jalcedo.client.ui/src/org/jalcedo/client/ui...
-[[Eclipseプラグイン開発: 型の仲間達(サブクラス,スーパー...
-[[Java > Open Source Codes > org > eclipse > jdt > inter...
-[[EclipseでAPTするには! - okazukiの日記>http://d.hatena...
----
この記事は
#vote(おもしろかった[10],そうでもない[3])
- すてきな記事。 -- [[いがぴょん]] &new{2019-04-05 (金) 1...
- ありがとうございます。。記事自体はもう、、数年前に書い...
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
ページ名: