mirror of
https://github.com/lightbend/config.git
synced 2025-03-22 07:10:23 +08:00
allow one comma after last element in object or array
This commit is contained in:
parent
4051d07870
commit
178cd17dad
@ -387,7 +387,7 @@ final class Parser {
|
|||||||
while (true) {
|
while (true) {
|
||||||
Token t = nextTokenIgnoringNewline();
|
Token t = nextTokenIgnoringNewline();
|
||||||
if (t == Tokens.CLOSE_CURLY) {
|
if (t == Tokens.CLOSE_CURLY) {
|
||||||
if (afterComma) {
|
if (flavor == SyntaxFlavor.JSON && afterComma) {
|
||||||
throw parseError("expecting a field name after comma, got a close brace }");
|
throw parseError("expecting a field name after comma, got a close brace }");
|
||||||
} else if (!hadOpenCurly) {
|
} else if (!hadOpenCurly) {
|
||||||
throw parseError("unbalanced close brace '}' with no open brace");
|
throw parseError("unbalanced close brace '}' with no open brace");
|
||||||
@ -534,6 +534,10 @@ final class Parser {
|
|||||||
values.add(parseObject(true));
|
values.add(parseObject(true));
|
||||||
} else if (t == Tokens.OPEN_SQUARE) {
|
} else if (t == Tokens.OPEN_SQUARE) {
|
||||||
values.add(parseArray());
|
values.add(parseArray());
|
||||||
|
} else if (flavor != SyntaxFlavor.JSON
|
||||||
|
&& t == Tokens.CLOSE_SQUARE) {
|
||||||
|
// we allow one trailing comma
|
||||||
|
putBack(t);
|
||||||
} else {
|
} else {
|
||||||
throw parseError("List should have had new element after a comma, instead had token: "
|
throw parseError("List should have had new element after a comma, instead had token: "
|
||||||
+ t);
|
+ t);
|
||||||
|
@ -97,9 +97,20 @@ abstract trait TestUtils {
|
|||||||
"}",
|
"}",
|
||||||
"[",
|
"[",
|
||||||
"]",
|
"]",
|
||||||
|
",",
|
||||||
"10", // value not in array or object
|
"10", // value not in array or object
|
||||||
"\"foo\"", // value not in array or object
|
"\"foo\"", // value not in array or object
|
||||||
"\"", // single quote by itself
|
"\"", // single quote by itself
|
||||||
|
ParseTest(true, "[,]"), // array with just a comma in it; lift is OK with this
|
||||||
|
ParseTest(true, "[,,]"), // array with just two commas in it; lift is cool with this too
|
||||||
|
ParseTest(true, "[1,2,,]"), // array with two trailing commas
|
||||||
|
ParseTest(true, "[,1,2]"), // array with initial comma
|
||||||
|
ParseTest(true, "{ , }"), // object with just a comma in it
|
||||||
|
ParseTest(true, "{ , , }"), // object with just two commas in it
|
||||||
|
"{ 1,2 }", // object with single values not key-value pair
|
||||||
|
ParseTest(true, "{ , \"foo\" : 10 }"), // object starts with comma
|
||||||
|
ParseTest(true, "{ \"foo\" : 10 ,, }"), // object has two trailing commas
|
||||||
|
" \"a\" : 10 ,, ", // two trailing commas for braceless root object
|
||||||
"{ \"foo\" : }", // no value in object
|
"{ \"foo\" : }", // no value in object
|
||||||
"{ : 10 }", // no key in object
|
"{ : 10 }", // no key in object
|
||||||
" \"foo\" : ", // no value in object with no braces
|
" \"foo\" : ", // no value in object with no braces
|
||||||
@ -108,7 +119,6 @@ abstract trait TestUtils {
|
|||||||
" \"foo\" : 10 [ ", // no-braces object with trailing gunk
|
" \"foo\" : 10 [ ", // no-braces object with trailing gunk
|
||||||
"{ \"foo\" }", // no value or colon
|
"{ \"foo\" }", // no value or colon
|
||||||
"{ \"a\" : [ }", // [ is not a valid value
|
"{ \"a\" : [ }", // [ is not a valid value
|
||||||
ParseTest(true, "{ \"foo\" : 10, }"), // extra trailing comma (lift fails to throw)
|
|
||||||
"{ \"foo\" : 10, true }", // non-key after comma
|
"{ \"foo\" : 10, true }", // non-key after comma
|
||||||
"{ foo \n bar : 10 }", // newline in the middle of the unquoted key
|
"{ foo \n bar : 10 }", // newline in the middle of the unquoted key
|
||||||
"[ 1, \\", // ends with backslash
|
"[ 1, \\", // ends with backslash
|
||||||
@ -118,7 +128,6 @@ abstract trait TestUtils {
|
|||||||
"[ 10e3e3 ]", // two exponents. ideally this might parse to a number plus string "e3" but it's hard to implement.
|
"[ 10e3e3 ]", // two exponents. ideally this might parse to a number plus string "e3" but it's hard to implement.
|
||||||
"[ 1-e3 ]", // malformed number but all chars can appear in a number
|
"[ 1-e3 ]", // malformed number but all chars can appear in a number
|
||||||
"[ \"hello ]", // unterminated string
|
"[ \"hello ]", // unterminated string
|
||||||
ParseTest(true, "[ 1, 2, 3, ]"), // array with empty element (lift fails to throw)
|
|
||||||
ParseTest(true, "{ \"foo\" , true }"), // comma instead of colon, lift is fine with this
|
ParseTest(true, "{ \"foo\" , true }"), // comma instead of colon, lift is fine with this
|
||||||
ParseTest(true, "{ \"foo\" : true \"bar\" : false }"), // missing comma between fields, lift fine with this
|
ParseTest(true, "{ \"foo\" : true \"bar\" : false }"), // missing comma between fields, lift fine with this
|
||||||
"[ 10, }]", // array with } as an element
|
"[ 10, }]", // array with } as an element
|
||||||
@ -188,6 +197,15 @@ abstract trait TestUtils {
|
|||||||
"{ foo bar : bar }", // whitespace in the key
|
"{ foo bar : bar }", // whitespace in the key
|
||||||
"{ true : bar }", // key is a non-string token
|
"{ true : bar }", // key is a non-string token
|
||||||
ParseTest(true, """{ "foo" : "bar", "foo" : "bar2" }"""), // dup keys - lift just returns both
|
ParseTest(true, """{ "foo" : "bar", "foo" : "bar2" }"""), // dup keys - lift just returns both
|
||||||
|
ParseTest(true, "[ 1, 2, 3, ]"), // single trailing comma (lift fails to throw)
|
||||||
|
ParseTest(true, "[1,2,3 , ]"), // single trailing comma with whitespace
|
||||||
|
ParseTest(true, "[1,2,3\n\n , \n]"), // single trailing comma with newlines
|
||||||
|
ParseTest(true, "[1,]"), // single trailing comma with one-element array
|
||||||
|
ParseTest(true, "{ \"foo\" : 10, }"), // extra trailing comma (lift fails to throw)
|
||||||
|
ParseTest(true, "{ \"a\" : \"b\", }"), // single trailing comma in object
|
||||||
|
"{ a : b, }", // single trailing comma in object (unquoted strings)
|
||||||
|
"{ a : b \n , \n }", // single trailing comma in object with newlines
|
||||||
|
"a : b, c : d,", // single trailing comma in object with no root braces
|
||||||
"[ foo ]", // not a known token in JSON
|
"[ foo ]", // not a known token in JSON
|
||||||
"[ t ]", // start of "true" but ends wrong in JSON
|
"[ t ]", // start of "true" but ends wrong in JSON
|
||||||
"[ tx ]",
|
"[ tx ]",
|
||||||
|
Loading…
Reference in New Issue
Block a user