-
-
Notifications
You must be signed in to change notification settings - Fork 1
Dsl Processor Annotations
Jacob Rein edited this page May 5, 2020
·
4 revisions
//To allow kapt
apply plugin: 'kotlin-kapt'
//For the Annotations
implementation 'com.github.jakepurple13.HelpfulTools:dslannotations:{version}'
//For the actual generation
kapt "com.github.jakepurple13.HelpfulTools:dslprocessor:{version}"
Example:
@DslMarker
annotation class PersonMarker
@DslMarker
annotation class PersonMarker2
data class Person(val name: String, var age: Int, private val birthday: (Int) -> Int) {
fun birthday() {
age = birthday(age)
}
}
@DslClass(PersonMarker2::class)
class PersonBuilder {
@DslField("birthdayParty", comment = "Set what happens on his birthday party")
var birthday: (Int) -> Int = { it }
@DslField(dslMarker = PersonMarker::class)
var name: String = ""
var age = 0
private fun build() = Person(name, age, birthday)
companion object {
fun builder(block: PersonBuilder.() -> Unit) = PersonBuilder().apply(block).build()
}
}
Generates:
/**
* Set what happens on his birthday party
*/
@DslFieldMarker
fun PersonBuilder.birthdayParty(block: Function1<Int, Int>) {
birthday = block
}
@PersonMarker
fun PersonBuilder.name(block: String) {
name = block
}
@PersonMarker2
fun PersonBuilder.age(block: Int) {
age = block
}
This even works in Java:
@DslMarker
public @interface JavaDslMarker {
}
@DslClass(dslMarker = JavaDslMarker.class)
public class JavaDslBuilder {
int num = 4;
@DslField(name = "javaName", comment = "This is a java one")
String name = "";
Function0<Unit> function = () -> null;
@DslField(name = "functionOne", comment = "This is a java one")
Function0<Unit> function1 = () -> null;
static void javaDslBuild(Function1<JavaDslBuilder, Unit> block) {
JavaDslBuilder dsl = new JavaDslBuilder();
block.invoke(dsl);
dsl.function.invoke();
dsl.function1.invoke();
}
}
Generates:
@JavaDslMarker
fun JavaDslBuilder.function(block: Function0<Unit>) {
function = block
}
@JavaDslMarker
fun JavaDslBuilder.num(block: Int) {
num = block
}
/**
* This is a java one
*/
@DslFieldMarker
fun JavaDslBuilder.javaName(block: String) {
name = block
}
/**
* This is a java one
*/
@DslFieldMarker
fun JavaDslBuilder.functionOne(block: Function0<Unit>) {
function1 = block
}