1*3c321d95SSadaf Ebrahimi%N for Names 2*3c321d95SSadaf Ebrahimi============ 3*3c321d95SSadaf Ebrahimi 4*3c321d95SSadaf EbrahimiGenerated code is often self-referential. Use **`%N`** to refer to another generated declaration by 5*3c321d95SSadaf Ebrahimiits name. Here's a method that calls another: 6*3c321d95SSadaf Ebrahimi 7*3c321d95SSadaf Ebrahimi```kotlin 8*3c321d95SSadaf Ebrahimifun byteToHex(b: Int): String { 9*3c321d95SSadaf Ebrahimi val result = CharArray(2) 10*3c321d95SSadaf Ebrahimi result[0] = hexDigit((b ushr 4) and 0xf) 11*3c321d95SSadaf Ebrahimi result[1] = hexDigit(b and 0xf) 12*3c321d95SSadaf Ebrahimi return String(result) 13*3c321d95SSadaf Ebrahimi} 14*3c321d95SSadaf Ebrahimi 15*3c321d95SSadaf Ebrahimifun hexDigit(i: Int): Char { 16*3c321d95SSadaf Ebrahimi return (if (i < 10) i + '0'.toInt() else i - 10 + 'a'.toInt()).toChar() 17*3c321d95SSadaf Ebrahimi} 18*3c321d95SSadaf Ebrahimi``` 19*3c321d95SSadaf Ebrahimi 20*3c321d95SSadaf EbrahimiWhen generating the code above, we pass the `hexDigit()` method as an argument to the `byteToHex()` 21*3c321d95SSadaf Ebrahimimethod using `%N`: 22*3c321d95SSadaf Ebrahimi 23*3c321d95SSadaf Ebrahimi```kotlin 24*3c321d95SSadaf Ebrahimival hexDigit = FunSpec.builder("hexDigit") 25*3c321d95SSadaf Ebrahimi .addParameter("i", Int::class) 26*3c321d95SSadaf Ebrahimi .returns(Char::class) 27*3c321d95SSadaf Ebrahimi .addStatement("return (if (i < 10) i + '0'.toInt() else i - 10 + 'a'.toInt()).toChar()") 28*3c321d95SSadaf Ebrahimi .build() 29*3c321d95SSadaf Ebrahimi 30*3c321d95SSadaf Ebrahimival byteToHex = FunSpec.builder("byteToHex") 31*3c321d95SSadaf Ebrahimi .addParameter("b", Int::class) 32*3c321d95SSadaf Ebrahimi .returns(String::class) 33*3c321d95SSadaf Ebrahimi .addStatement("val result = CharArray(2)") 34*3c321d95SSadaf Ebrahimi .addStatement("result[0] = %N((b ushr 4) and 0xf)", hexDigit) 35*3c321d95SSadaf Ebrahimi .addStatement("result[1] = %N(b and 0xf)", hexDigit) 36*3c321d95SSadaf Ebrahimi .addStatement("return String(result)") 37*3c321d95SSadaf Ebrahimi .build() 38*3c321d95SSadaf Ebrahimi``` 39*3c321d95SSadaf Ebrahimi 40*3c321d95SSadaf EbrahimiAnother handy feature that `%N` provides is automatically escaping names that contain illegal 41*3c321d95SSadaf Ebrahimiidentifier characters with double ticks. Suppose your code creates a `MemberName` with a Kotlin 42*3c321d95SSadaf Ebrahimikeyword as the simple name: 43*3c321d95SSadaf Ebrahimi 44*3c321d95SSadaf Ebrahimi```kotlin 45*3c321d95SSadaf Ebrahimival taco = ClassName("com.squareup.tacos", "Taco") 46*3c321d95SSadaf Ebrahimival packager = ClassName("com.squareup.tacos", "TacoPackager") 47*3c321d95SSadaf Ebrahimival file = FileSpec.builder("com.example", "Test") 48*3c321d95SSadaf Ebrahimi .addFunction( 49*3c321d95SSadaf Ebrahimi FunSpec.builder("packageTacos") 50*3c321d95SSadaf Ebrahimi .addParameter("tacos", LIST.parameterizedBy(taco)) 51*3c321d95SSadaf Ebrahimi .addParameter("packager", packager) 52*3c321d95SSadaf Ebrahimi .addStatement("packager.%N(tacos)", packager.member("package")) 53*3c321d95SSadaf Ebrahimi .build() 54*3c321d95SSadaf Ebrahimi ) 55*3c321d95SSadaf Ebrahimi .build() 56*3c321d95SSadaf Ebrahimi``` 57*3c321d95SSadaf Ebrahimi 58*3c321d95SSadaf Ebrahimi`%N` will escape the name for you, ensuring that the output will pass compilation: 59*3c321d95SSadaf Ebrahimi 60*3c321d95SSadaf Ebrahimi```kotlin 61*3c321d95SSadaf Ebrahimipackage com.example 62*3c321d95SSadaf Ebrahimi 63*3c321d95SSadaf Ebrahimiimport com.squareup.tacos.Taco 64*3c321d95SSadaf Ebrahimiimport com.squareup.tacos.TacoPackager 65*3c321d95SSadaf Ebrahimiimport kotlin.collections.List 66*3c321d95SSadaf Ebrahimi 67*3c321d95SSadaf Ebrahimifun packageTacos(tacos: List<Taco>, packager: TacoPackager) { 68*3c321d95SSadaf Ebrahimi packager.`package`(tacos) 69*3c321d95SSadaf Ebrahimi} 70*3c321d95SSadaf Ebrahimi``` 71