사용자 정의 Lombok을 통한 AST 변환

9389 단어 JavaLombok

개시하다


이거 뭐야?


Lombok는 사용자 정의 프로그램 라이브러리로 프로그램 라이브러리를 만드는 동시에 지정한 모방을 통해 파라미터를 검사합니다.
소스를 넣다GitHub.

모티프

  • 매번 방법의 시작에 파라미터 검사를 기술하는 처리가 매우 피곤하다.
  • 다른 멤버가 작성한 API 참조에서는 매개변수에 지정된 값의 범위가 없어 화가 났습니다.
  • 다른 멤버들이 만든 API의 참고서에 실린 내용은 실제 복장과 달리 절망적이었다.
  • 자체 제작한 API의 참조를 수정하고 매개변수에 지정 가능한 값이 기재된 범위가 없음을 반성했다.
  • 자신이 만든 API의 참고서에 적힌 내용과 시행방법이 다르다는 점을 깊이 반성했다.

  • 시험해 보았는데JSR-55 및 FindBugs 업무 응용 프로그램에 적합하지 않다고 생각했다1.
  • 룸에서 넬 검사 외에 다른 결단도 할 수 있었으면 좋겠다고 생각해요.
  • 면 한번 해보세요.
  • 방침.

  • 본사 측의 업데이트를 쉽게 얻기 위해 기존 코드를 변경하지 않습니다.
  • 디버깅의 용이성2을 중시하고 실행할 때의 라이브러리 의존성을 허용한다.
  • 본사가 제공한 모조@Setter@Data와 조합하기 어려우므로 최소한의 대체 방법을 제공한다.
  • 제한 사항

  • 위에서 말한 바와 같이 본사가 제공한 모조 조합은 제공할 수 없습니다(매우 유감).
  • 이 글을 쓸 때 본가의3를 바탕으로 했기 때문에 Eclipse4.5(Mars)에 문제가 많았다.
  • 본사가 준비한 구축 스크립트의 기본 사용 방법


    다음 절차는 창고의 루트 디렉터리에서 진행되는 전제 조건입니다.
    미리 v1.16.4 그대로 클렌징하거나 포크의 창고를 클렌징하십시오.
    또한 Lombok의 구축 수요일가의 창고는 미리 다운로드하고 경로를 통과하십시오.

    Eclipse로 가져오기


    Eclipse를 자주 사용하기 때문에 다음 명령을 사용하여 Eclipse를 가져올 수 있는 형식(항목 형식)으로 변환하여 가져왔습니다.
    또한lombok에서 항목명을 변경할 때 수정build.xmleclipse목표Ant가 필요하다.
    ant eclipse
    

    구축


    다음 명령을 사용하여 JAR을 생성할 수 있습니다.
    lombok에서 사업명을 변경할 때는 build.xmlbuildScripts/website.ant.xml 등에 대한 각종 수정4이 필요하다.
    ant dist
    

    테스트


    내 환경에서 4하지 않으면 ECJ부분 설정 수정를 이용한 테스트가 정상적으로 작동하지 못한다.
    다음 명령 중 하나를 수행하고 테스트할 JDK의 버전을 지정합니다.
    또한 상기 절차에 따라 Eclipse의 프로젝트 형식으로 변환할 때 Eclipse에서 테스트를 수행하는 데 사용할 파일을 생성한다RunLombokTest <JDK名>.launch.
    OpenJDK6
    ant setupJavaOpenJDK6TestEnvironment
    
    OpenJDK7
    ant setupJavaOpenJDK7TestEnvironment
    
    OracleJDK7
    ant setupJavaOracle7TestEnvironment
    
    OracleJDK8
    ant setupJavaOracle8TestEnvironment
    
    JDK 버전을 지정한 후 다음 명령을 사용하여 테스트를 수행합니다.
    또한 테스트를 위해 JDK 버전을 전환하는 경우 위 명령을 사용하여 JDK 버전을 다시 지정한 후 다음 명령을 실행합니다.
    ant test
    

    Eclipse에서 동작 확인


    다음 명령을 실행하면 프로젝트 바로 아래에 LombokizedEclipse.launch라는 파일을 생성하고 메뉴의 Run As...부터 해당 프로젝트ant dist에 적용되는 JAR의 Eclipse를 실행할 수 있습니다.
    ant eclipseForDebugging
    
    5

    다른 일

  • 독립된 설정 항목을 추가하기 위해에 정의ConfigurationKeys.java를 추가했다.
  • 왠지 모르게 test/core/src/lombok/LombokTestSource.java만 Lombok을 사용하지 않으면 컴파일할 수 없는 코드이기 때문에 수정(테스트 코드이기 때문에 자원 유출 가능성은 개의치 않는다).
  • 성과물을 6에 올리기 위해 사용하고 싶어Bintray하므로 상당히 강경한build.gradle을 제작했다.
  • 설치 방법


    초대장 정의


    처리 객체의 시작점으로 초대를 정의합니다.
    나의 경우 gradle-bintray-plugin로 모조와 검사 논리를 실시했기 때문에 이 프로그램 라이브러리를 buildScript/ivy.xmldependencies에 추가했다.
    또한 제가 정의한 모조에서 다른 라이브러리RetentionPolicy.RUNTIME를 지정했는데 특별한 이유가 없으면 지정7을 하는 것이 좋습니다.

    프로세서 설치


    Javac과 ECJRetentionPolicy.SOURCE의AST의 구조는 미묘한 차이가 있는데 API는 완전히 다른 것이다.
    이에 따라 각각 실시5Javac용 프로세서ECJ용 프로세서가 필요하다.
    나의 경우 유지보수를 편리하게 하기 위해 Javac에 대한 처리 프로그램과 ECJ에 대한 처리 프로그램에서 같은 구조를 극력 사용했다.
    또한 ECJ를 위한 프로세서에서는 Javadoc의 의견을 처리할 수 없을 것 같습니다.

    테스트

    /test/transform/resource 아래의 각 하위 디렉터리에AST 변환 전의 원본 파일,AST 변환 후의 원본 파일의 기대치8, 컴파일할 때 출력하는 메시지의 기대치 등을 설정합니다.beforeAST 변환 전 원본 파일after-delombokJavac 프로세서를 통해 AST 변환된 소스 코드 기대치after-ecjECJ 처리 프로그램에서 AST 변환된 소스 코드 기대치messages-delombokJavac를 사용하여 컴파일할 때 출력되는 메시지의 기대치messages-ecjECJ를 사용하여 컴파일할 때 출력되는 메시지의 기대치messages-idempotent after-delombok 어떤 원본을 컴파일할 때 출력하는 메시지의 기대치
    나의 경우 기존 코드는 기본적으로 수정하지 않는 방침(기존 원본 코드는 테스트의 전제)이기 때문에 9 수정build.xml의 목표를 만들었다.

    매혹적인 일


    간단한 이름 에뮬레이션

    test와 같은 시뮬레이션을 정의했지만 해당하는 처리 프로그램을 실행하지 않았다.
    보아하니 롬북은 모조된 단순명과 처리 프로그램의 실시를 상대적으로 관리하는 것으로 보인다. 롬북이 원래 제공한com.develhack.annotation.assertion.NonNull과 단순명이 중복되기 때문이다.
    에뮬레이션 이름lombok.NonNull(n은 소문자)을 변경해 기대하는 동작으로 변경했다.

    ECJ에서 필드 추가

    com.develhack.annotation.assertion.Nonnull 안에 AST에 필드를 추가하면 결과가 아쉽다.
    ECJ에서 필드를 추가한 경우EclipseAnnotationHandler#handle()가 아닌EclipseAnnotationHandler#handle()이다.

    감상

  • Lombok이 아주 좋아요.
  • AST 변환도 흑마술이지만 바이트 변환보다 하얗다고 생각해요.

  • 자체 제작 프로세서의 테스트 용례만 테스트 그래서 아스트 전환의 구조도 표준화되면 좋겠다고 생각합니다.
  • 상한치, 하한치, 범위를 지정할 수 없습니다.  바이트 코드 변환 메커니즘이 표준화되었다
    Lombok에서 생성한 문이 소스 코드에 나타나지 않기 때문에 디버깅이 어렵습니다. 
    본가의 실현은 각 처리 절차에서 각각 판정EclipseAnnotationHandler#preHandle()@Nonnull의 유무 지정(정규적 표현을 통해case-indsitive의 일치)을 하기 때문에 이외의 모조에 대응하려면 수정된 부분이 매우 많다. 
    수정된 곳의 전체 양 참조(추가 처리 절차도 포함하지만...).  첫 번째 제출의 차이
    Eclipse Compiler for Java 
    처음에는 다른 반으로 정의하려고 했지만 그곳의 수정 부분이 많아진 것 같다. 
    룸봇과 조합하지 않더라도 반사 등에서 사용하길 바란다. 
    단도직입적으로 말하면, Javac를 위한 처리 프로그램과 ECJ를 위한 처리 프로그램을 실현하려면 두 가지가 고행적이다. 
    아스트 변환은 소스 코드의 변환이 아니기 때문에 정확히 말하면'변환된 아스트를 소스 코드로 표시하면 이렇게 될 것'이라는 기대치다. 

    좋은 웹페이지 즐겨찾기