사용자 정의 Lombok을 통한 AST 변환
개시하다
이거 뭐야?
Lombok는 사용자 정의 프로그램 라이브러리로 프로그램 라이브러리를 만드는 동시에 지정한 모방을 통해 파라미터를 검사합니다.
소스를 넣다GitHub.
모티프
시험해 보았는데JSR-55 및 FindBugs 업무 응용 프로그램에 적합하지 않다고 생각했다1.
방침.
@Setter
나 @Data
와 조합하기 어려우므로 최소한의 대체 방법을 제공한다.제한 사항
본사가 준비한 구축 스크립트의 기본 사용 방법
다음 절차는 창고의 루트 디렉터리에서 진행되는 전제 조건입니다.
미리 v1.16.4 그대로 클렌징하거나 포크의 창고를 클렌징하십시오.
또한 Lombok의 구축 수요일가의 창고는 미리 다운로드하고 경로를 통과하십시오.
Eclipse로 가져오기
Eclipse를 자주 사용하기 때문에 다음 명령을 사용하여 Eclipse를 가져올 수 있는 형식(항목 형식)으로 변환하여 가져왔습니다.
또한
lombok
에서 항목명을 변경할 때 수정build.xml
의eclipse
목표Ant가 필요하다.ant eclipse
구축
다음 명령을 사용하여 JAR을 생성할 수 있습니다.
또
lombok
에서 사업명을 변경할 때는 build.xml
와buildScripts/website.ant.xml
등에 대한 각종 수정4이 필요하다.ant dist
테스트
내 환경에서 4하지 않으면 ECJ부분 설정 수정를 이용한 테스트가 정상적으로 작동하지 못한다.
다음 명령 중 하나를 수행하고 테스트할 JDK의 버전을 지정합니다.
또한 상기 절차에 따라 Eclipse의 프로젝트 형식으로 변환할 때 Eclipse에서 테스트를 수행하는 데 사용할 파일을 생성한다
RunLombokTest <JDK名>.launch
.OpenJDK6
ant setupJavaOpenJDK6TestEnvironment
OpenJDK7ant setupJavaOpenJDK7TestEnvironment
OracleJDK7ant setupJavaOracle7TestEnvironment
OracleJDK8ant setupJavaOracle8TestEnvironment
JDK 버전을 지정한 후 다음 명령을 사용하여 테스트를 수행합니다.또한 테스트를 위해 JDK 버전을 전환하는 경우 위 명령을 사용하여 JDK 버전을 다시 지정한 후 다음 명령을 실행합니다.
ant test
Eclipse에서 동작 확인
다음 명령을 실행하면 프로젝트 바로 아래에
LombokizedEclipse.launch
라는 파일을 생성하고 메뉴의 Run As...
부터 해당 프로젝트ant dist
에 적용되는 JAR의 Eclipse를 실행할 수 있습니다.ant eclipseForDebugging
5 다른 일
test/core/src/lombok/LombokTestSource.java
만 Lombok을 사용하지 않으면 컴파일할 수 없는 코드이기 때문에 수정(테스트 코드이기 때문에 자원 유출 가능성은 개의치 않는다).build.gradle
을 제작했다.설치 방법
초대장 정의
처리 객체의 시작점으로 초대를 정의합니다.
나의 경우 gradle-bintray-plugin로 모조와 검사 논리를 실시했기 때문에 이 프로그램 라이브러리를
buildScript/ivy.xml
의dependencies
에 추가했다.또한 제가 정의한 모조에서 다른 라이브러리RetentionPolicy.RUNTIME를 지정했는데 특별한 이유가 없으면 지정7을 하는 것이 좋습니다.
프로세서 설치
Javac과 ECJRetentionPolicy.SOURCE의AST의 구조는 미묘한 차이가 있는데 API는 완전히 다른 것이다.
이에 따라 각각 실시5와Javac용 프로세서ECJ용 프로세서가 필요하다.
나의 경우 유지보수를 편리하게 하기 위해 Javac에 대한 처리 프로그램과 ECJ에 대한 처리 프로그램에서 같은 구조를 극력 사용했다.
또한 ECJ를 위한 프로세서에서는 Javadoc의 의견을 처리할 수 없을 것 같습니다.
테스트
/test/transform/resource
아래의 각 하위 디렉터리에AST 변환 전의 원본 파일,AST 변환 후의 원본 파일의 기대치8, 컴파일할 때 출력하는 메시지의 기대치 등을 설정합니다.before
AST 변환 전 원본 파일after-delombok
Javac 프로세서를 통해 AST 변환된 소스 코드 기대치after-ecj
ECJ 처리 프로그램에서 AST 변환된 소스 코드 기대치messages-delombok
Javac를 사용하여 컴파일할 때 출력되는 메시지의 기대치messages-ecj
ECJ를 사용하여 컴파일할 때 출력되는 메시지의 기대치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에서 생성한 문이 소스 코드에 나타나지 않기 때문에 디버깅이 어렵습니다. ↩
본가의 실현은 각 처리 절차에서 각각 판정
EclipseAnnotationHandler#preHandle()
과@Nonnull
의 유무 지정(정규적 표현을 통해case-indsitive의 일치)을 하기 때문에 이외의 모조에 대응하려면 수정된 부분이 매우 많다. ↩ 수정된 곳의 전체 양 참조↩(추가 처리 절차도 포함하지만...). 첫 번째 제출의 차이
Eclipse Compiler for Java ↩
처음에는 다른 반으로 정의하려고 했지만 그곳의 수정 부분이 많아진 것 같다. ↩
룸봇과 조합하지 않더라도 반사 등에서 사용하길 바란다. ↩
단도직입적으로 말하면, Javac를 위한 처리 프로그램과 ECJ를 위한 처리 프로그램을 실현하려면 두 가지가 고행적이다. ↩
아스트 변환은 소스 코드의 변환이 아니기 때문에 정확히 말하면'변환된 아스트를 소스 코드로 표시하면 이렇게 될 것'이라는 기대치다. ↩
Reference
이 문제에 관하여(사용자 정의 Lombok을 통한 AST 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/suk2@github/items/41b4eb30f1115b2c79fc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)