2012-03-28 16 views
2

JDT ASTParserを使用する方法はありますか?メソッド宣言がAnonymous内部クラスの内部にあるかどうかを確認できますか?MethodDeclarationが内部クラスに属するかどうかを確認する方法

私はEclipseプラグインを作成して、プロジェクトで未使用のパブリックメソッドを探しています。私はMethodDeclarationノードでASTVisitorを使い、JDT検索を使っています。問題は、各Javaクラスをトラバースしながら、リスナーのような匿名の内部クラスのMethodDeclarationを訪れていることです。私はこれらの方法を避ける必要があります。

ありがとうございます。

+0

この匿名クラスでメソッドを使用する場合はどうなりますか?それが見えない場合は、メソッドが死んだと考えるかもしれません。私はあなたが内部クラスをスキップしたくないと思う。 –

+0

私は内部クラスを検索範囲外に移動しません。実際に私はプロジェクトをループし、特定の命名標準に準拠したJavaファイルを取得しています。私はASTParserを使ってこれらのファイルを解析し、パブリックメソッドをリストアップしています。次に、ワークスペース全体をスコープとして各メソッドの参照検索を実行します。私の要件は、私は使用しているファイルがActionListeners、SelectionListenersなどを内部クラスとして持つように、内部クラス内のメソッドの参照検索を実行する必要はありません。 –

+0

'node.getParent()。getParent()。getNodeType()== ASTNode.CLASS_INSTANCE_CREATION'を使用して、メソッドが内部クラスに対応するかどうかを確認できました。しかし、これがすべての場合に機能するかどうかは不明です。スティルが答えを得る... –

答えて

1

最後に解決策が見つかりました。 ASTParserには、Javaファイル内の匿名の内部クラスを表すAnonymousClassDeclaration ASTNodeがあります。そのようなノードにアクセスするとき、これらのノードを完全に訪問する必要はない(falseを返すことによって)ことができます。

public boolean visit(AnonymousClassDeclaration classDeclarationStatement) { 

     return false; 

    } 
1

CLASS_INSTANCE_CREATIONが匿名クラスのノードのタイプであれば、それはうまくいくはずです。私はJavaの専門家ではありません。私には匿名クラスを作成するいくつかの方法があるようですので、このノードタイプですべてをカバーする必要があるかどうかチェックする必要があります。

...あなたの匿名リスナー(?)クラスはリスナーインターフェイスを継承/実装する必要はありませんか?その場合、inherits/implements節であるCLASS_INSTANCE_CREATIONの近くにあるツリーの部分に乗り越えて、実際にあなたが期待するものを実装/継承していることを確認する必要があります。これを正しく行うには、完全な名前と型の解決が必要です。インターフェイス名が綴られているから "Listener"はあなたが意図したものであるという意味ではありません

+0

私はこのインターフェイスを直接実装していません。このインタフェースを既に実装しているクラスをインスタンス化し、その内部のメソッドをオーバーライドします。しかし、匿名のクラスがListenerを継承するかどうかを調べる必要があります。 –

関連する問題