Fixed parser issue with splitted strings. 69/3869/1
authorTony Tkacik <ttkacik@cisco.com>
Wed, 18 Dec 2013 16:12:41 +0000 (17:12 +0100)
committerTony Tkacik <ttkacik@cisco.com>
Fri, 20 Dec 2013 13:47:45 +0000 (14:47 +0100)
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserListenerUtils.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/validator/YangModelValidationTest.java
yang/yang-parser-impl/src/test/resources/simple-test/simple-nodes.yang

index 790889a2d70b6ede50197b3bc81355354d23d137..f52b21495ac18c6ffe0bbf91452da8387b0ba739 100644 (file)
@@ -17,6 +17,7 @@ import java.util.Date;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.opendaylight.yangtools.yang.common.QName;
 
 /**
  * The QName from XML consists of local name of element and XML namespace, but
@@ -296,4 +297,8 @@ public final class QName implements Immutable,Serializable {
     public String getFormattedRevision() {
         return formattedRevision;
     }
+
+    public QName withoutRevision() {
+        return QName.create(namespace, null, localName);
+    }
 }
index a25b6279519b2c4227994b3e23b7f5288247b42e..ff96d95d8294ed59d96218b65bb922fda2c3bada 100644 (file)
@@ -16,6 +16,7 @@ import java.util.List;
 import java.util.Stack;
 
 import org.antlr.v4.runtime.tree.ParseTree;
+import org.antlr.v4.runtime.tree.TerminalNode;
 import org.opendaylight.yangtools.antlrv4.code.gen.*;
 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Argument_stmtContext;
 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Base_stmtContext;
@@ -139,18 +140,30 @@ public final class ParserListenerUtils {
             if (treeNode.getChild(i) instanceof StringContext) {
                 final StringContext context = (StringContext) treeNode.getChild(i);
                 if (context != null) {
-                    result = context.getChild(0).getText();
-                    if (!(result.startsWith("\"")) && result.endsWith("\"")) {
-                        LOG.error("Syntax error in module {} at line {}: missing '\"'.", getParentModule(treeNode),
-                                context.getStart().getLine());
-                    }
-                    return result.replace("\"", "");
+                    return stringFromStringContext(context,treeNode);
+                    
                 }
             }
         }
         return result;
     }
 
+    private static String stringFromStringContext(StringContext context, ParseTree treeNode) {
+        StringBuilder str = new StringBuilder();
+        for (TerminalNode stringNode : context.STRING()) {
+            String result = stringNode.getText();
+            if(!result.contains("\"")){
+                str.append(result);
+            } else if (!(result.startsWith("\"")) && result.endsWith("\"")) {
+                LOG.error("Syntax error in module {} at line {}: missing '\"'.", getParentModule(treeNode),
+                        context.getStart().getLine());
+            } else {
+                str.append(result.replace("\"", ""));
+            }
+        }
+        return str.toString();
+    }
+
     private static String getParentModule(final ParseTree ctx) {
         ParseTree current = ctx;
         while (current != null && !(current instanceof Module_stmtContext)) {
index b1d6726194b299ac866c64bf9ee1bc5137a22a34..56f4704f19b8e8b213130acf2f3d6b3a6ffa8d83 100644 (file)
@@ -15,12 +15,14 @@ import static org.mockito.Mockito.*;
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 
 import org.antlr.v4.runtime.Token;
 import org.antlr.v4.runtime.tree.ParseTree;
+import org.antlr.v4.runtime.tree.TerminalNode;
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Augment_stmtContext;
@@ -237,12 +239,17 @@ public class YangModelValidationTest {
     }
 
     static void mockName(ParseTree stmt, String name) {
-        StringContext nameCtx = mock(StringContext.class);
-        ParseTree internalName = mock(ParseTree.class);
         doReturn(1).when(stmt).getChildCount();
-        doReturn(name).when(internalName).getText();
-        doReturn(internalName).when(nameCtx).getChild(0);
+
+        TerminalNode terminalNode = mock(TerminalNode.class);
+        doReturn(name).when(terminalNode).getText();
+
+        StringContext nameCtx = mock(StringContext.class);
         doReturn(nameCtx).when(stmt).getChild(0);
+        doReturn(terminalNode).when(nameCtx).getChild(0);
+        doReturn(name).when(terminalNode).getText();
+
+        doReturn(Collections.singletonList(terminalNode)).when(nameCtx).STRING();
     }
 
     static <T extends ParseTree> T mockStatement(Class<T> stmtType, String name) {
index 2dc1f89245e51732e7efbcf1cda021973cef3e72..38ebfd8277ea3510c897177e54a9cb8f1f0cc050 100644 (file)
@@ -1,6 +1,7 @@
 module simple-nodes {
     yang-version 1;
-    namespace "urn:opendaylight:simple-nodes";
+    namespace "urn:opendaylight:"+
+        "simple-nodes";
     prefix "sn";
 
     organization "opendaylight";