kotlin code generation
play

Kotlin Code Generation Alec Strong & Jake Wharton public - PowerPoint PPT Presentation

Kotlin Code Generation Alec Strong & Jake Wharton public final class User { data class User( private final String firstName; private final String lastName; val firstName: String, private final int age; public User(String firstName,


  1. public static final class Builder extends Message.Builder<Ogre, Builder> { public String name; public List<Integer> layers; public String swamp; public Builder() { layers = Internal. newMutableList (); } public Builder name(String name) { this.name = name; return this; } public Builder layers(List<Integer> layers) { Internal. checkElementsNotNull (layers); Internal. checkElementsNotNull (layers); this.layers = layers; return this; } public Builder swamp(String swamp) { this.swamp = swamp; return this; } @Override public Ogre build() { if (name == null) { if (name == null) { throw Internal. missingRequiredFields (name, "name"); throw Internal. missingRequiredFields (name, "name"); } } return new Ogre(name, layers, swamp, super.buildUnknownFields()); } }

  2. public static final class Builder extends Message.Builder<Ogre, Builder> { public String name; public List<Integer> layers; public String swamp; public Builder() { layers = Internal. newMutableList (); } public Builder name(String name) { this.name = name; return this; } public Builder layers(List<Integer> layers) { Internal. checkElementsNotNull (layers); this.layers = layers; return this; } public Builder swamp(String swamp) { this.swamp = swamp; return this; } @Override public Ogre build() { if (name == null) { throw Internal. missingRequiredFields (name, "name"); } return new Ogre(name, layers, swamp, super.buildUnknownFields()); } }

  3. class Ogre @JvmOverloads constructor( @JvmField val name: String, @JvmField val name: String, @JvmField val layers: List<Int> @JvmField val layers: List<Int> = emptyList (), @JvmField val swamp: String? @JvmField val swamp: String? = null, unknownFields: ByteString = ByteString. EMPTY ) : Message<Ogre, Ogre.Builder>(ADAPTER, unknownFields)

  4. val shrek = Ogre( name = "shrek", layers = listOf (1, 2), swamp = null )

  5. Ogre shrek = new Ogre();

  6. Ogre shrek = new Ogre("Shrek", Arrays. asList (1, 2), "Shrek");

  7. Java Interop

  8. interface class Ogre( @JvmField val name: String, @JvmField val name: String, @JvmField val layers: List<Int> = emptyList (), @JvmField val layers: List<Int> = emptyList (), @JvmField val swamp: String? = null @JvmField val swamp: String? = null )

  9. interface Ogre { val name: String val layers: List<Int> val swamp: String? }

  10. interface Ogre { val name: String val layers: List<Int> val swamp: String? } shrek.getLayers();

  11. inline fun <reified T> Ogre.findFriendOfType(): T? { for (friend in friends ()) { if (friend is T) return friend } return null }

  12. 
 inline fun <reified T> Ogre.findFriendOfType(): T? { for (friend in friends ()) { if (friend is T) return friend } return null } 
 shrek.findFriendOfType<Donkey>()

  13. 
 inline fun <reified T> Ogre.findFriendOfType(): T? { for (friend in friends ()) { if (friend is T) return friend } return null } 
 shrek.findFriendOfType<Donkey>() shrek.<Donkey>findFriendOfType();

  14. inline fun <reified T> Ogre.findFriendOfType(): T? { for (friendain friends ()) { if (friend is T) return friend }Y returnbnull }Z

  15. fun <T> Ogre.findFriendOfType(type: Class<T>): T? { for (friend in friends ()) { if (type.isInstance(friend)) return friend as T? }B return null }A inline fun <reified T> Ogre.findFriendOfType(): T? { for (friendain friends ()) { findFriendOfType ( ::class. java ) if (friend is T) return friend }Y returnbnull }Z

  16. fun <T> Ogre.findFriendOfType(type: Class<T>): T? { for (friend in friends ()) { if (type.isInstance(friend)) return friend as T? }B return null }A inline fun <reified T> Ogre.findFriendOfType(): T? { returnb findFriendOfType (T::class. java ) }Z

  17. interface SwampChangedListener { fun swampChanged(newSwamp: String) } fun addSwampChangedListener(listener: SwampChangedListener) = …

  18. interface SwampChangedListener { fun swampChanged(newSwamp: String) }A fun addSwampChangedListener(listener: SwampChangedListener) = … shrek.addSwampChangedListener(new SwampChangedListener() { @Override public void swampChanged(@NotNull String newSwamp) {P System. out .println("What are you doing in " + newSwamp); } });

  19. interface SwampChangedListener { fun swampChanged(newSwamp: String) }A fun addSwampChangedListener(listener: SwampChangedListener) = … shrek.addSwampChangedListener(newSwamp -> {P System. out .println("What are you doing in " + newSwamp); });

  20. interface SwampChangedListener { fun swampChanged(newSwamp: String) } fun addSwampChangedListener(listener: SwampChangedListener) = …

  21. interface SwampChangedListener { fun swampChanged(newSwamp:(String): Unit } fun addSwampChangedListener(listener: SwampChangedListener) = … shrek.addSwampChangedListener(object : SwampChangedListener { override fun swampChanged(newSwamp: String) { System. out .println("What are you doing in $newSwamp") } }) KT-7770

  22. fun addSwampChangedListener(listener: (String) -> Unit) = …

  23. fun addSwampChangedListener(listener: (String) -> Unit) = … shrek.addSwampChangedListener { newSwamp -> System. out .println("What are you doing in $newSwamp") }

  24. fun addSwampChangedListener(listener: (String) -> Unit) = … shrek.addSwampChangedListener { newSwamp -> System. out .println("What are you doing in $newSwamp") } shrek.addSwampChangedListener(newSwamp -> { System. out .println("What are you doing in " + newSwamp); return Unit. INSTANCE ; }); KT-21018

  25. fun addSwampChangedListener(listener: SwampChangedListener) = … public interface SwampChangedListener { void swampChanged(String newSwamp); }Z

  26. fun addSwampChangedListener(listener: SwampChangedListener) = … shrek.addSwampChangedListener(SwampChangedListener { newSwamp -> System. out .println("What are you doing in $newSwamp") } ) public interface SwampChangedListener { void swampChanged(String newSwamp); }Z

  27. fun addSwampChangedListener(listener: SwampChangedListener) = … shrek.addSwampChangedListener(SwampChangedListener { newSwamp -> System. out .println("What are you doing in $newSwamp") } ) public interface SwampChangedListener { void swampChanged(String newSwamp); }Z shrek.addSwampChangedListener(newSwamp -> { System. out .println("What are you doing in " + newSwamp); });

  28. sealed class Optional<T : Any> data class Some<T : Any>(val value: T): Optional<T>() object None : Optional<Nothing>()

  29. sealed class Optional<T : Any> data class Some<T : Any>(val value: T): Optional<T>() object None : Optional<Nothing>() fun <T : Any> T?.asOptional() = if (this == null) None else Some(this)

  30. @file:JvmName("Optionals") sealed class Optional<T : Any> data class Some<T : Any>(val value: T): Optional<T>() object None : Optional<Nothing>() @JvmName("ofNullable") fun <T : Any> T?.asOptional() = if (this == null) None else Some(this)

  31. sealed class Optional<T : Any> { @file:JvmName("Optionals") companion object { @JvmName("ofNullable") @JvmStatic fun <T : Any> T?.asOptional() = if (this == null) None else Some(this) }Y }Z data class Some<T : Any>(val value: T): Optional<T>() object None : Optional<Nothing>() KT-15286

  32. sealed class Optional<T : Any> { companion object { @JvmStatic @JvmName fun <T : Any> ofNullable(value: T?) = value. asOptional () }Y }Z data class Some<T : Any>(val value: T): Optional<T>() object None : Optional<Nothing>() fun <T : Any> T?.asOptional() = if (this == null) None else Some(this) KT-15286

  33. @file:JvmName("-Optionals") sealed class Optional<T : Any> { companion object { @JvmStatic fun <T : Any> ofNullable(value: T?) = value. asOptional () }Y }Z data class Some<T : Any>(val value: T): Optional<T>() object None : Optional<Nothing>() fun <T : Any> T?.asOptional() = if (this == null) None else Some(this) KT-15286

  34. class Foo ( val bar: Nothing, val listBar: List<Nothing> )

  35. class Foo ( val bar: Nothing, val listBar: List<Nothing> ) Void bar = foo.getBar(); List listBar = foo.getListBar();

  36. KotlinPoet

  37. Type

  38. Type Class

  39. Type Parameterized Class Type

  40. Type String Map<String,Int>

  41. val stringClass: KClass<String> = String::class

  42. val stringClass: KClass<String> = String::class val stringName: ClassName = stringClass. asClassName ()

  43. val stringClass: KClass<String> = String::class val stringName: ClassName = stringClass. asClassName () import kotlin.String val foo: String = ""

  44. val stringClass: KClass<String> = String::class val stringName: ClassName = stringClass. asClassName () import kotlin.String val foo: String = "" class String

  45. val stringClass: KClass<String> = String::class val stringName: ClassName = stringClass. asClassName () class String { val foo: kotlin.String = "" }

  46. val stringClass: KClass<String> = String::class val stringName: ClassName = stringClass. asClassName ()

  47. val stringClass: KClass<String> = String::class val stringName: ClassName = stringClass. asClassName () val mapStringToInt = ParameterizedTypeName.get( Map::class. asTypeName (), stringName, Int::class. asTypeName ())

  48. val stringClass: KClass<String> = String::class val stringName: ClassName = stringClass. asClassName () val mapStringToInt = ParameterizedTypeName.get( Map::class. asTypeName (), stringName, Int::class. asTypeName ()) val nullableMap = mapStringToInt.asNullable()

  49. val foo = PropertySpec.builder("foo", String::class) .initializer("%S", "foo") .build()

  50. val foo = PropertySpec.builder("foo", String::class) String::class .initializer("%S", "foo") .build()

  51. val foo = PropertySpec.builder("foo", String::class) .initializer("%S", "foo") "%S", "foo" .build()

  52. val foo = PropertySpec.builder("foo", String::class) .initializer("%S", "foo") .build()

  53. val foo = PropertySpec.builder("foo", String::class) .initializer("%S", "foo") .build() println (foo) val foo: kotlin.String = "foo"X

  54. val foo = PropertySpec.builder("foo", String::class) .initializer("%S", "foo\tbar") .build() println (foo) val foo: kotlin.String = "foo\tbar"X

  55. val foo = PropertySpec.builder("foo", String::class) .initializer("%S", "foo\tbar") .build() println (foo) val foo: kotlin.String = "foo\tbar"X kotlin.String

  56. val foo = PropertySpec.builder("foo", String::class) .initializer("%S", "foo\tbar") .build() val file = FileSpec.builder("com.example", "KotlinConf.kt") .addProperty(foo) .build() println (file) foo package com.example import kotlin.String val foo: String = "foo\tbar"X

  57. PropertySpec.builder("foo", String::class) .initializer("%S", "foo\tbar") .build() package com.example import kotlin.String val foo: String = "foo\tbar"X

  58. FunSpec.builder("main") .addParameter("args", String::class, VARARG) .build() package com.example import kotlin.String fun main(vararg args: String) { }

  59. TypeSpec.classBuilder("User") .addModifiers(DATA) .build() package com.example data class User

  60. TypeSpec.classBuilder("User") .addModifiers(DATA) .build() package com.example data class User

  61. TypeSpec.classBuilder("User") .addModifiers(DATA) .addProperty(PropertySpec.builder("name", String::class).build()) .build()Z package com.example data class User {Y val name: String }X

  62. TypeSpec.classBuilder("User") .addModifiers(DATA) .addProperty(PropertySpec.builder("name", String::class).build()) .primaryConstructor(FunSpec.constructorBuilder() .addParameter("name", String::class) .build())A .build()Z package com.example data class User(name: String)G{Y val name: String }X

  63. TypeSpec.classBuilder("User") .addModifiers(DATA) .addProperty(PropertySpec.builder("name", String::class) .initializer("name") .build())B .primaryConstructor(FunSpec.constructorBuilder() .addParameter("name", String::class) .build())A .build() package com.example name: String data class User(val name: String)G

  64. TypeSpec.classBuilder("User") .addModifiers(DATA) .addProperty(PropertySpec.builder("name", String::class) .initializer("name.toLowerCase()") .build())B .primaryConstructor(FunSpec.constructorBuilder() .addParameter("name", String::class) .build())A .build() package com.example data class User(name: String)G{ val name: String = name. toLowerCase () }X

  65. FunSpec.builder("seconds") .receiver(Long::class) .returns(Duration::class) .addStatement("return %T.ofSeconds(this)", Duration::class) .build() package com.example import java.time.Duration import kotlin.Long fun Long.seconds(): Duration = Duration.ofSeconds(this)

  66. FunSpec.builder("seconds") .receiver(Long::class) .returns(Duration::class) .addStatement("require(this >= 0L)") .addStatement("return %T.ofSeconds(this)", Duration::class) .build() package com.example import java.time.Duration import kotlin.Long fun Long.seconds(): Duration { require (this >= 0L) return Duration.ofSeconds(this) }

  67. FunSpec.builder("seconds") .receiver(Long::class) .returns(Duration::class) .addStatement("require(this >= 0L)") .addStatement("return %T.ofSeconds(this)", Duration::class) .build()

  68. val longSeconds = FunSpec.builder("seconds") .receiver(Long::class) .returns(Duration::class) .addStatement("require(this >= 0L)") .addStatement("return %T.ofSeconds(this)", Duration::class) .build()

  69. val longSeconds = FunSpec.builder("seconds") .receiver(Long::class) .returns(Duration::class) .addStatement("require(this >= 0L)") .addStatement("return %T.ofSeconds(this)", Duration::class) .build() FunSpec.builder("main") .addParameter("args", String::class, VARARG) .addStatement("println(%L.%N())", 2L, longSeconds) .build()

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend