2016-06-15 67 views
0

我嘗試匹配某種流利的API的這種方法調用。可以有任意數量的方法調用(至少有2個調用,但沒有上限)。整個表達應該匹配。實際上,我們的目標是在流利的api中找到鏈接的方法調用,它忽略了doIt(),因爲在這種情況下,流暢的API什麼也不做。匹配連接方法調用與結構搜索

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

我想是這樣

FooClass.$a$($b$) 

,並使用不同的 「occurence罪狀」 像0,∞$a$,並0,1$b$,但仍只匹配FooClass.some("fluent")

回答

1

假設所有的流暢API方法返回一個FooClass的實例,下面的工作。 與現有的模板方法調用啓動,並添加一個分號來搜索聲明:

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

單擊編輯變量:

  1. 設置Expression type實例FooClass
  2. 集的MethodCalldoit並啓用Invert condition
+0

API方法不返回FooClass'的'實例,但似乎仍然有可能使用一個表達式類型匹配多個類'(FooClass | BarClass)'我將發佈答案 – user140547

1

基於Bas Leijdekkers答案的解決方案,如果有人有類似的問題。

使用這些類定義的例子:

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; 
    } 
} 

我結束了兩三個表達式:

  1. 匹配的靜態方法FooClass.bar()。沒有倒doIt條件需要

    FooClass.$MethodCall$($Parameter$);

  2. 匹配的中間階級FooClass,BarClass。沒有倒doIt條件所需的實例

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

    表達式類型是(FooClass|BarClass)

  3. 匹配類Bar2ClassFinalClass。區別在於,可以通過將doIt()添加到表達式來生成有效的表達式。這可能只適用於只有最後一次通話的情況。實例的

    $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