Skip to content

Commit d235f9a

Browse files
committed
Factor out common code in JavaNavWriter
1 parent 7444f78 commit d235f9a

1 file changed

Lines changed: 39 additions & 54 deletions

File tree

‎navigation/navigation-safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/java/JavaNavWriter.kt‎

Lines changed: 39 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,7 @@ class JavaNavWriter(private val useAndroidX: Boolean = true) : NavWriter<JavaCod
198198
?: throw IllegalStateException("Destination with arguments must have name")
199199
val className = ClassName.get(destName.packageName(), "${destName.simpleName()}Args")
200200
val args = destination.args
201-
val specs =
202-
ClassWithArgsSpecs(args, annotations)
201+
val specs = ClassWithArgsSpecs(args, annotations)
203202

204203
val fromBundleMethod = MethodSpec.methodBuilder("fromBundle").apply {
205204
addAnnotation(annotations.NONNULL_CLASSNAME)
@@ -216,34 +215,9 @@ class JavaNavWriter(private val useAndroidX: Boolean = true) : NavWriter<JavaCod
216215
addStatement("$T $N = new $T()", className, result, className)
217216
addStatement("$N.setClassLoader($T.class.getClassLoader())", bundle, className)
218217
args.forEach { arg ->
219-
beginControlFlow("if ($N.containsKey($S))", bundle, arg.name).apply {
220-
addStatement("$T $N", arg.type.typeName(), arg.sanitizedName)
218+
addReadSingleArgBlock("containsKey", bundle, result, arg, specs) {
221219
arg.type.addBundleGetStatement(this, arg, arg.sanitizedName, bundle)
222-
addNullCheck(arg, arg.sanitizedName)
223-
addStatement(
224-
"$result.$N.put($S, $N)",
225-
specs.hashMapFieldSpec,
226-
arg.name,
227-
arg.sanitizedName
228-
)
229-
}
230-
if (arg.defaultValue == null) {
231-
nextControlFlow("else")
232-
addStatement(
233-
"throw new $T($S)", IllegalArgumentException::class.java,
234-
"Required argument \"${arg.name}\" is missing and does " +
235-
"not have an android:defaultValue"
236-
)
237-
} else {
238-
nextControlFlow("else")
239-
addStatement(
240-
"$result.$N.put($S, $L)",
241-
specs.hashMapFieldSpec,
242-
arg.name,
243-
arg.defaultValue.write()
244-
)
245220
}
246-
endControlFlow()
247221
}
248222
addStatement("return $N", result)
249223
}.build()
@@ -262,34 +236,9 @@ class JavaNavWriter(private val useAndroidX: Boolean = true) : NavWriter<JavaCod
262236
val result = "__result"
263237
addStatement("$T $N = new $T()", className, result, className)
264238
args.forEach { arg ->
265-
beginControlFlow("if ($N.contains($S))", savedStateHandle, arg.name).apply {
266-
addStatement("$T $N", arg.type.typeName(), arg.sanitizedName)
239+
addReadSingleArgBlock("contains", savedStateHandle, result, arg, specs) {
267240
addStatement("$N = $N.get($S)", arg.sanitizedName, savedStateHandle, arg.name)
268-
addNullCheck(arg, arg.sanitizedName)
269-
addStatement(
270-
"$result.$N.put($S, $N)",
271-
specs.hashMapFieldSpec,
272-
arg.name,
273-
arg.sanitizedName
274-
)
275241
}
276-
if (arg.defaultValue == null) {
277-
nextControlFlow("else")
278-
addStatement(
279-
"throw new $T($S)", java.lang.IllegalArgumentException::class.java,
280-
"Required argument \"${arg.name}\" is missing and does " +
281-
"not have an android:defaultValue"
282-
)
283-
} else {
284-
nextControlFlow("else")
285-
addStatement(
286-
"$result.$N.put($S, $L)",
287-
specs.hashMapFieldSpec,
288-
arg.name,
289-
arg.defaultValue.write()
290-
)
291-
}
292-
endControlFlow()
293242
}
294243
addStatement("return $N", result)
295244
}.build()
@@ -355,6 +304,42 @@ class JavaNavWriter(private val useAndroidX: Boolean = true) : NavWriter<JavaCod
355304

356305
return JavaFile.builder(className.packageName(), typeSpec).build().toCodeFile()
357306
}
307+
308+
private fun MethodSpec.Builder.addReadSingleArgBlock(
309+
containsMethodName: String,
310+
sourceVariableName: String,
311+
targetVariableName: String,
312+
arg: Argument,
313+
specs: ClassWithArgsSpecs,
314+
addGetStatement: MethodSpec.Builder.() -> Unit
315+
) {
316+
beginControlFlow("if ($N.$containsMethodName($S))", sourceVariableName, arg.name)
317+
addStatement("$T $N", arg.type.typeName(), arg.sanitizedName)
318+
addGetStatement()
319+
addNullCheck(arg, arg.sanitizedName)
320+
addStatement(
321+
"$targetVariableName.$N.put($S, $N)",
322+
specs.hashMapFieldSpec,
323+
arg.name,
324+
arg.sanitizedName
325+
)
326+
nextControlFlow("else")
327+
if (arg.defaultValue == null) {
328+
addStatement(
329+
"throw new $T($S)", IllegalArgumentException::class.java,
330+
"Required argument \"${arg.name}\" is missing and does not have an " +
331+
"android:defaultValue"
332+
)
333+
} else {
334+
addStatement(
335+
"$targetVariableName.$N.put($S, $L)",
336+
specs.hashMapFieldSpec,
337+
arg.name,
338+
arg.defaultValue.write()
339+
)
340+
}
341+
endControlFlow()
342+
}
358343
}
359344

360345
private class ClassWithArgsSpecs(

0 commit comments

Comments
 (0)