fix(serialize-xml): Actually report next value (not name) for array elements in XmlReader

This commit is contained in:
Johannes Frohnmeyer 2024-04-17 11:06:51 +02:00
parent bf5506d1d0
commit 958a1316af
Signed by: Johannes
GPG Key ID: E76429612C2929F4
1 changed files with 29 additions and 8 deletions

View File

@ -89,7 +89,7 @@ public class XmlReader extends SerializeReader<IOException, XmlReader> implement
if (p == PEEKED_NONE) {
p = doPeek();
}
if (p != PEEKED_BEGIN_OBJECT) throw unexpectedTokenError("an array");
if (p != PEEKED_BEGIN_ARRAY && !(p == PEEKED_NAME_BEGIN_ARRAY && stack[stackSize - 1] != WrapperScope.OBJECT)) throw unexpectedTokenError("an array");
nextTagName = nextTagNamePath = null;
push(WrapperScope.ARRAY);
pathIndices[stackSize - 1] = 0;
@ -118,7 +118,8 @@ public class XmlReader extends SerializeReader<IOException, XmlReader> implement
if (p == PEEKED_NONE) {
p = doPeek();
}
if (p != PEEKED_BEGIN_OBJECT) throw unexpectedTokenError("an object");
if (p != PEEKED_BEGIN_OBJECT && !(p == PEEKED_NAME_BEGIN_OBJECT && stack[stackSize - 1] != WrapperScope.OBJECT))
throw unexpectedTokenError("an object");
nextTagName = nextTagNamePath = null;
push(WrapperScope.OBJECT);
peeked = PEEKED_NONE;
@ -152,7 +153,11 @@ public class XmlReader extends SerializeReader<IOException, XmlReader> implement
p = doPeek();
}
return switch (p) {
case PEEKED_NAME_BEGIN_ARRAY, PEEKED_NAME_BEGIN_OBJECT, PEEKED_NAME_ATT, PEEKED_NAME_TAG, PEEKED_NAME_VIRTUAL_TEXT, PEEKED_NAME_VIRTUAL_CDATA -> Token.NAME;
case PEEKED_NAME_ATT, PEEKED_NAME_TAG -> Token.NAME;
case PEEKED_NAME_VIRTUAL_CDATA -> stack[stackSize - 1] == WrapperScope.OBJECT ? Token.NAME : heuristics.guessValueKind(getPath(), XmlToken.CDATA);
case PEEKED_NAME_VIRTUAL_TEXT -> stack[stackSize - 1] == WrapperScope.OBJECT ? Token.NAME : heuristics.guessValueKind(getPath(), XmlToken.TEXT);
case PEEKED_NAME_BEGIN_OBJECT -> stack[stackSize - 1] == WrapperScope.OBJECT ? Token.NAME : Token.BEGIN_OBJECT;
case PEEKED_NAME_BEGIN_ARRAY -> stack[stackSize - 1] == WrapperScope.OBJECT ? Token.NAME : Token.BEGIN_ARRAY;
case PEEKED_BEGIN_OBJECT -> Token.BEGIN_OBJECT;
case PEEKED_BEGIN_ARRAY -> Token.BEGIN_ARRAY;
case PEEKED_END_OBJECT -> Token.END_OBJECT;
@ -239,7 +244,7 @@ public class XmlReader extends SerializeReader<IOException, XmlReader> implement
stackSize--;
yield PEEKED_END_OBJECT;
}
case WrapperScope.OBJECT_VALUE_WRAPPER -> {
case WrapperScope.OBJECT_VALUE_WRAPPER_USED -> {
stackSize--;
reader.endTag();
yield doPeek();
@ -270,16 +275,20 @@ public class XmlReader extends SerializeReader<IOException, XmlReader> implement
}
case PEEKED_NAME_VIRTUAL_TEXT -> {
String result = heuristics.guessElementName(reader.getPath(), XmlToken.TEXT);
peeked = PEEKED_NONE;
peeked = PEEKED_TEXT;
yield result;
}
case PEEKED_NAME_VIRTUAL_CDATA -> {
String result = heuristics.guessElementName(reader.getPath(), XmlToken.CDATA);
peeked = PEEKED_NONE;
peeked = PEEKED_CDATA;
yield result;
}
case PEEKED_NAME_BEGIN_OBJECT, PEEKED_NAME_BEGIN_ARRAY -> {
peeked = PEEKED_NONE;
case PEEKED_NAME_BEGIN_OBJECT -> {
peeked = PEEKED_BEGIN_OBJECT;
yield nextTagName;
}
case PEEKED_NAME_BEGIN_ARRAY -> {
peeked = PEEKED_BEGIN_ARRAY;
yield nextTagName;
}
default -> throw unexpectedTokenError("a name");
@ -342,6 +351,18 @@ public class XmlReader extends SerializeReader<IOException, XmlReader> implement
case PEEKED_ATT_VALUE -> reader.nextAttributeValue();
case PEEKED_TEXT -> reader.nextText();
case PEEKED_CDATA -> reader.nextCData();
case PEEKED_NAME_VIRTUAL_TEXT -> {
if (stack[stackSize - 1] == WrapperScope.OBJECT) {
throw unexpectedTokenError(kind);
}
yield reader.nextText();
}
case PEEKED_NAME_VIRTUAL_CDATA -> {
if (stack[stackSize - 1] == WrapperScope.OBJECT) {
throw unexpectedTokenError(kind);
}
yield reader.nextCData();
}
default -> throw unexpectedTokenError(kind);
};
peeked = PEEKED_NONE;