Skip to content

Commit

Permalink
LHS pattern annotations can contain chunks
Browse files Browse the repository at this point in the history
  • Loading branch information
yurloc committed Mar 21, 2024
1 parent 4cb6713 commit 03a56a0
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3745,14 +3745,14 @@ void lhsPatternAnnotation() {
final String text = "package org.drools\n" +
"rule R1\n" +
"when\n" +
" $p : Person( age < 50 ) @watch(!age)\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");
assertThat(annotationDescr.getSingleValueAsString()).isEqualTo("!*, age");
}
}
Original file line number Diff line number Diff line change
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
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 03a56a0

Please sign in to comment.