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]