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]