From 4880da560532e119b01c92ff5b8804dea9626080 Mon Sep 17 00:00:00 2001 From: Nicolas Roard Date: Tue, 27 Jul 2021 17:51:20 -0700 Subject: [PATCH] Fix in json parser (#358) - added testFormatting6-8 covering the issue, fix in CLParser - added iterator for CLObject --- .../core/parser/CLContainer.java | 8 ++- .../constraintlayout/core/parser/CLKey.java | 2 + .../core/parser/CLObject.java | 28 ++++++++- .../core/parser/CLParser.java | 4 ++ .../core/parser/CLParserTest.java | 57 +++++++++++++++++++ 5 files changed, 95 insertions(+), 4 deletions(-) diff --git a/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLContainer.java b/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLContainer.java index cf0bee216..9b5d30541 100644 --- a/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLContainer.java +++ b/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLContainer.java @@ -64,9 +64,11 @@ public ArrayList names() { public boolean has(String name) { for (CLElement element : mElements) { - CLKey key = (CLKey) element; - if (key.content().equals(name)) { - return true; + if (element instanceof CLKey) { + CLKey key = (CLKey) element; + if (key.content().equals(name)) { + return true; + } } } return false; diff --git a/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLKey.java b/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLKey.java index e2a01e090..54d9f14f2 100644 --- a/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLKey.java +++ b/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLKey.java @@ -48,6 +48,8 @@ public static CLElement allocate(String name, CLElement value) { return key; } + public String getName() { return content(); } + protected String toJSON() { if (mElements.size() > 0) { return getDebugName() + content() + ": " + mElements.get(0).toJSON(); diff --git a/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLObject.java b/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLObject.java index ae58c7b27..13d26f366 100644 --- a/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLObject.java +++ b/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLObject.java @@ -15,7 +15,9 @@ */ package androidx.constraintlayout.core.parser; -public class CLObject extends CLContainer { +import java.util.Iterator; + +public class CLObject extends CLContainer implements Iterable{ public CLObject(char[] content) { super(content); @@ -62,4 +64,28 @@ public String toFormattedJSON(int indent, int forceIndent) { return json.toString(); } + @Override + public Iterator iterator() { + return new CLObjectIterator(this); + } + + private class CLObjectIterator implements Iterator { + CLObject myObject; + int index = 0; + public CLObjectIterator(CLObject clObject) { + myObject = clObject; + } + + @Override + public boolean hasNext() { + return index < myObject.size(); + } + + @Override + public Object next() { + CLKey key = (CLKey) myObject.mElements.get(index); + index++; + return key; + } + } } diff --git a/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLParser.java b/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLParser.java index 9fdf22f8b..6b74a0803 100644 --- a/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLParser.java +++ b/constraintlayout/core/src/main/java/androidx/constraintlayout/core/parser/CLParser.java @@ -124,6 +124,10 @@ public CLObject parse() throws CLParsingException { if (c == '}' || c == ']') { currentElement = currentElement.getContainer(); currentElement.setEnd(i - 1); + if (currentElement instanceof CLKey) { + currentElement = currentElement.getContainer(); + currentElement.setEnd(i - 1); + } } } } diff --git a/constraintlayout/core/src/test/java/androidx/constraintlayout/core/parser/CLParserTest.java b/constraintlayout/core/src/test/java/androidx/constraintlayout/core/parser/CLParserTest.java index 22495ee07..12838b92e 100644 --- a/constraintlayout/core/src/test/java/androidx/constraintlayout/core/parser/CLParserTest.java +++ b/constraintlayout/core/src/test/java/androidx/constraintlayout/core/parser/CLParserTest.java @@ -680,6 +680,63 @@ public void testFormatting5() { e.printStackTrace(); } } + + @Test + public void testFormatting6() { + String test = "{ root: {interpolated: {left: 0, top: 0, right: 800, bottom: 772}}, " + + "button: {interpolated: {left: 0, top: 372, right: 800, bottom: 401}}, " + + "text1: {interpolated: {left: 100, top: 285, right: 208, bottom: 301}}, " + + "text2: {interpolated: {left: 723, top: 736, right: 780, bottom: 752}}, " + + "g1: {type: 'vGuideline',interpolated: {left: 100, top: 0, right: 100, bottom: 772}}, }"; + try { + CLObject parsedContent = CLParser.parse(test); + assertEquals("{\n" + + " root: { interpolated: { left: 0, top: 0, right: 800, bottom: 772 } },\n" + + " button: { interpolated: { left: 0, top: 372, right: 800, bottom: 401 } },\n" + + " text1: { interpolated: { left: 100, top: 285, right: 208, bottom: 301 } },\n" + + " text2: { interpolated: { left: 723, top: 736, right: 780, bottom: 752 } },\n" + + " g1: {\n" + + " type: 'vGuideline',\n" + + " interpolated: { left: 100, top: 0, right: 100, bottom: 772 }\n" + + " }\n" + + "}", parsedContent.toFormattedJSON()); + } catch (CLParsingException e) { + System.err.println("Exception " + e.reason()); + e.printStackTrace(); + } + } + + @Test + public void testFormatting7() { + String test = "{ root: {left: 0, top: 0, right: 800, bottom: 772}, " + + "button: {left: 0, top: 372, right: 800, bottom: 401}, "; + try { + CLObject parsedContent = CLParser.parse(test); + assertEquals("{\n" + + " root: { left: 0, top: 0, right: 800, bottom: 772 },\n" + + " button: { left: 0, top: 372, right: 800, bottom: 401 }\n" + + "}", parsedContent.toFormattedJSON()); + } catch (CLParsingException e) { + System.err.println("Exception " + e.reason()); + e.printStackTrace(); + } + } + + @Test + public void testFormatting8() { + String test = "{ root: { bottom: 772}, " + + "button: { bottom: 401 }, "; + try { + CLObject parsedContent = CLParser.parse(test); + assertEquals("{\n" + + " root: { bottom: 772 },\n" + + " button: { bottom: 401 }\n" + + "}", parsedContent.toFormattedJSON()); + } catch (CLParsingException e) { + System.err.println("Exception " + e.reason()); + e.printStackTrace(); + } + } }