Skip to content

Commit

Permalink
Add generated function for creating Bundles w/o associated Intent or …
Browse files Browse the repository at this point in the history
…Fragment. Closes #30
  • Loading branch information
cedrickcooke committed Sep 28, 2020
1 parent e920866 commit a5b2f45
Show file tree
Hide file tree
Showing 6 changed files with 315 additions and 83 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.juul.exercise.compile.generator.code

import com.juul.exercise.compile.Parameters
import com.juul.exercise.compile.addFunction
import com.juul.exercise.compile.asBundleOf
import com.juul.exercise.compile.asParameterSpecs
import com.juul.exercise.compile.bundleTypeName
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.FileSpec
import com.squareup.kotlinpoet.ParameterSpec
import com.squareup.kotlinpoet.buildCodeBlock
import javax.lang.model.element.Element

internal class BundleCodeGenerator(
private val originatingElement: Element,
private val targetClass: ClassName,
private val params: Parameters,
vararg parameterToPrefix: Pair<ParameterSpec, CodeBlock>
) : CodeGenerator {

private val parameterToPrefix = parameterToPrefix.takeUnless { it.isEmpty() } ?: arrayOf(null to null)

private val functionName = "bundleFor${targetClass.simpleName}"

override fun addTo(fileSpec: FileSpec.Builder) {
for ((parameter, prefix) in parameterToPrefix) {
fileSpec.addFunction(functionName) {
originatingElements += originatingElement
returns(bundleTypeName)
if (parameter != null) {
addParameter(parameter)
}
addParameters(params.asParameterSpecs())
addStatement("return %L", params.asBundleOf(prefix))
}
}
}

fun getCallBlock(prefix: CodeBlock? = null): CodeBlock = with(this.params.all) {
when {
isEmpty() && prefix == null -> CodeBlock.of("%L()", functionName)
isEmpty() -> CodeBlock.of("%L(%L)", functionName, prefix)
else -> buildCodeBlock {
add("%L(⇥\n", functionName)
if (prefix != null) {
add("%L,\n", prefix)
}
for ((index, param) in withIndex()) {
add("%L", param.name)
if (index + 1 != size) add(",\n")
}
add("\n⇤)")
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.juul.exercise.compile.generator.code

import com.juul.exercise.compile.Parameters
import com.juul.exercise.compile.addFunction
import com.juul.exercise.compile.asBundleOf
import com.juul.exercise.compile.asParameterSpecs
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.FileSpec
Expand All @@ -14,15 +13,17 @@ internal class NewFragmentFunctionCodeGenerator(
private val params: Parameters
) : CodeGenerator {

private val bundleCodeGenerator = BundleCodeGenerator(originatingElement, targetClass, params)

override fun addTo(fileSpec: FileSpec.Builder) {
bundleCodeGenerator.addTo(fileSpec)
fileSpec.addFunction("new${targetClass.simpleName}") {
originatingElements += originatingElement
returns(targetClass)
addParameters(params.asParameterSpecs())
addStatement("val instance = %T()", targetClass)
beginControlFlow("return instance.apply")
addCode("arguments = %L\n", params.asBundleOf())
endControlFlow()
addCode("instance.arguments = %L\n", bundleCodeGenerator.getCallBlock())
addStatement("return instance")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ package com.juul.exercise.compile.generator.code
import com.juul.exercise.compile.Parameters
import com.juul.exercise.compile.addClass
import com.juul.exercise.compile.addConstructor
import com.juul.exercise.compile.asBundleOf
import com.juul.exercise.compile.asParameterSpecs
import com.juul.exercise.compile.contextTypeName
import com.juul.exercise.compile.intentTypeName
import com.juul.exercise.compile.stringTypeName
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.FileSpec
import com.squareup.kotlinpoet.ParameterSpec
import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.TypeSpec
import javax.lang.model.element.Element
Expand All @@ -21,13 +21,24 @@ internal class ParameterizedIntentClassCodeGenerator(
private val params: Parameters
) : CodeGenerator {

private val requiredParameterOptions = arrayOf(
ParameterSpec("context", contextTypeName) to CodeBlock.of("context.packageName"),
ParameterSpec("packageName", stringTypeName) to CodeBlock.of("packageName")
)

private val bundleCodeGenerator = BundleCodeGenerator(
originatingElement, targetClass, params, *requiredParameterOptions
)

override fun addTo(fileSpec: FileSpec.Builder) {
bundleCodeGenerator.addTo(fileSpec)
val className = ClassName(fileSpec.packageName, "${targetClass.simpleName}Intent")
fileSpec.addClass(className) {
originatingElements += originatingElement
superclass(intentTypeName)
addIntentConstructor("context", contextTypeName, CodeBlock.of("context.packageName"))
addIntentConstructor("packageName", stringTypeName, CodeBlock.of("packageName"))
for ((parameter, prefix) in requiredParameterOptions) {
addIntentConstructor(parameter.name, parameter.type, prefix)
}
}
}

Expand All @@ -41,7 +52,7 @@ internal class ParameterizedIntentClassCodeGenerator(
addParameters(params.asParameterSpecs())
addStatement("setClassName(%L, %S)", packageNameArgument, targetClass)
if (params.all.isNotEmpty()) {
addCode("replaceExtras(%L)\n", params.asBundleOf(argumentToPackageName))
addCode("replaceExtras(%L)\n", bundleCodeGenerator.getCallBlock(argumentToPackageName))
}
}
}
Loading

0 comments on commit a5b2f45

Please sign in to comment.