Skip to content

Instantly share code, notes, and snippets.

@LennyLizowzskiy
Created August 2, 2023 09:32
Show Gist options
  • Save LennyLizowzskiy/5ee6a71a477af114801df7ec850923cb to your computer and use it in GitHub Desktop.
Save LennyLizowzskiy/5ee6a71a477af114801df7ec850923cb to your computer and use it in GitHub Desktop.
import com.squareup.kotlinpoet.AnnotationSpec
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.FileSpec
import com.squareup.kotlinpoet.FunSpec
import com.squareup.kotlinpoet.KModifier
import com.squareup.kotlinpoet.ParameterSpec
import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.TypeSpec
// PropertySpec
inline fun <reified T> property(
name: String,
builder: PropertySpec.Builder.() -> Unit = {}
) = PropertySpec
.builder(name, T::class)
.apply(builder)
.build()
inline fun <reified T> property(
name: String,
vararg modifiers: KModifier,
builder: PropertySpec.Builder.() -> Unit = {}
) = PropertySpec
.builder(name, T::class, *modifiers)
.apply(builder)
.build()
// ParameterSpec
inline fun <reified Type> parameter(
name: String,
builder: ParameterSpec.Builder.() -> Unit = {}
) = ParameterSpec
.builder(name, Type::class)
.apply(builder)
.build()
inline fun <reified Type> parameter(
name: String,
vararg modifiers: KModifier,
builder: ParameterSpec.Builder.() -> Unit = {}
) = ParameterSpec
.builder(name, Type::class, *modifiers)
.apply(builder)
.build()
inline fun <reified Type> unnamedParameter() =
ParameterSpec.unnamed(Type::class)
//fun parameterSpecFrom(variable: VariableElement) =
// ParameterSpec.get(variable)
//fun parameterSpecsFrom(method: ExecutableElement) =
// ParameterSpec.parametersOf()
// FunSpec
fun function(
name: String,
builder: FunSpec.Builder.() -> Unit
) = FunSpec.builder(name)
.apply(builder)
.build()
fun getter(
builder: FunSpec.Builder.() -> Unit
) = FunSpec.getterBuilder()
.apply(builder)
.build()
fun setter(
newValueParameter: ParameterSpec,
builder: FunSpec.Builder.() -> Unit
) = FunSpec.setterBuilder()
.apply {
addParameter(newValueParameter)
builder()
}
.build()
fun constructor(
builder: FunSpec.Builder.() -> Unit
) = FunSpec.constructorBuilder()
.apply(builder)
.build()
//fun overridingFunSpec(
// method: ExecutableElement,
//) = FunSpec.overriding()
// FileSpec
fun file(
className: ClassName,
builder: FileSpec.Builder.() -> Unit
) = FileSpec.builder(className)
.apply(builder)
.build()
fun file(
packageName: String,
fileName: String,
builder: FileSpec.Builder.() -> Unit
) = FileSpec.builder(packageName, fileName)
.apply(builder)
.build()
fun scriptFile(
fileName: String,
packageName: String = "",
builder: FileSpec.Builder.() -> Unit
) = FileSpec.scriptBuilder(fileName, packageName)
.apply(builder)
.build()
// CodeBlock
fun code(
builder: CodeBlock.Builder.() -> Unit
) = CodeBlock.builder()
.apply(builder)
.build()
// TypeSpec
fun basicClass(name: String, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.classBuilder(name).apply(builder).build()
fun annotationClass(name: String, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.annotationBuilder(name).apply(builder).build()
fun annotationClass(className: ClassName, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.annotationBuilder(className).apply(builder).build()
fun anonymousClass(builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.anonymousClassBuilder().apply(builder).build()
fun basicObject(name: String, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.objectBuilder(name).apply(builder).build()
fun basicObject(className: ClassName, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.objectBuilder(className).apply(builder).build()
fun companionObject(name: String? = null, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.companionObjectBuilder(name).apply(builder).build()
fun enumClass(name: String, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.enumBuilder(name).apply(builder).build()
fun enumClass(className: ClassName, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.enumBuilder(className).apply(builder).build()
fun expectClass(name: String, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.expectClassBuilder(name).apply(builder).build()
fun expectClass(className: ClassName, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.expectClassBuilder(className).apply(builder).build()
fun basicInterface(name: String, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.interfaceBuilder(name).apply(builder).build()
fun basicInterface(className: ClassName, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.interfaceBuilder(className).apply(builder).build()
fun funInterface(name: String, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.funInterfaceBuilder(name).apply(builder).build()
fun funInterface(className: ClassName, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.funInterfaceBuilder(className).apply(builder).build()
fun valueClass(name: String, builder: TypeSpec.Builder.() -> Unit): TypeSpec =
TypeSpec.valueClassBuilder(name).apply(builder).build()
// AnnotationSpec
inline fun <reified T : Annotation> annotation(
builder: AnnotationSpec.Builder.() -> Unit
) = AnnotationSpec.builder(T::class)
.apply(builder)
.build()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment