2016-06-15 3 views
0

私は、この種のメソッド呼び出しをいくつかの流暢なAPIと照合しようとします。任意の数のメソッド呼び出し(少なくとも2つの呼び出しがありますが、上限はありません)があります。全体の表現は一致する必要があります。実際、目的は流暢なAPIでdoIt()を省略したチェーンメソッド呼び出しを見つけることです。この場合、流暢なAPIは何もしません。ストラクチャード・サーチによるチェーン・メソッド呼び出しの一致

FooClass.some("fluent") 
     .api() 
     .bar(()->"somelambda") 
     .doIt(); 

私は

FooClass.$a$($b$) 

と異なる$a$ため0,∞のような "出現数"、および$b$ため0,1を使用するような何かを試してみましたが、これはまだのみすべての流暢APIを想定しFooClass.some("fluent")

答えて

1

と一致しますメソッドがFooClassのインスタンスを返した場合、次のように動作するはずです。

$Instance$.$MethodCall$($Parameter$);

[編集]をクリックして変数:

  1. インスタンス
  2. FooClassへのセットの Expression typeを設定し、既存のテンプレート 方法はを呼び出し、ステートメントを検索するためのセミコロンを追加して スタート Text/RegexpMethodCallから doitと有効 Invert condition
+0

APIメソッドがFooClass' 'のインスタンスを返しませんが、複数のクラスに一致する表現型を使用することは可能であると思われる'(FooClass | BarClass) 'としてI答えに投稿する – user140547

1

誰も同様の問題がある場合、Bas Leijdekkersの回答に基づく解決策です。例えばこれらのクラス定義を使用して

:静的メソッドFooClass.bar()マッチング

  1. static class FooClass{ 
    
        static BarClass bar(){ 
         return new BarClass(); 
        } 
    } 
    
    static class BarClass{ 
    
        Bar2Class bar2(){ 
         return new Bar2Class(); 
        } 
    
        BarClass self(){return this;} 
    } 
    
    static class Bar2Class{ 
    
        FinalClass bar3(){ 
         return new FinalClass(); 
        } 
        Bar2Class self(){return this;} 
    } 
    
    static class FinalClass{ 
        void doIt(){ 
         System.out.println("bar2"); 
        } 
        FinalClass doSomethingElse(){ 
         return this; 
        } 
    } 
    

    を私は二から三の表現になってしまいました。いいえ反転doIt条件は、中間クラスFooClass、BarClassマッチング

    FooClass.$MethodCall$($Parameter$);

  2. を必要としません。いいえ反転doIt条件は、インスタンスの

    $Instance$.$MethodCall$($Parameter$);

    表現型はクラスBar2ClassFinalClassマッチング(FooClass|BarClass)

  3. である必要はありません。違いは、式にdoIt()を追加することで有効な式を作ることができるということです。これはおそらく最終呼び出しが1つしかない場合にのみ有効です。インスタンスの

    $Instance$.$MethodCall$($Parameter$);

    式の型は、メソッド呼び出しで反転制約を使用してここ(Bar2Class|FinalClass) あるdoIt

    置換テンプレートは $Instance$.$MethodCall$($Parameter$).doIt();

これらの構造の検索パターンは、できていますIntelliJの検査としても使用できます。

テストケース:

FooClass.bar().bar2(); 

    FooClass.bar(); 

    FooClass.bar().self().self().bar2(); 

    FooClass.bar().bar2().bar3(); // do it can be added 

    FooClass.bar().bar2(); 

    FooClass.bar().self().bar2(); 

    FooClass.bar().bar2().bar3().doSomethingElse(); // do it can be added 


    FooClass.bar().bar2().self().bar3().doSomethingElse(); // do it can be added 

    FooClass.bar().bar2().bar3().doSomethingElse().doIt(); // all but this are invalid and found by the inspections 
関連する問題