2016-08-15 6 views
2

異なるファイル間で構文ツリーを移動する必要があるカスタムルールを実装しようとしています。ような何か:Sonarqube:クロスファイルのカスタムJavaルール?

にClassA - >プライベートClassBのフィールド - > ClassBの - >プライベートクラスCフィールド - >クラスC ...

しかし、私はこれを行う可能性があるかどうかわからないんだけど。私はサンプルリポジトリだけでなく、書かれている既存のソナーチェックを見ましたが、ほとんどではないにせよ、ファイルスコープに制限されているようです。私はこれにアプローチする方法があるかどうか疑問に思っていましたか?

私は現在そうのような、クラスのシンボルタイプから宣言変数を取得しようとしました:

public void visitNode(final Tree tree) { 
    final ClassTree clazz = (ClassTree) tree; 

    final VariableTree memberField = tree.members().get(0); 
    final JavaSymbol memberClassSymbol = (JavaSymbol) memberField.symbol().type().symbol(); 
    final ClassTree memberClass = memberClassSymbol.declaration(); 
} 

しかし、このフィールドはnullです。私が試したすべての場合にあるようだ。カスタムソナー拡張でこのタスクにアプローチする別の方法はありますか?

ありがとうございました。

+0

ますセマンティックAPIがあなたをここで助けることができるので、あなたが検出したいものを正確に正確にしたいかもしれません。 – benzonico

+0

@benzonico返事をありがとう。私たちのケースでは、シリアライズを助けるルールを実装しようとしています - 他の理由ではシリアライズ可能ではないシリアライズ可能クラスのシリアライズされたクラス(つまり、IDEや既存のルールとして警告として表示されないクラス) 。たとえば、ClassAでは、ClassBとMyBeanの2つのフィールドがあります。 MyBeanにはClassDが含まれています。私たちの場合、このルールでclassAをスキャンし、classBにフラグを立て、それに違反する他のフィールド(MyBean)のスキャンを続行したいと考えています。この場合、ClassDにフラグが立てられます。 –

+0

あなたの必要性をカバーするこのルールではありませんか? https://sonarqube.com/coding_rules#rule_key=squid%3AS1948 – benzonico

答えて

0

これはの構文レベルでは不可能です。解析はファイルごとに行われます。

ファイルが解析されると、構文ツリーは削除され、解析は次のファイルに進みます。ファイルの解析順序については保証されていないため、後で使用するためにいくつかの構文ノードを保存することもできません。

しかし、あなたはセマンティックAPIに依存しており、そのクラスBを検出することができます達成したいのかに応じて、バイトコードを解析、意味解析を、使用して(シンボルと型を使用して)タイプCのフィールドなどがあり

+0

この問題を再検討した後、私は意味解析を介して何を意味するのかを理解しています。ツリーにアクセスすることはできませんが、symbolScope()を使用することができます。ありがとう。 –

+0

それが役に立ったら、アップしてください、ありがとう。 – benzonico

+0

私はこれまでに一度も投稿したことのないように記録されていますが、表示されません:(申し訳ありません。 –

関連する問題