Skip to content

Commit 64d9a2e

Browse files
committed
tests for annotationprocessor + kt versions running
1 parent d923beb commit 64d9a2e

File tree

12 files changed

+282
-243
lines changed

12 files changed

+282
-243
lines changed

autovalue/src/main/java/com/tickaroo/tikxml/autovalue/AutoValueTypeAdapterCodeGenerator.kt

+205-187
Large diffs are not rendered by default.

core/src/main/java/com/tickaroo/tikxml/TikXml.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public <T> T read(BufferedSource source, Type clazz) throws IOException {
110110
reader.beginElement();
111111
reader.nextElementName(); // We don't care about the name of the root tag
112112

113-
T value = (T)config.getTypeAdapter(clazz).fromXml(reader, config);
113+
T value = (T)config.getTypeAdapter(clazz).fromXml(reader, config, false);
114114

115115
reader.endElement();
116116

core/src/main/java/com/tickaroo/tikxml/typeadapter/DelegatingTypeAdapter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ protected void assignTextContent(TikXmlConfig config, String textContent, T valu
6969
}
7070

7171
@Override
72-
public T fromXml(XmlReader reader, TikXmlConfig config) throws IOException {
72+
public T fromXml(XmlReader reader, TikXmlConfig config, boolean isGenericList) throws IOException {
7373

7474
//
7575
// New instance

core/src/main/java/com/tickaroo/tikxml/typeadapter/TypeAdapter.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,11 @@ public interface TypeAdapter<T> {
5353
*
5454
* @param reader The {@link XmlReader} to read the xml document
5555
* @param config The {@link TikXmlConfig} where you can access {@link TypeConverter} etc.
56+
* @param isGenericList reader has the generic list as current element
5657
* @return The instantiated java object of type T
5758
* @throws IOException
5859
*/
59-
T fromXml(XmlReader reader, TikXmlConfig config) throws IOException;
60+
T fromXml(XmlReader reader, TikXmlConfig config, boolean isGenericList) throws IOException;
6061

6162
/**
6263
* Writes a java object as xml

core/src/main/java/com/tickaroo/tikxml/typeadapter/TypeAdapterRetriever.java

-10
This file was deleted.

processor/src/main/java/com/tickaroo/tikxml/processor/field/ElementField.kt

+2-4
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,16 @@ open class ElementField(element: VariableElement, name: String) : NamedField(ele
4242
override fun isXmlElementAccessableFromOutsideTypeAdapter() = false
4343

4444
override fun generateReadXmlCode(codeGeneratorHelper: CodeGeneratorHelper): TypeSpec {
45-
4645
val fromXmlMethod = codeGeneratorHelper.fromXmlMethodBuilder()
4746
.addCode(accessResolver.resolveAssignment(
48-
"(\$T)${CodeGeneratorHelper.tikConfigParam}.getTypeAdapter(\$T.class).fromXml(${CodeGeneratorHelper.readerParam}, ${CodeGeneratorHelper.tikConfigParam})",
47+
"(\$T)${CodeGeneratorHelper.tikConfigParam}.getTypeAdapter(\$T.class).fromXml(${CodeGeneratorHelper.readerParam}, ${CodeGeneratorHelper.tikConfigParam}, false)",
4948
ClassName.get(element.asType()), ClassName.get(element.asType())))
5049
.build()
5150

5251
return TypeSpec.anonymousClassBuilder("")
5352
.addSuperinterface(codeGeneratorHelper.childElementBinderType)
5453
.addMethod(fromXmlMethod)
5554
.build()
56-
5755
}
5856

5957
override fun generateWriteXmlCode(codeGeneratorHelper: CodeGeneratorHelper): CodeBlock {
@@ -74,7 +72,7 @@ class ListElementField(element: VariableElement, name: String, private val gener
7472
val valueTypeAsArrayList = ParameterizedTypeName.get(ClassName.get(ArrayList::class.java), ClassName.get(genericListType))
7573

7674
val valueFromAdapter =
77-
" ${CodeGeneratorHelper.tikConfigParam}.getTypeAdapter(\$T.class).fromXml(${CodeGeneratorHelper.readerParam}, ${CodeGeneratorHelper.tikConfigParam})"
75+
" ${CodeGeneratorHelper.tikConfigParam}.getTypeAdapter(\$T.class).fromXml(${CodeGeneratorHelper.readerParam}, ${CodeGeneratorHelper.tikConfigParam}, false)"
7876

7977
val fromXmlMethod = codeGeneratorHelper.fromXmlMethodBuilder()
8078
.addCode(CodeBlock.builder()

processor/src/main/java/com/tickaroo/tikxml/processor/field/PolymorphicElementField.kt

+2
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ class PolymorphicSubstitutionListField(element: VariableElement, typeMirror: Typ
118118
val valueTypeAsArrayList =
119119
ParameterizedTypeName.get(ClassName.get(ArrayList::class.java), ClassName.get(genericListTypeMirror))
120120

121+
122+
121123
val valueFromAdapter =
122124
"${CodeGeneratorHelper.tikConfigParam}.getTypeAdapter(\$T.class).fromXml(${CodeGeneratorHelper.readerParam}, ${CodeGeneratorHelper.tikConfigParam})"
123125

processor/src/main/java/com/tickaroo/tikxml/processor/generator/CodeGeneratorHelper.kt

+5-3
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class CodeGeneratorHelper(
7373
const val textContentParam = "textContent"
7474
const val readerParam = "reader"
7575
const val writerParam = "writer"
76+
const val isGenericListParam = "isGenericList"
7677
const val attributeBindersParam = "attributeBinders"
7778
const val childElementBindersParam = "childElementBinders"
7879

@@ -237,7 +238,6 @@ class CodeGeneratorHelper(
237238
return builder.build()
238239
}
239240

240-
241241
/**
242242
* get the assignment statement for reading attributes
243243
*/
@@ -303,8 +303,10 @@ class CodeGeneratorHelper(
303303
initializerBuilder.addStatement("$childElementBindersParam = new \$T()", childBinderTypeMap)
304304

305305
for ((xmlName, xmlElement) in element.childElements) {
306-
if (xmlElement.generateGenericChildBinder) {
307-
val childElementBinderName = "${xmlElement.childElements.values.first().element.simpleName}ChildElementBinder"
306+
if (xmlElement is PolymorphicSubstitutionListField || xmlElement.generateGenericChildBinder) {
307+
val childElementBinderPrefix =
308+
if (xmlElement.generateGenericChildBinder) xmlElement.childElements.values.first().element.simpleName else (element as? PlaceholderXmlElement)?.name
309+
val childElementBinderName = "${childElementBinderPrefix}ChildElementBinder"
308310
initializerBuilder.addStatement("${childElementBindersParam}.put(\$S, \$N)", xmlName, childElementBinderName)
309311
} else {
310312
initializerBuilder.addStatement("${childElementBindersParam}.put(\$S, \$L)", xmlName,

processor/src/main/java/com/tickaroo/tikxml/processor/generator/GenericAdapterCodeGenerator.kt

+14-11
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,19 @@ package com.tickaroo.tikxml.processor.generator
22

33
import com.squareup.javapoet.ClassName
44
import com.squareup.javapoet.CodeBlock
5-
import com.squareup.javapoet.FieldSpec
65
import com.squareup.javapoet.JavaFile
76
import com.squareup.javapoet.MethodSpec
87
import com.squareup.javapoet.ParameterizedTypeName
98
import com.squareup.javapoet.TypeName
109
import com.squareup.javapoet.TypeSpec
1110
import com.tickaroo.tikxml.TikXmlConfig
12-
import com.tickaroo.tikxml.TypeAdapterNotFoundException
1311
import com.tickaroo.tikxml.XmlReader
1412
import com.tickaroo.tikxml.XmlWriter
1513
import com.tickaroo.tikxml.typeadapter.TypeAdapter
16-
import com.tickaroo.tikxml.typeadapter.TypeAdapterRetriever
1714
import java.io.IOException
18-
import java.util.HashMap
1915
import java.util.Locale
2016
import javax.annotation.processing.Filer
2117
import javax.annotation.processing.FilerException
22-
import javax.lang.model.element.Modifier.FINAL
23-
import javax.lang.model.element.Modifier.PRIVATE
2418
import javax.lang.model.element.Modifier.PUBLIC
2519

2620
@ExperimentalStdlibApi
@@ -58,8 +52,16 @@ class GenericAdapterCodeGenerator(private val filer: Filer) {
5852
implementationNames: Set<String>): MethodSpec {
5953
val codeBlockBuilder = CodeBlock.builder()
6054
.addStatement("\$T ${CodeGeneratorHelper.valueParam} = null", ClassName.get(packageName, className))
61-
//.beginControlFlow("if (reader.hasElement())")
62-
.addStatement("\$T elementName = reader.getCurrentElementName()", String::class.java)
55+
.addStatement("\$T elementName", String::class.java)
56+
.beginControlFlow("if (isGenericList)")
57+
.beginControlFlow("while (${CodeGeneratorHelper.readerParam}.hasAttribute())")
58+
.addStatement("${CodeGeneratorHelper.readerParam}.skipAttribute()")
59+
.endControlFlow()
60+
.addStatement("${CodeGeneratorHelper.readerParam}.beginElement()")
61+
.addStatement("elementName = reader.nextElementName()")
62+
.nextControlFlow("else")
63+
.addStatement("elementName = reader.getCurrentElementName()")
64+
.endControlFlow()
6365

6466
implementationNames.forEachIndexed { index, implementationName ->
6567
val lastIndexOfPoint = implementationName.lastIndexOf(".")
@@ -70,7 +72,7 @@ class GenericAdapterCodeGenerator(private val filer: Filer) {
7072
codeBlockBuilder.run {
7173
val equalsCheck = "elementName.equals(\"${implClassName.decapitalize(Locale.GERMANY)}\")"
7274
if (index == 0) beginControlFlow("if ($equalsCheck)") else nextControlFlow("else if ($equalsCheck)")
73-
addStatement("${CodeGeneratorHelper.valueParam} = (\$T) config.getTypeAdapter(\$T.class).fromXml(reader, config)", implTypeName, implTypeName)
75+
addStatement("${CodeGeneratorHelper.valueParam} = (\$T) config.getTypeAdapter(\$T.class).fromXml(reader, config, false)", implTypeName, implTypeName)
7476
}
7577
/*val lastIndexOfPoint = implementationName.lastIndexOf(".")
7678
val packageName = implementationName.substring(0, lastIndexOfPoint)
@@ -94,9 +96,9 @@ class GenericAdapterCodeGenerator(private val filer: Filer) {
9496
.nextControlFlow("else if (${CodeGeneratorHelper.tikConfigParam}.exceptionOnUnreadXml())")
9597
.addStatement("throw new \$T(\"Could not map the xml element with the tag name <\" + elementName + \"> at path '\" + reader.getPath()+\"' to java class. Have you annotated such a field in your java class to map this xml attribute? Otherwise you can turn this error message off with TikXml.Builder().exceptionOnUnreadXml(false).build().\")", IOException::class.java)
9698
.nextControlFlow("else")
97-
.addStatement("${CodeGeneratorHelper.readerParam}.beginElement()")
99+
//.addStatement("${CodeGeneratorHelper.readerParam}.beginElement()")
98100
.addStatement("${CodeGeneratorHelper.readerParam}.skipRemainingElement()")
99-
.addStatement("${CodeGeneratorHelper.readerParam}.endElement()")
101+
//.addStatement("${CodeGeneratorHelper.readerParam}.endElement()")
100102
.endControlFlow()
101103
//.endControlFlow()
102104
.build()
@@ -106,6 +108,7 @@ class GenericAdapterCodeGenerator(private val filer: Filer) {
106108
.addModifiers(PUBLIC)
107109
.addParameter(XmlReader::class.java, CodeGeneratorHelper.readerParam)
108110
.addParameter(TikXmlConfig::class.java, "config")
111+
.addParameter(Boolean::class.java, "isGenericList")
109112
.addException(IOException::class.java)
110113
.addCode(codeBlock)
111114
.addStatement("return ${CodeGeneratorHelper.valueParam}")

processor/src/main/java/com/tickaroo/tikxml/processor/generator/TypeAdapterCodeGenerator.kt

+47-24
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import com.tickaroo.tikxml.processor.field.Namespace
3232
import com.tickaroo.tikxml.processor.field.PolymorphicSubstitutionField
3333
import com.tickaroo.tikxml.processor.field.PolymorphicSubstitutionListField
3434
import com.tickaroo.tikxml.processor.utils.isList
35+
import com.tickaroo.tikxml.processor.xml.PlaceholderXmlElement
3536
import com.tickaroo.tikxml.processor.xml.XmlChildElement
3637
import com.tickaroo.tikxml.typeadapter.AttributeBinder
3738
import com.tickaroo.tikxml.typeadapter.ChildElementBinder
@@ -86,13 +87,15 @@ class TypeAdapterCodeGenerator(
8687

8788

8889
for ((xmlName, xmlElement) in annotatedClass.childElements) {
89-
if (xmlElement is PolymorphicSubstitutionField) {
90-
val childElementBinderPrefix = if (xmlElement is PolymorphicSubstitutionListField) {
91-
xmlElement.element.simpleName
92-
} else {
93-
val orginalElementTypeName = xmlElement.originalElementTypeMirror.toString().split(".").last()
94-
"${orginalElementTypeName.substring(0, 1).toLowerCase(Locale.GERMANY)}${orginalElementTypeName.substring(1,
95-
orginalElementTypeName.length)}"
90+
if (xmlElement is PolymorphicSubstitutionField || xmlElement.generateGenericChildBinder) {
91+
val childElementBinderPrefix = when (xmlElement) {
92+
is PolymorphicSubstitutionListField -> xmlElement.element.simpleName
93+
is PlaceholderXmlElement -> xmlName
94+
else -> {
95+
val orginalElementTypeName = (xmlElement as PolymorphicSubstitutionField).originalElementTypeMirror.toString().split(".").last()
96+
"${orginalElementTypeName.substring(0, 1).toLowerCase(Locale.GERMANY)}${orginalElementTypeName.substring(1,
97+
orginalElementTypeName.length)}"
98+
}
9699
}
97100
constructorBuilder.addStatement("${CodeGeneratorHelper.childElementBindersParam}.put(\$S, \$N)", xmlName,
98101
"${childElementBinderPrefix}ChildElementBinder")
@@ -214,10 +217,11 @@ class TypeAdapterCodeGenerator(
214217
isList -> {
215218
val genericListType = (firstConcreteType as PolymorphicSubstitutionListField).genericListTypeMirror
216219
fieldName = "${genericName}ChildElementBinder"
220+
217221
fromXmlMethodSpecBuilder
218-
.beginControlFlow("if (${CodeGeneratorHelper.valueParam}.$genericName == null)")
219-
.addStatement("${CodeGeneratorHelper.valueParam}.$genericName = new \$T()",
220-
ParameterizedTypeName.get(ClassName.get(ArrayList::class.java), ClassName.get(genericListType)))
222+
.beginControlFlow("if (${firstConcreteType.accessResolver.resolveGetterForReadingXml()} == null)")
223+
.addCode("${firstConcreteType.accessResolver.resolveAssignment("new \$T()",
224+
ParameterizedTypeName.get(ClassName.get(ArrayList::class.java), ClassName.get(genericListType)))}")
221225
.endControlFlow()
222226

223227
if (!isRootList) {
@@ -231,11 +235,11 @@ class TypeAdapterCodeGenerator(
231235
typeUtils.asElement(
232236
(concreteType as PolymorphicSubstitutionListField).typeMirror).simpleName.toString().toLowerCase(
233237
Locale.GERMANY) != concreteType.name.toLowerCase(Locale.GERMANY)
234-
}, fromXmlMethodSpecBuilder, genericListType, "v", !isRootList)
238+
}, fromXmlMethodSpecBuilder, genericListType, "v", true, isRootList)
235239

236240
fromXmlMethodSpecBuilder
237241
.beginControlFlow("if (v != null)")
238-
.addStatement("${CodeGeneratorHelper.valueParam}.$genericName.add(v)")
242+
.addStatement("${firstConcreteType.accessResolver.resolveGetterForReadingXml()}.add(v)")
239243
if (!isRootList) {
240244
fromXmlMethodSpecBuilder
241245
.addStatement("${CodeGeneratorHelper.readerParam}.endElement()")
@@ -255,7 +259,7 @@ class TypeAdapterCodeGenerator(
255259
typeUtils.asElement(
256260
(concreteType as PolymorphicSubstitutionField).typeMirror).simpleName.toString().toLowerCase(
257261
Locale.GERMANY) != concreteType.name.toLowerCase(Locale.GERMANY)
258-
}, fromXmlMethodSpecBuilder, genericType!!, "${CodeGeneratorHelper.valueParam}.$genericName", false)
262+
}, fromXmlMethodSpecBuilder, genericType!!, "${CodeGeneratorHelper.valueParam}.$genericName", false, isRootList)
259263
fieldName =
260264
"${(genericType as DeclaredType).asElement().simpleName.toString().decapitalize(Locale.GERMANY)}ChildElementBinder"
261265
}
@@ -282,16 +286,18 @@ class TypeAdapterCodeGenerator(
282286
fromXmlMethodSpecBuilder: MethodSpec.Builder,
283287
genericType: TypeMirror,
284288
valueParam: String,
285-
isGenericListAndNotRoot: Boolean) {
289+
isGenericList: Boolean,
290+
isRootList: Boolean) {
286291

287292
var hasSpecialMapping = false
293+
val firstConreteType = concreteTypes.first() as PolymorphicSubstitutionField
288294
concreteTypes
289295
.filter { concreteType -> filter(concreteType) }
290296
.takeIf { it.isNotEmpty() }
291297
?.forEachIndexed { index, specialNamingType ->
292298
if (!hasSpecialMapping) {
293299
hasSpecialMapping = true
294-
if (isGenericListAndNotRoot) {
300+
if (isGenericList && !isRootList) {
295301
fromXmlMethodSpecBuilder
296302
.addStatement("\$T elementName", String::class.java)
297303
.beginControlFlow("if (${CodeGeneratorHelper.readerParam}.hasElement())")
@@ -314,25 +320,41 @@ class TypeAdapterCodeGenerator(
314320

315321
val specialType = (specialNamingType as? PolymorphicSubstitutionField)?.typeMirror
316322
?: (specialNamingType as? PolymorphicSubstitutionListField)?.typeMirror ?: genericType
317-
fromXmlMethodSpecBuilder.addStatement(
318-
"$valueParam = (\$T) ${CodeGeneratorHelper.tikConfigParam}.getTypeAdapter(\$T.class).fromXml(${CodeGeneratorHelper.readerParam}, ${CodeGeneratorHelper.tikConfigParam})",
319-
specialType, specialType)
323+
if (isGenericList) {
324+
fromXmlMethodSpecBuilder
325+
.addStatement(
326+
"$valueParam = (\$T) ${CodeGeneratorHelper.tikConfigParam}.getTypeAdapter(\$T.class).fromXml(${CodeGeneratorHelper.readerParam}, ${CodeGeneratorHelper.tikConfigParam}, ${!isRootList && !hasSpecialMapping})",
327+
specialType, specialType)
328+
} else {
329+
fromXmlMethodSpecBuilder
330+
.addCode(firstConreteType.accessResolver.resolveAssignment(
331+
"(\$T) ${CodeGeneratorHelper.tikConfigParam}.getTypeAdapter(\$T.class).fromXml(${CodeGeneratorHelper.readerParam}, ${CodeGeneratorHelper.tikConfigParam}, false)",
332+
specialType, specialType))
333+
}
320334
}
321335

322336
if (hasSpecialMapping) {
323337
fromXmlMethodSpecBuilder.nextControlFlow("else")
324-
} else if (isGenericListAndNotRoot) {
338+
}
339+
/*else if (isGenericList && !isRootList) {
325340
fromXmlMethodSpecBuilder
326341
.beginControlFlow("if (${CodeGeneratorHelper.readerParam}.hasElement())")
327342
.addStatement("${CodeGeneratorHelper.readerParam}.beginElement()")
328343
.addStatement("${CodeGeneratorHelper.readerParam}.nextElementName()")
329344
.endControlFlow()
330-
}
345+
}*/
331346

332-
fromXmlMethodSpecBuilder
333-
.addStatement(
334-
"$valueParam = (\$T) ${CodeGeneratorHelper.tikConfigParam}.getTypeAdapter(\$T.class, true).fromXml(${CodeGeneratorHelper.readerParam}, ${CodeGeneratorHelper.tikConfigParam})",
335-
genericType, genericType)
347+
if (isGenericList) {
348+
fromXmlMethodSpecBuilder
349+
.addStatement(
350+
"$valueParam = (\$T) ${CodeGeneratorHelper.tikConfigParam}.getTypeAdapter(\$T.class, true).fromXml(${CodeGeneratorHelper.readerParam}, ${CodeGeneratorHelper.tikConfigParam}, ${!isRootList && !hasSpecialMapping})",
351+
genericType, genericType)
352+
} else {
353+
fromXmlMethodSpecBuilder
354+
.addCode(firstConreteType.accessResolver.resolveAssignment(
355+
"(\$T) ${CodeGeneratorHelper.tikConfigParam}.getTypeAdapter(\$T.class, true).fromXml(${CodeGeneratorHelper.readerParam}, ${CodeGeneratorHelper.tikConfigParam}, false)",
356+
genericType, genericType))
357+
}
336358

337359
if (hasSpecialMapping) {
338360
fromXmlMethodSpecBuilder.endControlFlow()
@@ -355,6 +377,7 @@ class TypeAdapterCodeGenerator(
355377
.addAnnotation(Override::class.java)
356378
.addParameter(XmlReader::class.java, reader)
357379
.addParameter(TikXmlConfig::class.java, config)
380+
.addParameter(Boolean::class.java, "isGenericList")
358381
.addException(IOException::class.java)
359382
.addStatement("\$T \$L = new \$T()", targetClassToParseInto, value, targetClassToParseInto)
360383

processor/src/main/java/com/tickaroo/tikxml/processor/xml/PlaceholderXmlElement.kt

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ package com.tickaroo.tikxml.processor.xml
2121
import com.squareup.javapoet.CodeBlock
2222
import com.squareup.javapoet.TypeSpec
2323
import com.tickaroo.tikxml.processor.field.AttributeField
24+
import com.tickaroo.tikxml.processor.field.ListElementField
2425
import com.tickaroo.tikxml.processor.generator.CodeGeneratorHelper
2526
import com.tickaroo.tikxml.processor.utils.endXmlElement
2627
import com.tickaroo.tikxml.processor.utils.getSurroundingClassQualifiedName

processor/src/main/java/com/tickaroo/tikxml/processor/xml/XmlElement.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.tickaroo.tikxml.annotation.Element
2222
import com.tickaroo.tikxml.annotation.Path
2323
import com.tickaroo.tikxml.processor.ProcessingException
2424
import com.tickaroo.tikxml.processor.field.AttributeField
25+
import com.tickaroo.tikxml.processor.field.ListElementField
2526
import com.tickaroo.tikxml.processor.field.PolymorphicSubstitutionListField
2627

2728
/**
@@ -43,7 +44,7 @@ interface XmlElement {
4344
fun hasChildElements() = childElements.isNotEmpty()
4445

4546
val generateGenericChildBinder: Boolean
46-
get() = childElements.size > 1 && childElements.all { it.value is PolymorphicSubstitutionListField }
47+
get() = childElements.isNotEmpty() && childElements.all { it.value is PolymorphicSubstitutionListField }
4748

4849
fun hasTextContent() = false
4950

0 commit comments

Comments
 (0)