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

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


The following commit(s) were added to refs/heads/dev-new-parser by this push:
     new ea00f0efa7 [incubator-kie-drools-5741] [new-parser] Broken enum 
declaration (#5870)
ea00f0efa7 is described below

commit ea00f0efa77f1e3c02a4c249503d519db7818930
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Fri Apr 26 10:20:17 2024 +0900

    [incubator-kie-drools-5741] [new-parser] Broken enum declaration (#5870)
---
 .../drl/parser/antlr4/MiscDRLParserTest.java       | 35 +++++++++++++++++++++
 .../org/drools/drl/parser/antlr4/DRLParser.g4      | 11 +++++++
 .../drools/drl/parser/antlr4/DRLVisitorImpl.java   | 36 ++++++++++++++++++++++
 3 files changed, 82 insertions(+)

diff --git 
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
 
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
index c30164d0f4..8422827031 100644
--- 
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
+++ 
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
@@ -25,6 +25,8 @@ import org.drools.drl.ast.descr.CollectDescr;
 import org.drools.drl.ast.descr.ConditionalBranchDescr;
 import org.drools.drl.ast.descr.EntryPointDeclarationDescr;
 import org.drools.drl.ast.descr.EntryPointDescr;
+import org.drools.drl.ast.descr.EnumDeclarationDescr;
+import org.drools.drl.ast.descr.EnumLiteralDescr;
 import org.drools.drl.ast.descr.EvalDescr;
 import org.drools.drl.ast.descr.ExistsDescr;
 import org.drools.drl.ast.descr.ExprConstraintDescr;
@@ -4360,4 +4362,37 @@ class MiscDRLParserTest {
                             });
                 });
     }
+
+    @Test
+    public void enumDeclaration() {
+        final String text =
+                "declare enum PersonAge\n" +
+                        "    @doc(author=\"Bob\")\n" +
+                        "    ELEVEN(11, \"XI\"), TWELVE(12, \"XII\");\n" +
+                        "\n" +
+                        "    key: int\n" +
+                        "    romanStr : String\n" +
+                        "end";
+        PackageDescr pkg = parseAndGetPackageDescr(text);
+
+        List<EnumDeclarationDescr> descrList = pkg.getEnumDeclarations();
+        EnumDeclarationDescr enumDeclarationDescr = descrList.get(0);
+        assertThat(enumDeclarationDescr.getTypeName()).isEqualTo("PersonAge");
+
+        
assertThat(enumDeclarationDescr.getAnnotation("doc").getValue("author")).isEqualTo("\"Bob\"");
+
+        List<EnumLiteralDescr> literals = enumDeclarationDescr.getLiterals();
+        EnumLiteralDescr enumLiteralDescr0 = literals.get(0);
+        assertThat(enumLiteralDescr0.getName()).isEqualTo("ELEVEN");
+        
assertThat(enumLiteralDescr0.getConstructorArgs()).containsExactly("11", 
"\"XI\"");
+        EnumLiteralDescr enumLiteralDescr1 = literals.get(1);
+        assertThat(enumLiteralDescr1.getName()).isEqualTo("TWELVE");
+        
assertThat(enumLiteralDescr1.getConstructorArgs()).containsExactly("12", 
"\"XII\"");
+
+        TypeFieldDescr key = enumDeclarationDescr.getFields().get("key");
+        assertThat(key.getPattern().getObjectType()).isEqualTo("int");
+
+        TypeFieldDescr romanStr = 
enumDeclarationDescr.getFields().get("romanStr");
+        assertThat(romanStr.getPattern().getObjectType()).isEqualTo("String");
+    }
 }
diff --git 
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
 
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
index 071a3202e3..fb6a9bf68c 100644
--- 
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
+++ 
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
@@ -50,6 +50,7 @@ declaredef : DRL_DECLARE (
                          | entryPointDeclaration
                          | windowDeclaration
                          | typeDeclaration
+                         | enumDeclaration
                          )
                          ; // DRL_END belongs to entryPointDeclaration etc.
 
@@ -70,6 +71,16 @@ entryPointDeclaration : DRL_ENTRY_POINT name=stringId 
drlAnnotation* DRL_END ;
 
 windowDeclaration : DRL_WINDOW name=IDENTIFIER drlAnnotation* lhsPatternBind 
DRL_END ;
 
+// (enum)typeDeclaration := [ENUM] qualifiedIdentifier annotation* 
enumerative+ field* END
+
+enumDeclaration : ENUM name=drlQualifiedName drlAnnotation* enumeratives SEMI 
field* DRL_END ;
+
+enumeratives : enumerative (COMMA enumerative)* ;
+
+// enumerative := ID ( LEFT_PAREN expression (COMMA expression)* RIGHT_PAREN )?
+
+enumerative: drlIdentifier ( LPAREN expression ( COMMA expression )* RPAREN )? 
;
+
 // field := label fieldType (EQUALS_ASSIGN conditionalExpression)? annotation* 
SEMICOLON?
 
 field : label type (ASSIGN initExpr=conditionalOrExpression)? drlAnnotation* 
SEMI? ;
diff --git 
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
index 03b9621787..f568256b8e 100644
--- 
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
+++ 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
@@ -38,6 +38,8 @@ import org.drools.drl.ast.descr.CollectDescr;
 import org.drools.drl.ast.descr.ConditionalBranchDescr;
 import org.drools.drl.ast.descr.EntryPointDeclarationDescr;
 import org.drools.drl.ast.descr.EntryPointDescr;
+import org.drools.drl.ast.descr.EnumDeclarationDescr;
+import org.drools.drl.ast.descr.EnumLiteralDescr;
 import org.drools.drl.ast.descr.EvalDescr;
 import org.drools.drl.ast.descr.ExistsDescr;
 import org.drools.drl.ast.descr.ExprConstraintDescr;
@@ -130,6 +132,8 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
                 
packageDescr.addEntryPointDeclaration((EntryPointDeclarationDescr) descr);
             } else if (descr instanceof WindowDeclarationDescr) {
                 packageDescr.addWindowDeclaration((WindowDeclarationDescr) 
descr);
+            } else if (descr instanceof EnumDeclarationDescr) {
+                packageDescr.addEnumDeclaration((EnumDeclarationDescr) descr);
             } else if (descr instanceof AttributeDescr) {
                 packageDescr.addAttribute((AttributeDescr) descr);
             } else if (descr instanceof RuleDescr) { // QueryDescr extends 
RuleDescr
@@ -242,6 +246,38 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
         return typeDeclarationDescr;
     }
 
+    @Override
+    public EnumDeclarationDescr 
visitEnumDeclaration(DRLParser.EnumDeclarationContext ctx) {
+        EnumDeclarationDescr enumDeclarationDescr = 
BaseDescrFactory.builder(new EnumDeclarationDescr(ctx.name.getText()))
+                .withParserRuleContext(ctx)
+                .build();
+        ctx.drlAnnotation().stream()
+                .map(this::visitDrlAnnotation)
+                .forEach(enumDeclarationDescr::addAnnotation);
+
+        List<BaseDescr> descrList = visitDescrChildren(ctx.enumeratives());
+        descrList.stream()
+                .filter(EnumLiteralDescr.class::isInstance)
+                .map(EnumLiteralDescr.class::cast)
+                .forEach(enumDeclarationDescr::addLiteral);
+
+        ctx.field().stream()
+                .map(this::visitField)
+                .forEach(enumDeclarationDescr::addField);
+        return enumDeclarationDescr;
+    }
+
+    @Override
+    public EnumLiteralDescr visitEnumerative(DRLParser.EnumerativeContext ctx) 
{
+        EnumLiteralDescr enumLiteralDescr = BaseDescrFactory.builder(new 
EnumLiteralDescr(ctx.drlIdentifier().getText()))
+                .withParserRuleContext(ctx)
+                .build();
+        ctx.expression().stream()
+                .map(Antlr4ParserStringUtils::getTextPreservingWhitespace)
+                .forEach(enumLiteralDescr::addConstructorArg);
+        return enumLiteralDescr;
+    }
+
     @Override
     public EntryPointDeclarationDescr 
visitEntryPointDeclaration(DRLParser.EntryPointDeclarationContext ctx) {
         EntryPointDeclarationDescr entryPointDeclarationDescr = 
BaseDescrFactory.builder(new EntryPointDeclarationDescr())


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

Reply via email to