이 API가 올바르게 사용되었는지, 코틀린 문법상 문제는 없는지, 최적화 가능한 요소가 있는지 등, 언어의 표면적인 부분을 검사합니다. 동적 코드 변형 분석된 코드 형태를 보고 다양한 최적화를 적용하거나, 기존에는 없던 새로운 코드를 추가합니다. 새로운 키워드 추가 (X) 아쉽게도 못하는 기능 Kotlin Compiler Plugin
이 API가 올바르게 사용되었는지, 코틀린 문법상 문제는 없는지, 최적화 가능한 요소가 있는지 등, 언어의 표면적인 부분을 검사합니다. 동적 코드 변형 분석된 코드 형태를 보고 다양한 최적화를 적용하거나, 기존에는 없던 새로운 코드를 추가합니다. 새로운 키워드 추가 ➔ 어노테이션 + 기존 경고 억제 어노테이션을 새로운 키워드로 취급하고, 잘못된 문법으로 발생하는 코틀린 언어적 경고를 억제합니다. Kotlin Compiler Plugin
argument를 복사하면서 코드 생성이 필요했음. KSP는 declaration 영역만 접근이 가능하기에, default argument와 같은 expression은 접근이 불가능함. -> default argument의 expression을 알 수 없어, 성빈이 원하는 기능을 KSP로는 구현할 수 없음 ->
토큰 단위로 분석하여, 이 API가 올바르게 사용되었는지, 코틀린 문법상 문제는 없는지, 최적화 가능한 요소가 있는지 등, 언어의 표면적인 부분을 검사합니다. 동적 코드 변형 (= IR) 분석된 코드 형태를 보고 다양한 최적화를 적용하거나, 기존에는 없던 새로운 코드를 추가합니다. 새로운 키워드 추가: 어노테이션 + 기존 경고 억제 (= FIR + IR) 어노테이션을 새로운 키워드로 취급하고, 잘못된 문법으로 발생하는 코틀린 언어적 경고를 억제합니다. Kotlin Compiler Plugin
토큰 단위로 분석하여, 이 API가 올바르게 사용되었는지, 코틀린 문법상 문제는 없는지, 최적화 가능한 요소가 있는지 등, 언어의 표면적인 부분을 검사합니다. 동적 코드 변형 (= IR) 분석된 코드 형태를 보고 다양한 최적화를 적용하거나, 기존에는 없던 새로운 코드를 추가합니다. 새로운 키워드 추가: 어노테이션 + 기존 경고 억제 (= FIR + IR) 어노테이션을 새로운 키워드로 취급하고, 잘못된 문법으로 발생하는 코틀린 언어적 경고를 억제합니다. Kotlin Compiler Plugin
} plus a + b IrFile [IrPackageFragment] land.sungbin.calculation [IrFunction] name: plus [IrValueParameter] name: a, type: kotlin.Int [IrValueParameter] name: b, type: kotlin.Int IrBlockBody [IrCall] symbol: kotlin.io.println value argument: ...
b) } plus IrFile [IrPackageFragment] land.sungbin.calculation [IrFunction] name: plus [IrValueParameter] name: a, type: kotlin.Int [IrValueParameter] name: b, type: kotlin.Int IrBlockBody [IrCall] symbol: kotlin.io.println value argument: ... [IrCall] symbol: kotlin.Int.plus dispatch receiver: IrGetValue(target: a) value argument: IrGetValue(target: b)
} return fun val MyData( : Int, : Int) { (): String { result = result += (param ) { result += param. param. } result += result } } () { data = MyData( , ).toString() println(data) } a b valueParameters name value toString main "" "MyData(" " = , " ")" // [Parameter(name = "a", value = a.toString()), ..] // MyData(a=1, b=2) 1 2
(): String { result += } } a b toString var result = "" fun main() { val data = MyData(1, 2).toString() println(data) // MyData(a=1, b=2) } "MyData(" [IrFunction] name: toString, type: kotlin.String [IrVariable] name: result, type: kotlin.String [IrCall] symbol: kotlin.String.plusAssign value argument: IrConst(value: “MyData(“) dispatch receiver: result
(): String { result += } } a b toString var result = "" result += "MyData(" for (param in valueParameters) { result += "${param.name}=${param.value}, " } fun main() { val data = MyData(1, 2).toString() println(data) // MyData(a=1, b=2) } ")" [IrFunction] name: toString, type: kotlin.String [IrForLoop] target: MyData#valueParameters, name: param [IrVariable] name: result, type: kotlin.String [IrCall] symbol: kotlin.String.plusAssign value argument: IrConst(value: “MyData(“) dispatch receiver: result [IrCall] symbol: kotlin.String.plusAssign value argument: IrConst(value: “)“) dispatch receiver: result [IrCall] symbol: kotlin.String.plusAssign value argument: IrConst( value: “${param.name}=${param.value}, “ ) dispatch receiver: result
{ (): String { result } } a b toString var result = "" result += "MyData(" for (param in valueParameters) { result += "${param.name}=${param.value}, " } result += ")" fun main() { val data = MyData(1, 2).toString() println(data) // MyData(a=1, b=2) } [IrFunction] name: toString, type: kotlin.String [IrForLoop] target: MyData#valueParameters, name: param [IrVariable] name: result, type: kotlin.String [IrCall] symbol: kotlin.String.plusAssign value argument: IrConst(value: “MyData(“) dispatch receiver: result [IrCall] symbol: kotlin.String.plusAssign value argument: IrConst(value: “)“) dispatch receiver: result [IrReturn] target: result [IrCall] symbol: kotlin.String.plusAssign value argument: IrConst( value: “${param.name}=${param.value}, “ ) dispatch receiver: result
} return MyData( : Int, : Int) { (): String { result = result += (param ) { result += param. param. } result += result } } a b valueParameters name value // 우리가 IR로 직접 만든 toString() toString "" "MyData(" " = , " ")"
MyData( : Int, : Int) { (): String { result = result += result += a.toString() result += b.toString() result += result } } a b // 코틀린 컴파일러가 만드는 toString() toString "" "MyData(" "a= , " "b= " ")"