This is an automated email from the ASF dual-hosted git repository.

mariofusco pushed a commit to branch dev-new-parser
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git

commit de0ce2e38f26438a364abd7c7785c7c0fe43b077
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Mon Aug 15 16:51:01 2022 +0900

    Enhance test/grammar coverage. dialect, invalid lhs (#10)
---
 drools-drl/drools-drl10-parser/pom.xml             |  5 ++
 .../src/main/antlr4/org/drools/parser/DRLParser.g4 |  2 +-
 .../java/org/drools/parser/DRLVisitorImpl.java     | 31 ++++++++++--
 .../{StringUtils.java => ParserStringUtils.java}   |  4 +-
 .../java/org/drools/parser/MiscDRLParserTest.java  | 56 ++++++++++++++++++----
 .../resources/org/drools/parser/empty_rule.drl     | 21 ++++++++
 6 files changed, 102 insertions(+), 17 deletions(-)

diff --git a/drools-drl/drools-drl10-parser/pom.xml 
b/drools-drl/drools-drl10-parser/pom.xml
index 93eefbc5d0..31e015289c 100644
--- a/drools-drl/drools-drl10-parser/pom.xml
+++ b/drools-drl/drools-drl10-parser/pom.xml
@@ -20,6 +20,11 @@
       <artifactId>drools-drl-ast</artifactId>
       <version>${version.drools-drl-ast}</version>
     </dependency>
+    <dependency>
+      <groupId>org.drools</groupId>
+      <artifactId>drools-util</artifactId>
+      <version>${version.drools-drl-ast}</version>
+    </dependency>
 
     <!-- External dependencies -->
     <dependency>
diff --git 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4
index b68437835f..2551a83593 100644
--- 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4
+++ 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4
@@ -5,7 +5,7 @@ options { tokenVocab=DRLLexer; }
 import JavaParser;
 
 
-compilationUnit : packagedef? unitdef? importdef* globaldef* ruledef* ;
+compilationUnit : packagedef? unitdef? importdef* attributes* globaldef* 
ruledef* ;
 
 packagedef : PACKAGE name=qualifiedName SEMI? ;
 
diff --git 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
index 5706ddd9db..8caa78a977 100644
--- 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
+++ 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
@@ -9,10 +9,27 @@ import java.util.stream.Collectors;
 import org.antlr.v4.runtime.ParserRuleContext;
 import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.TerminalNode;
-import org.drools.drl.ast.descr.*;
+import org.drools.drl.ast.descr.AnnotationDescr;
+import org.drools.drl.ast.descr.AttributeDescr;
+import org.drools.drl.ast.descr.BaseDescr;
+import org.drools.drl.ast.descr.ConditionalElementDescr;
+import org.drools.drl.ast.descr.ExistsDescr;
+import org.drools.drl.ast.descr.ExprConstraintDescr;
+import org.drools.drl.ast.descr.FromDescr;
+import org.drools.drl.ast.descr.FunctionImportDescr;
+import org.drools.drl.ast.descr.GlobalDescr;
+import org.drools.drl.ast.descr.ImportDescr;
+import org.drools.drl.ast.descr.MVELExprDescr;
+import org.drools.drl.ast.descr.NotDescr;
+import org.drools.drl.ast.descr.OrDescr;
+import org.drools.drl.ast.descr.PackageDescr;
+import org.drools.drl.ast.descr.PatternDescr;
+import org.drools.drl.ast.descr.RuleDescr;
+import org.drools.drl.ast.descr.UnitDescr;
 
 import static org.drools.parser.DRLParserHelper.getTextWithoutErrorNode;
-import static org.drools.parser.StringUtils.safeStripStringDelimiters;
+import static org.drools.parser.ParserStringUtils.safeStripStringDelimiters;
+import static org.drools.util.StringUtils.unescapeJava;
 
 public class DRLVisitorImpl extends DRLParserBaseVisitor<Object> {
 
@@ -197,9 +214,15 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
     public Object visitAttribute(DRLParser.AttributeContext ctx) {
         AttributeDescr attributeDescr = new 
AttributeDescr(ctx.getChild(0).getText());
         if (ctx.getChildCount() > 1) {
-            attributeDescr.setValue(ctx.getChild(1).getText());
+            // TODO : will likely split visitAttribute methods using labels 
(e.g. #stringAttribute)
+            String value = 
unescapeJava(safeStripStringDelimiters(ctx.getChild(1).getText()));
+            attributeDescr.setValue(value);
+        }
+        if (currentRule != null) {
+            currentRule.addAttribute(attributeDescr);
+        } else {
+            packageDescr.addAttribute(attributeDescr);
         }
-        currentRule.addAttribute(attributeDescr);
         return super.visitAttribute(ctx);
     }
 
diff --git 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/StringUtils.java
 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/ParserStringUtils.java
similarity index 86%
rename from 
drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/StringUtils.java
rename to 
drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/ParserStringUtils.java
index 22f8adf4c8..966a68b90c 100644
--- 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/StringUtils.java
+++ 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/ParserStringUtils.java
@@ -3,9 +3,9 @@ package org.drools.parser;
 /**
  * will be merged in drools-util
  */
-public class StringUtils {
+public class ParserStringUtils {
 
-    private StringUtils() {
+    private ParserStringUtils() {
     }
 
     public static String safeStripStringDelimiters(String value) {
diff --git 
a/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
 
b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
index c105a4a29f..baaaa5a5e4 100644
--- 
a/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
+++ 
b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
@@ -12,6 +12,7 @@ import java.nio.file.Paths;
 import junit.framework.TestCase;
 import org.assertj.core.api.Assertions;
 import org.drools.drl.ast.descr.AndDescr;
+import org.drools.drl.ast.descr.AttributeDescr;
 import org.drools.drl.ast.descr.BaseDescr;
 import org.drools.drl.ast.descr.ExprConstraintDescr;
 import org.drools.drl.ast.descr.FromDescr;
@@ -47,7 +48,7 @@ public class MiscDRLParserTest extends TestCase {
         super.tearDown();
     }
 
-    private PackageDescr parseResource(final String filename) throws Exception 
{
+    private String readResource(final String filename) throws Exception {
         Path path = Paths.get(getClass().getResource(filename).toURI());
         final StringBuilder sb = new StringBuilder();
         try (BufferedReader br = Files.newBufferedReader(path, 
StandardCharsets.UTF_8)) {
@@ -57,7 +58,7 @@ public class MiscDRLParserTest extends TestCase {
         } catch (IOException e) {
             e.printStackTrace();
         }
-        return parser.parse(sb.toString());
+        return sb.toString();
     }
 
     @Test
@@ -210,26 +211,27 @@ public class MiscDRLParserTest extends TestCase {
 
     @Test
     public void testGlobalWithOrWithoutSemi() throws Exception {
-        PackageDescr pack = parseResource("globals.drl");
+        String source = readResource("globals.drl");
+        PackageDescr pkg = parser.parse(source);
 
         assertEquals(1,
-                     pack.getRules().size());
+                     pkg.getRules().size());
 
-        final RuleDescr rule = (RuleDescr) pack.getRules().get(0);
+        final RuleDescr rule = (RuleDescr) pkg.getRules().get(0);
         assertEquals(1,
                      rule.getLhs().getDescrs().size());
 
         assertEquals(1,
-                     pack.getImports().size());
+                     pkg.getImports().size());
         assertEquals(2,
-                     pack.getGlobals().size());
+                     pkg.getGlobals().size());
 
-        final GlobalDescr foo = (GlobalDescr) pack.getGlobals().get(0);
+        final GlobalDescr foo = (GlobalDescr) pkg.getGlobals().get(0);
         assertEquals("java.lang.String",
                      foo.getType());
         assertEquals("foo",
                      foo.getIdentifier());
-        final GlobalDescr bar = (GlobalDescr) pack.getGlobals().get(1);
+        final GlobalDescr bar = (GlobalDescr) pkg.getGlobals().get(1);
         assertEquals("java.lang.Integer",
                      bar.getType());
         assertEquals("bar",
@@ -238,7 +240,8 @@ public class MiscDRLParserTest extends TestCase {
 
     @Test
     public void testFunctionImportWithNotExist() throws Exception {
-        PackageDescr pkg = (PackageDescr) 
parseResource("test_FunctionImport.drl");
+        String source = readResource("test_FunctionImport.drl");
+        PackageDescr pkg = parser.parse(source);
 
         assertEquals(2,
                      pkg.getFunctionImports().size());
@@ -458,4 +461,37 @@ public class MiscDRLParserTest extends TestCase {
         assertEquals( "type matches \"\\..*\\\\.\"",
                       constraint.getDescrs().get( 0 ).toString() );
     }
+
+    @Test
+    public void testDialect() throws Exception {
+        final String source = "dialect 'mvel'";
+        PackageDescr pkg = parser.parse(source);
+        AttributeDescr attr = (AttributeDescr) pkg.getAttributes().get(0);
+        assertEquals("dialect",
+                     attr.getName());
+        assertEquals("mvel",
+                     attr.getValue());
+    }
+
+    @Test
+    public void testDialect2() throws Exception {
+        final String source = "dialect \"mvel\"";
+        PackageDescr pkg = parser.parse(source);
+        AttributeDescr attr = pkg.getAttributes().get(0);
+        assertEquals("dialect",
+                     attr.getName());
+        assertEquals("mvel",
+                     attr.getValue());
+    }
+
+    @Test
+    public void testEmptyRuleWithoutWhen() throws Exception {
+        String source = readResource("empty_rule.drl"); // without WHEN
+        PackageDescr pkg = parser.parse(source);
+
+        assertTrue(parser.getErrors().toString(),
+                    parser.hasErrors());
+
+        // Note : RuleParserTest.testEmptyRule allows this DRL, but I think is 
doesn't make sense to pass this DRL
+    }
 }
diff --git 
a/drools-drl/drools-drl10-parser/src/test/resources/org/drools/parser/empty_rule.drl
 
b/drools-drl/drools-drl10-parser/src/test/resources/org/drools/parser/empty_rule.drl
new file mode 100644
index 0000000000..406037fbbd
--- /dev/null
+++ 
b/drools-drl/drools-drl10-parser/src/test/resources/org/drools/parser/empty_rule.drl
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2015 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+
+rule empty 
+
+then
+  
+end
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to