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


The following commit(s) were added to refs/heads/dev-new-parser by this push:
     new 12545b9127 [new-parser] Support LHS pattern annotations (#5797)
12545b9127 is described below

commit 12545b91274a9c99d86749caadd617f833aed92b
Author: Jiří Locker <[email protected]>
AuthorDate: Thu Mar 21 19:09:41 2024 +0100

    [new-parser] Support LHS pattern annotations (#5797)
    
    * LHS patterns can have annotations
    
    * LHS pattern annotations can contain chunks
---
 .../drl/parser/antlr4/MiscDRLParserTest.java       | 16 +++++++++++++
 .../org/drools/drl/parser/antlr4/DRLParser.g4      |  4 ++--
 .../drl/parser/antlr4/Antlr4ParserStringUtils.java | 13 -----------
 .../drools/drl/parser/antlr4/DRLVisitorImpl.java   |  8 +++++--
 .../org/drools/drl/parser/lang/DRL6Parser.java     | 27 ++--------------------
 .../drools/drl/parser/util/ParserStringUtils.java  | 25 ++++++++++++++++++++
 6 files changed, 51 insertions(+), 42 deletions(-)

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 1e70906d99..ebc86082aa 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
@@ -3739,4 +3739,20 @@ class MiscDRLParserTest {
         assertThat(function.getParameterNames().get(0)).isEqualTo("s");
         assertThat(function.getBody()).isEqualToIgnoringWhitespace( "String 
result = s + \"*\"; return result;");
     }
+
+    @Test
+    void lhsPatternAnnotation() {
+        final String text = "package org.drools\n" +
+                "rule R1\n" +
+                "when\n" +
+                "    $p : Person( name == \"Mario\" ) @watch(!*, age)\n" +
+                "then\n" +
+                "end\n";
+        PackageDescr packageDescr = parser.parse(text);
+        RuleDescr ruleDescr = packageDescr.getRules().get(0);
+        PatternDescr patternDescr = (PatternDescr) 
ruleDescr.getLhs().getDescrs().get(0);
+        AnnotationDescr annotationDescr = 
patternDescr.getAnnotations().iterator().next();
+        assertThat(annotationDescr.getName()).isEqualTo("watch");
+        assertThat(annotationDescr.getSingleValueAsString()).isEqualTo("!*, 
age");
+    }
 }
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 7b347a69b8..a218c069b1 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
@@ -124,7 +124,7 @@ lhsPattern : xpathPrimary (OVER patternFilter)? |
              ( QUESTION? qualifiedIdentifier LPAREN positionalConstraints? 
constraints? RPAREN (OVER patternFilter)? (FROM patternSource)? ) ;
 */
 
-lhsPattern : QUESTION? objectType=drlQualifiedName LPAREN 
positionalConstraints? constraints? RPAREN (DRL_OVER patternFilter)? (DRL_FROM 
patternSource)? ;
+lhsPattern : QUESTION? objectType=drlQualifiedName LPAREN 
positionalConstraints? constraints? RPAREN drlAnnotation* (DRL_OVER 
patternFilter)? (DRL_FROM patternSource)? ;
 positionalConstraints : constraint (COMMA constraint)* SEMI ;
 constraints : constraint (COMMA constraint)* ;
 constraint : ( nestedConstraint | conditionalOrExpression ) ;
@@ -459,7 +459,7 @@ type : (classOrInterfaceType | primitiveType) 
typeArguments? ( DOT IDENTIFIER ty
 drlArguments : LPAREN drlArgument (COMMA drlArgument)* RPAREN ;
 drlArgument : ( stringId | floatLiteral | BOOL_LITERAL | NULL_LITERAL ) ;
 
-drlAnnotation : AT name=drlQualifiedName (LPAREN ( drlElementValuePairs | 
drlElementValue )? RPAREN)? ;
+drlAnnotation : AT name=drlQualifiedName ((LPAREN ( drlElementValuePairs | 
drlElementValue )? RPAREN) | chunk)? ;
 
 drlElementValuePairs : drlElementValuePair (COMMA drlElementValuePair)* ;
 drlElementValuePair : key=drlIdentifier ASSIGN value=drlElementValue ;
diff --git 
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/Antlr4ParserStringUtils.java
 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/Antlr4ParserStringUtils.java
index 2f200c6abf..86e841cc12 100644
--- 
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/Antlr4ParserStringUtils.java
+++ 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/Antlr4ParserStringUtils.java
@@ -34,19 +34,6 @@ public class Antlr4ParserStringUtils {
         // Private constructor to prevent instantiation.
     }
 
-    /**
-     * Strip string delimiters (e.g. "foo" -> foo)
-     */
-    public static String safeStripStringDelimiters(String value) {
-        if (value != null) {
-            value = value.trim();
-            if (value.length() >= 2 && value.startsWith("\"") && 
value.endsWith("\"")) {
-                value = value.substring(1, value.length() - 1);
-            }
-        }
-        return value;
-    }
-
     /**
      * Get text from ParserRuleContext's CharStream without trimming whitespace
      */
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 16e398f946..42205cebc9 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
@@ -61,10 +61,11 @@ import org.drools.drl.ast.descr.WindowDeclarationDescr;
 
 import static 
org.drools.drl.parser.antlr4.Antlr4ParserStringUtils.getTextPreservingWhitespace;
 import static 
org.drools.drl.parser.antlr4.Antlr4ParserStringUtils.getTokenTextPreservingWhitespace;
-import static 
org.drools.drl.parser.antlr4.Antlr4ParserStringUtils.safeStripStringDelimiters;
 import static org.drools.drl.parser.antlr4.Antlr4ParserStringUtils.trimThen;
 import static 
org.drools.drl.parser.antlr4.DRLParserHelper.getTextWithoutErrorNode;
 import static org.drools.drl.parser.util.ParserStringUtils.appendPrefix;
+import static org.drools.drl.parser.util.ParserStringUtils.safeStripDelimiters;
+import static 
org.drools.drl.parser.util.ParserStringUtils.safeStripStringDelimiters;
 import static org.drools.util.StringUtils.unescapeJava;
 
 /**
@@ -322,6 +323,8 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
         AnnotationDescr annotationDescr = new 
AnnotationDescr(ctx.name.getText());
         if (ctx.drlElementValue() != null) {
             
annotationDescr.setValue(getTextPreservingWhitespace(ctx.drlElementValue())); 
// single value
+        } else if (ctx.chunk() != null) {
+            
annotationDescr.setValue(safeStripDelimiters(getTextPreservingWhitespace(ctx.chunk()),
 "(", ")"));
         } else if (ctx.drlElementValuePairs() != null) {
             visitDrlElementValuePairs(ctx.drlElementValuePairs(), 
annotationDescr); // multiple values
         }
@@ -496,6 +499,7 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
             patternSourceDescr.setResource(patternDescr.getResource());
             patternDescr.setSource(patternSourceDescr);
         }
+        
ctx.drlAnnotation().stream().map(this::visitDrlAnnotation).forEach(patternDescr::addAnnotation);
         List<ExprConstraintDescr> constraintDescrList = 
visitConstraints(ctx.positionalConstraints(), ctx.constraints());
         constraintDescrList.forEach(descr -> addToPatternDescr(patternDescr, 
descr));
         return patternDescr;
@@ -874,4 +878,4 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
     private String visitConstraintChildren(ParserRuleContext ctx) {
         return getTokenTextPreservingWhitespace(ctx, tokenStream);
     }
-}
\ No newline at end of file
+}
diff --git 
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/lang/DRL6Parser.java
 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/lang/DRL6Parser.java
index f23b7063e2..f2181a37b8 100644
--- 
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/lang/DRL6Parser.java
+++ 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/lang/DRL6Parser.java
@@ -86,6 +86,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.drools.drl.parser.util.ParserStringUtils.appendPrefix;
+import static org.drools.drl.parser.util.ParserStringUtils.safeStripDelimiters;
+import static 
org.drools.drl.parser.util.ParserStringUtils.safeStripStringDelimiters;
 
 public class DRL6Parser extends AbstractDRLParser implements DRLParser {
 
@@ -5192,29 +5194,4 @@ public class DRL6Parser extends AbstractDRLParser 
implements DRLParser {
         return false;
     }
 
-    private String safeStripDelimiters(String value,
-            String left,
-            String right) {
-        if (value != null) {
-            value = value.trim();
-            if (value.length() >= left.length() + right.length() &&
-                    value.startsWith(left) && value.endsWith(right)) {
-                value = value.substring(left.length(),
-                        value.length() - right.length());
-            }
-        }
-        return value;
-    }
-
-    private String safeStripStringDelimiters(String value) {
-        if (value != null) {
-            value = value.trim();
-            if (value.length() >= 2 && value.startsWith("\"") && 
value.endsWith("\"")) {
-                value = value.substring(1,
-                        value.length() - 1);
-            }
-        }
-        return value;
-    }
-
 }
diff --git 
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/util/ParserStringUtils.java
 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/util/ParserStringUtils.java
index bca3dca91f..b67e64dd17 100644
--- 
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/util/ParserStringUtils.java
+++ 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/util/ParserStringUtils.java
@@ -27,6 +27,31 @@ public class ParserStringUtils {
         // Private constructor to prevent instantiation.
     }
 
+    /**
+     * Strip string delimiters (e.g. "foo" -> foo)
+     */
+    public static String safeStripStringDelimiters(String value) {
+        if (value != null) {
+            value = value.trim();
+            if (value.length() >= 2 && value.startsWith("\"") && 
value.endsWith("\"")) {
+                value = value.substring(1, value.length() - 1);
+            }
+        }
+        return value;
+    }
+
+    public static String safeStripDelimiters(String value, String left, String 
right) {
+        if (value != null) {
+            value = value.trim();
+            if (value.length() >= left.length() + right.length() &&
+                    value.startsWith(left) && value.endsWith(right)) {
+                value = value.substring(left.length(),
+                        value.length() - right.length());
+            }
+        }
+        return value;
+    }
+
     /**
      * Append a prefix to a grouped constraint.
      * Even if the constraint contains || and/or &&, append the prefix to each 
element.


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

Reply via email to