diff --git a/CHANGELOG.md b/CHANGELOG.md index b66fb1e..a224247 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # toml4j Changelog +## 0.5.1 / 2016-01-24 + +### Fixed + +* [Handling of tables with same name in different table array items](https://github.com/mwanji/toml4j/issues/26) (thanks to __[stanofujdiar](https://github.com/stanofujdiar)__) + ## 0.5.0 / 2015-12-10 ### Changed diff --git a/src/main/java/com/moandjiezana/toml/Container.java b/src/main/java/com/moandjiezana/toml/Container.java index 0b1a24f..56cce75 100644 --- a/src/main/java/com/moandjiezana/toml/Container.java +++ b/src/main/java/com/moandjiezana/toml/Container.java @@ -10,17 +10,24 @@ abstract class Container { abstract boolean accepts(String key); abstract void put(String key, Object value); abstract Object get(String key); + abstract boolean isImplicit(); static class Table extends Container { private final Map values = new HashMap(); final String name; + final boolean implicit; Table() { - this.name = null; + this(null, false); } public Table(String name) { - this.name = name; + this(name, false); + } + + public Table(String tableName, boolean implicit) { + this.name = tableName; + this.implicit = implicit; } @Override @@ -37,6 +44,10 @@ abstract class Container { Object get(String key) { return values.get(key); } + + boolean isImplicit() { + return implicit; + } /** * This modifies the Table's internal data structure, such that it is no longer usable. @@ -84,6 +95,10 @@ abstract class Container { Object get(String key) { throw new UnsupportedOperationException(); } + + boolean isImplicit() { + return false; + } List> getValues() { ArrayList> unwrappedValues = new ArrayList>(); diff --git a/src/main/java/com/moandjiezana/toml/Results.java b/src/main/java/com/moandjiezana/toml/Results.java index a3ea318..b5d7ba1 100644 --- a/src/main/java/com/moandjiezana/toml/Results.java +++ b/src/main/java/com/moandjiezana/toml/Results.java @@ -205,9 +205,6 @@ class Results { void startTables(Identifier id, AtomicInteger line) { String tableName = id.getBareName(); - if (!tables.add(tableName)) { - errors.duplicateTable(tableName, line.get()); - } while (stack.size() > 1) { stack.pop(); @@ -219,12 +216,16 @@ class Results { Container currentContainer = stack.peek(); if (currentContainer.get(tablePart) instanceof Container) { Container nextTable = (Container) currentContainer.get(tablePart); + if (i == tableParts.length - 1 && !nextTable.isImplicit()) { + errors.duplicateTable(tableName, line.get()); + return; + } stack.push(nextTable); if (stack.peek() instanceof Container.TableArray) { stack.push(((Container.TableArray) stack.peek()).getCurrent()); } } else if (currentContainer.accepts(tablePart)) { - startTable(tablePart, line); + startTable(tablePart, i < tableParts.length - 1, line); } else { errors.tableDuplicatesKey(tablePart, line); break; @@ -249,6 +250,14 @@ class Results { return newTable; } + + private Container startTable(String tableName, boolean implicit, AtomicInteger line) { + Container newTable = new Container.Table(tableName, implicit); + addValue(tableName, newTable, line); + stack.push(newTable); + + return newTable; + } private String getInlineTablePath(String key) { Iterator descendingIterator = stack.descendingIterator(); diff --git a/src/test/java/com/moandjiezana/toml/TableArrayTest.java b/src/test/java/com/moandjiezana/toml/TableArrayTest.java index 4f4ddc8..dd2d42c 100644 --- a/src/test/java/com/moandjiezana/toml/TableArrayTest.java +++ b/src/test/java/com/moandjiezana/toml/TableArrayTest.java @@ -110,11 +110,16 @@ public class TableArrayTest { assertNull(toml.getTable("a[1]")); } + @Test + public void should_handle_repeated_tables() { + new Toml().read("[[a]]\n [a.b]\n [[a]]\n [a.b]"); + } + @Test(expected = IllegalStateException.class) public void should_fail_on_empty_table_array_name() { new Toml().read("[[]]"); } - + private File file(String fileName) { return new File(getClass().getResource(fileName + ".toml").getFile()); }