xref: /aosp_15_r20/external/kotlinpoet/docs/n-for-names.md (revision 3c321d951dd070fb96f8ba59e952ffc3131379a0)
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