1*3c321d95SSadaf EbrahimiKotlinPoet 2*3c321d95SSadaf Ebrahimi========== 3*3c321d95SSadaf Ebrahimi 4*3c321d95SSadaf Ebrahimi`KotlinPoet` is a Kotlin and Java API for generating `.kt` source files. 5*3c321d95SSadaf Ebrahimi 6*3c321d95SSadaf EbrahimiSource file generation can be useful when doing things such as annotation processing or interacting 7*3c321d95SSadaf Ebrahimiwith metadata files (e.g., database schemas, protocol formats). By generating code, you eliminate 8*3c321d95SSadaf Ebrahimithe need to write boilerplate while also keeping a single source of truth for the metadata. 9*3c321d95SSadaf Ebrahimi 10*3c321d95SSadaf Ebrahimi## Example 11*3c321d95SSadaf Ebrahimi 12*3c321d95SSadaf EbrahimiHere's a `HelloWorld` file: 13*3c321d95SSadaf Ebrahimi 14*3c321d95SSadaf Ebrahimi```kotlin 15*3c321d95SSadaf Ebrahimiclass Greeter(val name: String) { 16*3c321d95SSadaf Ebrahimi fun greet() { 17*3c321d95SSadaf Ebrahimi println("""Hello, $name""") 18*3c321d95SSadaf Ebrahimi } 19*3c321d95SSadaf Ebrahimi} 20*3c321d95SSadaf Ebrahimi 21*3c321d95SSadaf Ebrahimifun main(vararg args: String) { 22*3c321d95SSadaf Ebrahimi Greeter(args[0]).greet() 23*3c321d95SSadaf Ebrahimi} 24*3c321d95SSadaf Ebrahimi``` 25*3c321d95SSadaf Ebrahimi 26*3c321d95SSadaf EbrahimiAnd this is the code to generate it with KotlinPoet: 27*3c321d95SSadaf Ebrahimi 28*3c321d95SSadaf Ebrahimi```kotlin 29*3c321d95SSadaf Ebrahimival greeterClass = ClassName("", "Greeter") 30*3c321d95SSadaf Ebrahimival file = FileSpec.builder("", "HelloWorld") 31*3c321d95SSadaf Ebrahimi .addType( 32*3c321d95SSadaf Ebrahimi TypeSpec.classBuilder("Greeter") 33*3c321d95SSadaf Ebrahimi .primaryConstructor( 34*3c321d95SSadaf Ebrahimi FunSpec.constructorBuilder() 35*3c321d95SSadaf Ebrahimi .addParameter("name", String::class) 36*3c321d95SSadaf Ebrahimi .build() 37*3c321d95SSadaf Ebrahimi ) 38*3c321d95SSadaf Ebrahimi .addProperty( 39*3c321d95SSadaf Ebrahimi PropertySpec.builder("name", String::class) 40*3c321d95SSadaf Ebrahimi .initializer("name") 41*3c321d95SSadaf Ebrahimi .build() 42*3c321d95SSadaf Ebrahimi ) 43*3c321d95SSadaf Ebrahimi .addFunction( 44*3c321d95SSadaf Ebrahimi FunSpec.builder("greet") 45*3c321d95SSadaf Ebrahimi .addStatement("println(%P)", "Hello, \$name") 46*3c321d95SSadaf Ebrahimi .build() 47*3c321d95SSadaf Ebrahimi ) 48*3c321d95SSadaf Ebrahimi .build() 49*3c321d95SSadaf Ebrahimi ) 50*3c321d95SSadaf Ebrahimi .addFunction( 51*3c321d95SSadaf Ebrahimi FunSpec.builder("main") 52*3c321d95SSadaf Ebrahimi .addParameter("args", String::class, VARARG) 53*3c321d95SSadaf Ebrahimi .addStatement("%T(args[0]).greet()", greeterClass) 54*3c321d95SSadaf Ebrahimi .build() 55*3c321d95SSadaf Ebrahimi ) 56*3c321d95SSadaf Ebrahimi .build() 57*3c321d95SSadaf Ebrahimi 58*3c321d95SSadaf Ebrahimifile.writeTo(System.out) 59*3c321d95SSadaf Ebrahimi``` 60*3c321d95SSadaf Ebrahimi 61*3c321d95SSadaf EbrahimiThe [KDoc][kdoc] catalogs the complete KotlinPoet API, which is inspired by [JavaPoet][javapoet]. 62*3c321d95SSadaf Ebrahimi 63*3c321d95SSadaf Ebrahimi**Note:** In order to maximize portability, KotlinPoet generates code with explicit visibility 64*3c321d95SSadaf Ebrahimimodifiers. This ensures compatibility with both standard Kotlin projects as well as projects 65*3c321d95SSadaf Ebrahimiusing [explicit API mode][explicit-api]. Examples in the documentation omit those modifiers for 66*3c321d95SSadaf Ebrahimibrevity. 67*3c321d95SSadaf Ebrahimi 68*3c321d95SSadaf EbrahimiDownload 69*3c321d95SSadaf Ebrahimi-------- 70*3c321d95SSadaf Ebrahimi 71*3c321d95SSadaf Ebrahimi![Maven Central][version-shield] 72*3c321d95SSadaf Ebrahimi 73*3c321d95SSadaf EbrahimiDownload [the latest .jar][dl] or depend via Maven: 74*3c321d95SSadaf Ebrahimi 75*3c321d95SSadaf Ebrahimi```xml 76*3c321d95SSadaf Ebrahimi<dependency> 77*3c321d95SSadaf Ebrahimi <groupId>com.squareup</groupId> 78*3c321d95SSadaf Ebrahimi <artifactId>kotlinpoet-jvm</artifactId> 79*3c321d95SSadaf Ebrahimi <version>[version]</version> 80*3c321d95SSadaf Ebrahimi</dependency> 81*3c321d95SSadaf Ebrahimi``` 82*3c321d95SSadaf Ebrahimi 83*3c321d95SSadaf Ebrahimior Gradle: 84*3c321d95SSadaf Ebrahimi 85*3c321d95SSadaf Ebrahimi```groovy 86*3c321d95SSadaf Ebrahimiimplementation("com.squareup:kotlinpoet:[version]") 87*3c321d95SSadaf Ebrahimi``` 88*3c321d95SSadaf Ebrahimi 89*3c321d95SSadaf EbrahimiSnapshots of the development version are available in [Sonatype's `snapshots` repository][snap]. 90*3c321d95SSadaf Ebrahimi 91*3c321d95SSadaf EbrahimiLicense 92*3c321d95SSadaf Ebrahimi------- 93*3c321d95SSadaf Ebrahimi 94*3c321d95SSadaf Ebrahimi Copyright 2017 Square, Inc. 95*3c321d95SSadaf Ebrahimi 96*3c321d95SSadaf Ebrahimi Licensed under the Apache License, Version 2.0 (the "License"); 97*3c321d95SSadaf Ebrahimi you may not use this file except in compliance with the License. 98*3c321d95SSadaf Ebrahimi You may obtain a copy of the License at 99*3c321d95SSadaf Ebrahimi 100*3c321d95SSadaf Ebrahimi https://www.apache.org/licenses/LICENSE-2.0 101*3c321d95SSadaf Ebrahimi 102*3c321d95SSadaf Ebrahimi Unless required by applicable law or agreed to in writing, software 103*3c321d95SSadaf Ebrahimi distributed under the License is distributed on an "AS IS" BASIS, 104*3c321d95SSadaf Ebrahimi WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 105*3c321d95SSadaf Ebrahimi See the License for the specific language governing permissions and 106*3c321d95SSadaf Ebrahimi limitations under the License. 107*3c321d95SSadaf Ebrahimi 108*3c321d95SSadaf Ebrahimi [kdoc]: https://square.github.io/kotlinpoet/1.x/kotlinpoet/kotlinpoet/com.squareup.kotlinpoet/ 109*3c321d95SSadaf Ebrahimi [javapoet]: https://github.com/square/javapoet/ 110*3c321d95SSadaf Ebrahimi [explicit-api]: https://kotlinlang.org/docs/whatsnew14.html#explicit-api-mode-for-library-authors 111*3c321d95SSadaf Ebrahimi [version-shield]: https://img.shields.io/maven-central/v/com.squareup/kotlinpoet 112*3c321d95SSadaf Ebrahimi [dl]: https://search.maven.org/remote_content?g=com.squareup&a=kotlinpoet-jvm&v=LATEST 113*3c321d95SSadaf Ebrahimi [snap]: https://s01.oss.sonatype.org/content/repositories/snapshots/com/squareup/kotlinpoet/ 114