Compose 컴파일러
-> Kotlin compiler plugin 의 일종
Annotation Processor와의 차이점?
- Annotation Processor -> 단순히 코드를 추가만 할 수 있음, 컴파일 이전에 수행.
- Compiler plugin -> 코드 자체를 수정할 수 있음
(컴파일러 플러그인의 장점 중, 프론트엔드 단계에서 진단을 보고한다는 것이 있는데 어떤 의미인지 좀더 파악 필요함)
KSP
- 구글에서 제안하는 경량 컴파일러 플러그인
- 컴파일러 플러그인 사용 시 수반되는 단점과 위험을 보완
Compose Annotations
@Composable
@ComposableCompilerApi
@InternalComposeApi
@DisallowComposableCalls
@ReadOnlyComposable
@NonRestartableComposable
@StableMarker
컴파일러 확장(Compiler Extension, 이하 CE) 등록
Compose compiler plugin은 kotlin compiler에 자신을 등록함 (ComponentRegistrar 메커니즘 사용)
- 라이브 리터럴, composition 검사 등의 기능을 사용할 수 있도록 하는 특정 컴파일러 플래그 활성화
Kotlin 컴파일러 버전
Compose compiler 는 매우 구체적인 Kotlin Compiler 버전이 요구됨.
정적 분석
컴파일러 플러그인의 표준동작에서 린팅이 가장 먼저 수행되어야 함.
- 린팅(linting)
- 프론트엔드 단계에서 수행
- 라이브러리 어노테이션이 런타임에서 기대하는 방식으로 사용되고 있는지 추적 검사
(정적분석이란? -> 소스 코드의 실행 없이 정적으로 프로그램의 문제를 찾는 과정, 비 런타임 환경에서 수행)
정적 검사기
- CE의 일부로 제공됨
- 프론트엔드 단계에서 수행, 빠르고 리소스 소모가 적음
호출 검사
- 코드베이스 전체에서 모든 호출에 대한 정적분석을 수행하는 CE
- composable 함수의 호출 범위를 주기적으로 체크
- 호출자가 적절한지? (composable 함수 내에서만 호출이 가능하므로)
- inline 함수의 경우, 상위 호출자가 composable 인지 여부 등
해당 기능들을 수행하기 위해 넓은 컨텍스트가 필요하고 이를 탐색하는 과정에서 방문자 패턴(visitor pattern)이 사용됨
타입 검사
함수 호출 검사와 유사
선언 검사
- @Composable 함수의 재정의, 함수의 suspend 여부 체크 등
진단 제지기 (Diagnostic suppression)
CE의 일종으로 Kotlin Compiler의 검사를 피하려는 경우에 흔히 사용 (언어적인 제한 우회)
- inline 람다의 경우 non-source(BINARY or RUNTIME) annotation 처리가 불가능함
근데 @Composable은 가능함. (@Composable은 BINARY 타입임)
- 인수에 NamedParameter가 가능