Skip to content

Commit

Permalink
[new-parser] Support LHS pattern annotations (#5797)
Browse files Browse the repository at this point in the history
* LHS patterns can have annotations

* LHS pattern annotations can contain chunks
  • Loading branch information
yurloc authored and tkobayas committed Oct 11, 2024
1 parent d993d02 commit abd79ff
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3739,4 +3739,20 @@ public void functionWithMultipleBlockStatements() {
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");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 ) ;
Expand Down Expand Up @@ -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 ;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,19 +34,6 @@ private 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
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,11 @@

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;

/**
Expand Down Expand Up @@ -322,6 +323,8 @@ public AnnotationDescr visitDrlAnnotation(DRLParser.DrlAnnotationContext ctx) {
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
}
Expand Down Expand Up @@ -496,6 +499,7 @@ public PatternDescr visitLhsPattern(DRLParser.LhsPatternContext ctx) {
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;
Expand Down Expand Up @@ -874,4 +878,4 @@ public ParseTree getNode() {
private String visitConstraintChildren(ParserRuleContext ctx) {
return getTokenTextPreservingWhitespace(ctx, tokenStream);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@
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 {

Expand Down Expand Up @@ -5192,29 +5194,4 @@ public boolean mismatchIsMissingToken(TokenStream input,
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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,31 @@ private 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.
Expand Down

0 comments on commit abd79ff

Please sign in to comment.