From e53dd1673bf77916d1f0be30b70ec80d0f48ef75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Bl=C3=A4sing?= Date: Tue, 30 Dec 2025 20:17:21 +0100 Subject: [PATCH 1/3] Update toml grammar to align with 1.1.0 specification - trailing commas in array and inline table declarations are explicitly allowed - inline tables can span multiple lines --- .../net/vieiro/toml/antlr4/TOMLAntlrLexer.g4 | 2 ++ .../net/vieiro/toml/antlr4/TOMLAntlrParser.g4 | 10 ++++------ src/main/java/net/vieiro/toml/TOMLVisitor.java | 13 ++----------- .../java/net/vieiro/toml/TOMLArrayTest.java | 10 ++++++++++ .../net/vieiro/toml/TOMLInlineTablesTest.java | 8 ++++++++ .../toml/invalid/TOMLInvalidDocumentTest.java | 5 ----- .../resources/net/vieiro/toml/array-test.toml | 4 ++++ .../net/vieiro/toml/inline-table-test.toml | 17 +++++++++++++++-- .../toml/invalid/inline-table/linebreak-1.toml | 4 ---- .../toml/invalid/inline-table/linebreak-2.toml | 2 -- .../toml/invalid/inline-table/linebreak-3.toml | 2 -- .../toml/invalid/inline-table/linebreak-4.toml | 4 ---- .../invalid/inline-table/trailing-comma.toml | 3 --- 13 files changed, 45 insertions(+), 39 deletions(-) delete mode 100644 src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-1.toml delete mode 100644 src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-2.toml delete mode 100644 src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-3.toml delete mode 100644 src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-4.toml delete mode 100644 src/test/resources/net/vieiro/toml/invalid/inline-table/trailing-comma.toml diff --git a/src/main/antlr4/net/vieiro/toml/antlr4/TOMLAntlrLexer.g4 b/src/main/antlr4/net/vieiro/toml/antlr4/TOMLAntlrLexer.g4 index fec1982..63f2103 100644 --- a/src/main/antlr4/net/vieiro/toml/antlr4/TOMLAntlrLexer.g4 +++ b/src/main/antlr4/net/vieiro/toml/antlr4/TOMLAntlrLexer.g4 @@ -138,6 +138,8 @@ UNEXPECTED_VALUE_DATA: . -> type(INVALID_VALUE), popMode; mode INLINE_TABLE_MODE; INLINE_TABLE_WS : WS -> skip ; +INLINE_TABLE_NL : NL -> type(NL) ; +INLINE_TABLE_COMMENT : COMMENT -> type(COMMENT) ; INLINE_TABLE_KEY_DOT : DOT -> type(DOT) ; INLINE_TABLE_COMMA : COMMA -> type(COMMA) ; R_BRACE : '}' -> popMode ; diff --git a/src/main/antlr4/net/vieiro/toml/antlr4/TOMLAntlrParser.g4 b/src/main/antlr4/net/vieiro/toml/antlr4/TOMLAntlrParser.g4 index 0e58d4a..f87a1d6 100644 --- a/src/main/antlr4/net/vieiro/toml/antlr4/TOMLAntlrParser.g4 +++ b/src/main/antlr4/net/vieiro/toml/antlr4/TOMLAntlrParser.g4 @@ -52,13 +52,11 @@ bool_ : BOOLEAN ; date_time : OFFSET_DATE_TIME | LOCAL_DATE_TIME | LOCAL_DATE | LOCAL_TIME ; -inline_table : - L_BRACE key EQUALS inline_value (COMMA key EQUALS inline_value)*? R_BRACE - | L_BRACE R_BRACE; +inline_table : + L_BRACE comment_or_nl key EQUALS inline_value comment_or_nl (COMMA comment_or_nl key EQUALS inline_value comment_or_nl)* (COMMA comment_or_nl)? R_BRACE + | L_BRACE comment_or_nl R_BRACE; -inner_array: L_BRACKET inline_value? (COMMA inline_value)*? COMMA*? R_BRACKET; - -inline_value: string | integer | floating_point | bool_ | date_time | inner_array | inline_table; +inline_value: string | integer | floating_point | bool_ | date_time | array_ | inline_table; array_ : L_BRACKET array_values? comment_or_nl R_BRACKET ; diff --git a/src/main/java/net/vieiro/toml/TOMLVisitor.java b/src/main/java/net/vieiro/toml/TOMLVisitor.java index 5842153..d86fe6e 100644 --- a/src/main/java/net/vieiro/toml/TOMLVisitor.java +++ b/src/main/java/net/vieiro/toml/TOMLVisitor.java @@ -358,15 +358,6 @@ public Object visitInline_table(TOMLAntlrParser.Inline_tableContext ctx) { return Collections.unmodifiableMap(inlineTable); } - @Override - public Object visitInner_array(TOMLAntlrParser.Inner_arrayContext ctx) { - if (ctx.inline_value() != null) { - List innerArray = ctx.inline_value().stream().map((v) -> v.accept(this)).collect(Collectors.toList()); - return Collections.unmodifiableList(innerArray); - } - return Collections.emptyList(); - } - @Override public Object visitInline_value(TOMLAntlrParser.Inline_valueContext ctx) { if (ctx.string() != null) { @@ -379,8 +370,8 @@ public Object visitInline_value(TOMLAntlrParser.Inline_valueContext ctx) { return ctx.bool_().accept(this); } else if (ctx.date_time() != null) { return ctx.date_time().accept(this); - } else if (ctx.inner_array() != null) { - return ctx.inner_array().accept(this); + } else if (ctx.array_() != null) { + return ctx.array_().accept(this); } else if (ctx.inline_table() != null) { return ctx.inline_table().accept(this); } diff --git a/src/test/java/net/vieiro/toml/TOMLArrayTest.java b/src/test/java/net/vieiro/toml/TOMLArrayTest.java index 14c0b9f..0275404 100644 --- a/src/test/java/net/vieiro/toml/TOMLArrayTest.java +++ b/src/test/java/net/vieiro/toml/TOMLArrayTest.java @@ -46,6 +46,16 @@ public void testShouldParseArraysProperly() throws Exception { assertEquals(3, ((List) nested_arrays_of_ints.get(1)).size()); } + { + assertTrue(toml.getArray("multiline-array").isPresent()); + List multilineArray = toml.getArray("multiline-array").get(); + assertEquals(4, multilineArray.size()); + assertEquals(1L, multilineArray.get(0)); + assertEquals(2L, multilineArray.get(1)); + assertEquals(3L, multilineArray.get(2)); + assertEquals(5L, multilineArray.get(3)); + } + } } diff --git a/src/test/java/net/vieiro/toml/TOMLInlineTablesTest.java b/src/test/java/net/vieiro/toml/TOMLInlineTablesTest.java index 634fc1c..645be10 100644 --- a/src/test/java/net/vieiro/toml/TOMLInlineTablesTest.java +++ b/src/test/java/net/vieiro/toml/TOMLInlineTablesTest.java @@ -38,6 +38,14 @@ public void testShouldParseInlineTablesProperly() throws Exception { String pug = toml.getString("animal/type/name").orElse(null); assertEquals("pug", pug); + Long mlDetailsYear = toml.getLong("multiline-table/details/year").orElse(0L); + assertEquals(1968L, mlDetailsYear); + + String mlDetailsModel = toml.getString("multiline-table/details/model").orElse(null); + assertEquals("Mustang", mlDetailsModel); + + Long inlineTableTrailingCommaValue = toml.getLong("inline_table_trailing_comma/value").orElse(0L); + assertEquals(1L, inlineTableTrailingCommaValue); } } diff --git a/src/test/java/net/vieiro/toml/invalid/TOMLInvalidDocumentTest.java b/src/test/java/net/vieiro/toml/invalid/TOMLInvalidDocumentTest.java index edf8f9d..62ca31b 100644 --- a/src/test/java/net/vieiro/toml/invalid/TOMLInvalidDocumentTest.java +++ b/src/test/java/net/vieiro/toml/invalid/TOMLInvalidDocumentTest.java @@ -143,14 +143,9 @@ public class TOMLInvalidDocumentTest { "invalid/inline-table/double-comma.toml", "invalid/inline-table/duplicate-key.toml", "invalid/inline-table/empty.toml", - "invalid/inline-table/linebreak-1.toml", - "invalid/inline-table/linebreak-2.toml", - "invalid/inline-table/linebreak-3.toml", - "invalid/inline-table/linebreak-4.toml", "invalid/inline-table/nested_key_conflict.toml", "invalid/inline-table/no-comma.toml", "invalid/inline-table/overwrite.toml", - "invalid/inline-table/trailing-comma.toml", "invalid/inline-table/unclosed-table.toml", "invalid/integer/capital-bin.toml", "invalid/integer/capital-hex.toml", diff --git a/src/test/resources/net/vieiro/toml/array-test.toml b/src/test/resources/net/vieiro/toml/array-test.toml index 5f2b987..789e753 100644 --- a/src/test/resources/net/vieiro/toml/array-test.toml +++ b/src/test/resources/net/vieiro/toml/array-test.toml @@ -3,3 +3,7 @@ colors = [ "red", "yellow", "green" ] nested_arrays_of_ints = [ [ 1, 2 ], [3, 4, 5] ] nested_mixed_array = [ [ 1, 2 ], ["a", "b", "c"] ] more_integers = [4, 5, 6,] + +multiline-array = [ 1, + # Second set of value separated by comment + 2, 3, 5 ] diff --git a/src/test/resources/net/vieiro/toml/inline-table-test.toml b/src/test/resources/net/vieiro/toml/inline-table-test.toml index 9e82e33..e64790a 100644 --- a/src/test/resources/net/vieiro/toml/inline-table-test.toml +++ b/src/test/resources/net/vieiro/toml/inline-table-test.toml @@ -4,6 +4,19 @@ animal = { type.name = "pug" } nested = { brand = "Ford", details = { year = 1968, model ="Mustang"}} ahash = { version = "0.8", default-features = false, features = ["compile-time-rng"] } -multiline-array = [ 1, - 2, 3, 5 ] +multiline-table = { + # Comment 1 + brand = "Ford", + details = { + year = 1968, + # Comment 2 + model ="Mustang", + tags = [ + "t1", + "t2", + "t3" + ] + } +} +inline_table_trailing_comma = { name = "test", value = 1, } diff --git a/src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-1.toml b/src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-1.toml deleted file mode 100644 index 0ae44b6..0000000 --- a/src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-1.toml +++ /dev/null @@ -1,4 +0,0 @@ -# No newlines are allowed between the curly braces unless they are valid within -# a value. -simple = { a = 1 -} diff --git a/src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-2.toml b/src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-2.toml deleted file mode 100644 index 5ea4eaf..0000000 --- a/src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-2.toml +++ /dev/null @@ -1,2 +0,0 @@ -t = {a=1, -b=2} diff --git a/src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-3.toml b/src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-3.toml deleted file mode 100644 index 7f6e892..0000000 --- a/src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-3.toml +++ /dev/null @@ -1,2 +0,0 @@ -t = {a=1 -,b=2} diff --git a/src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-4.toml b/src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-4.toml deleted file mode 100644 index 3f34e15..0000000 --- a/src/test/resources/net/vieiro/toml/invalid/inline-table/linebreak-4.toml +++ /dev/null @@ -1,4 +0,0 @@ -json_like = { - first = "Tom", - last = "Preston-Werner" -} diff --git a/src/test/resources/net/vieiro/toml/invalid/inline-table/trailing-comma.toml b/src/test/resources/net/vieiro/toml/invalid/inline-table/trailing-comma.toml deleted file mode 100644 index 6b67e02..0000000 --- a/src/test/resources/net/vieiro/toml/invalid/inline-table/trailing-comma.toml +++ /dev/null @@ -1,3 +0,0 @@ -# A terminating comma (also called trailing comma) is not permitted after the -# last key/value pair in an inline table -abc = { abc = 123, } From b7e33a7b093a4c055fd63c362c63e8114c3184c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Bl=C3=A4sing?= Date: Tue, 30 Dec 2025 23:21:11 +0100 Subject: [PATCH 2/3] Bump dependencies (test dependencies and build plugins) --- pom.xml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index 7dc19ba..0aea3a5 100644 --- a/pom.xml +++ b/pom.xml @@ -22,8 +22,8 @@ scm:git:git@github.com:vieiro/toml-java.git scm:git:git@github.com:vieiro/toml-java.git https://github.com/vieiro/toml-java - HEAD - + HEAD + Github @@ -59,7 +59,7 @@ maven-gpg-plugin - 3.1.0 + 3.2.8 sign-artifacts @@ -96,37 +96,37 @@ org.junit.jupiter junit-jupiter-engine - 5.10.0 + 5.14.1 test org.junit.jupiter junit-jupiter-params - 5.10.0 + 5.14.1 test ognl ognl - 3.4.2 + 3.4.9 test com.google.code.gson gson - 2.10.1 + 2.13.2 test com.flipkart.zjsonpatch zjsonpatch - 0.4.14 + 0.4.16 test com.fasterxml.jackson.datatype jackson-datatype-jsr310 - 2.14.0 + 2.20.1 test @@ -147,7 +147,7 @@ maven-deploy-plugin - 3.1.1 + 3.1.4 default-deploy @@ -160,7 +160,7 @@ maven-release-plugin - 3.0.1 + 3.2.0 deploy -Dgpg.passphrase=${gpg.passphrase} @@ -181,7 +181,7 @@ org.sonatype.plugins nexus-staging-maven-plugin - 1.6.13 + 1.7.0 true ossrh @@ -191,14 +191,14 @@ maven-compiler-plugin - 3.11.0 + 3.14.1 -Xlint:unchecked maven-surefire-plugin - 3.1.2 + 3.5.4 org.antlr @@ -218,7 +218,7 @@ maven-source-plugin - 3.3.0 + 3.4.0 @@ -232,7 +232,7 @@ maven-javadoc-plugin - 3.6.0 + 3.12.0 attach-javadocs From c5f08061227e05087990d50e32f03c1593b41692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Bl=C3=A4sing?= Date: Tue, 30 Dec 2025 23:22:59 +0100 Subject: [PATCH 3/3] Use javac release-flag to compile for correct classpath (String#isBlank is used => minimum JDK is 11) --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 0aea3a5..6e1829c 100644 --- a/pom.xml +++ b/pom.xml @@ -80,9 +80,8 @@ UTF-8 - 8 - 8 4.13.1 + 11