2016-06-15 16 views
0

나는 유창한 API의 메소드 호출과 일치 시키려고 노력합니다. 임의의 수의 메소드 호출이있을 수 있습니다 (최소 2 개 호출이지만 상한 없음). 전체 표현식이 일치해야합니다. 실제로 유창한 API에서 doIt()을 생략 한 체인 메소드 호출을 찾는 것이이 경우에는 유창한 API가 아무 것도하지 않기 때문입니다.구조적 검색을 사용한 체인 연결된 메소드 호출

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

나는 $b$에 대한

FooClass.$a$($b$) 

$a$에 대한 0,∞ 같은 다른 "선두로부터 카운트를"사용하고 0,1 같은 것을 시도했다, 그러나 이것은 여전히 ​​모든 유창하게 API를 가정 FooClass.some("fluent")

답변

1

일치 메서드가 FooClass의 인스턴스를 반환하면 다음이 작동합니다. 문을 검색를 호출 방법 기존의 템플릿으로 시작하고 세미콜론을 추가 :

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

편집을 클릭 변수 :

  1. FooClass
  2. 세트에 Expression type 인스턴스 설정 Text/RegexpMethodCall to doit 및 사용 가능 Invert condition
+0

이 API 방법이 FooClass''의 인스턴스를 반환하지 않지만, 여러 클래스와 일치하는 표현 형식을 사용하는 것이 여전히 가능 보인다'(FooClass | BarClass)'로 I 대답에 게시 할 것이다. – 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; 
    } 
} 

내가 2-3 표정으로 돌아가 셨습니다 :

  1. 정적 방법 FooClass.bar() 일치. 어떤 반전 doIt 조건은 중간 클래스 FooClass, BarClass 일치

    FooClass.$MethodCall$($Parameter$);

  2. 을 필요로하지 않습니다. 어떤 반전 doIt 조건은 인스턴스의

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

    표현 형식이 클래스 Bar2Class, FinalClass 일치 (FooClass|BarClass)

  3. 입니다 필요하지 않습니다. 차이점은 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