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 6f74f07d03 [incubator-kie-drools#5708] [new-parser] function
definition causes a… (#5793)
6f74f07d03 is described below
commit 6f74f07d033a0b92e6282a7b5d49a347d967c1e2
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Thu Mar 21 17:23:22 2024 +0900
[incubator-kie-drools#5708] [new-parser] function definition causes a…
(#5793)
* [incubator-kie-drools#5708] [new-parser] function definition causes an
error
* - enhance getTextPreservingWhitespace to avoid string manipulation
---
.../drl/parser/antlr4/MiscDRLParserTest.java | 48 ++++++++++++++++++
.../org/drools/drl/parser/antlr4/DRLParser.g4 | 58 +++++++++++++++++++++-
.../drl/parser/antlr4/Antlr4ParserStringUtils.java | 11 ++++
.../drools/drl/parser/antlr4/DRLVisitorImpl.java | 4 +-
4 files changed, 117 insertions(+), 4 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 77640d9df5..1e70906d99 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
@@ -3691,4 +3691,52 @@ class MiscDRLParserTest {
.as("prefix should be appended to each element")
.isEqualToIgnoringWhitespace("address!.city!.startsWith(\"I\")
&& address!.city!.length() == 5");
}
+
+ @Test
+ public void functionWithStringLiteral() {
+ final String text = "function String star(String s) { return \"*\"; }";
+ PackageDescr packageDescr = parser.parse(text);
+
assertThat(parser.hasErrors()).as(parser.getErrors().toString()).isFalse();
+
+ FunctionDescr function = packageDescr.getFunctions().get( 0 );
+
+ assertThat(function.getName()).isEqualTo("star");
+ assertThat(function.getReturnType()).isEqualTo("String");
+ assertThat(function.getParameterTypes().get(0)).isEqualTo("String");
+ assertThat(function.getParameterNames().get(0)).isEqualTo("s");
+ assertThat(function.getBody()).isEqualToIgnoringWhitespace( "return
\"*\";");
+ }
+
+ @Test
+ public void functionWithStringLiteralAddition() {
+ final String text = "function String addStar(String s) { return s +
\"*\"; }";
+ PackageDescr packageDescr = parser.parse(text);
+
assertThat(parser.hasErrors()).as(parser.getErrors().toString()).isFalse();
+
+ FunctionDescr function = packageDescr.getFunctions().get( 0 );
+
+ assertThat(function.getName()).isEqualTo("addStar");
+ assertThat(function.getReturnType()).isEqualTo("String");
+ assertThat(function.getParameterTypes().get(0)).isEqualTo("String");
+ assertThat(function.getParameterNames().get(0)).isEqualTo("s");
+ assertThat(function.getBody()).isEqualToIgnoringWhitespace( "return s
+ \"*\";");
+ }
+
+ @Test
+ public void functionWithMultipleBlockStatements() {
+ final String text = "function String star(String s) {\n" +
+ " String result = s + \"*\";\n" +
+ " return result;\n" +
+ "}";
+ PackageDescr packageDescr = parser.parse(text);
+
assertThat(parser.hasErrors()).as(parser.getErrors().toString()).isFalse();
+
+ FunctionDescr function = packageDescr.getFunctions().get( 0 );
+
+ assertThat(function.getName()).isEqualTo("star");
+ assertThat(function.getReturnType()).isEqualTo("String");
+ assertThat(function.getParameterTypes().get(0)).isEqualTo("String");
+ assertThat(function.getParameterNames().get(0)).isEqualTo("s");
+ assertThat(function.getBody()).isEqualToIgnoringWhitespace( "String
result = s + \"*\"; return result;");
+ }
}
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 7523592f98..7b347a69b8 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
@@ -164,7 +164,7 @@ drlRelationalOperator
| DRL_NOT? DRL_STR LBRACK IDENTIFIER RBRACK ;
/* function := FUNCTION type? ID parameters(typed) chunk_{_} */
-functiondef : DRL_FUNCTION typeTypeOrVoid? IDENTIFIER formalParameters block ;
+functiondef : DRL_FUNCTION typeTypeOrVoid? IDENTIFIER formalParameters
drlBlock ;
/* extending JavaParser qualifiedName */
@@ -380,7 +380,7 @@ fromAccumulate : (DRL_ACCUMULATE|DRL_ACC) LPAREN lhsAndDef
(COMMA|SEMI)
RPAREN (SEMI)?
;
-blockStatements : blockStatement* ;
+blockStatements : drlBlockStatement* ;
/*
accumulateFunction := label? ID parameters
@@ -512,3 +512,57 @@ drlVariableInitializer
drlArrayInitializer
: LBRACE (drlVariableInitializer (COMMA drlVariableInitializer)* (COMMA)?
)? RBRACE
;
+
+/* extending JavaParser block */
+drlBlock
+ : LBRACE drlBlockStatement* RBRACE
+ ;
+/* extending JavaParser blockStatement */
+drlBlockStatement
+ : drlLocalVariableDeclaration SEMI
+ | drlStatement
+ | localTypeDeclaration
+ ;
+
+/* extending JavaParser statement */
+drlStatement
+ : blockLabel=drlBlock
+ | ASSERT drlExpression (COLON drlExpression)? SEMI
+ | IF parExpression drlStatement (ELSE drlStatement)?
+ | FOR LPAREN forControl RPAREN drlStatement
+ | WHILE parExpression drlStatement
+ | DO drlStatement WHILE parExpression SEMI
+ | TRY drlBlock (catchClause+ finallyBlock? | finallyBlock)
+ | TRY resourceSpecification drlBlock catchClause* finallyBlock?
+ | SWITCH parExpression LBRACE switchBlockStatementGroup* switchLabel*
RBRACE
+ | SYNCHRONIZED parExpression drlBlock
+ | RETURN drlExpression? SEMI
+ | THROW drlExpression SEMI
+ | BREAK drlIdentifier? SEMI
+ | CONTINUE drlIdentifier? SEMI
+ | YIELD drlExpression SEMI // Java17
+ | SEMI
+ | statementExpression=drlExpression SEMI
+ | switchExpression SEMI? // Java17
+ | identifierLabel=drlIdentifier COLON drlStatement
+ ;
+
+/* extending JavaParser localVariableDeclaration */
+drlLocalVariableDeclaration
+ : variableModifier* (typeType drlVariableDeclarators | VAR drlIdentifier
ASSIGN expression)
+ ;
+
+/* extending JavaParser variableDeclarators */
+drlVariableDeclarators
+ : drlVariableDeclarator (COMMA drlVariableDeclarator)*
+ ;
+
+/* extending JavaParser variableDeclarator */
+drlVariableDeclarator
+ : drlVariableDeclaratorId (ASSIGN drlVariableInitializer)?
+ ;
+
+/* extending JavaParser variableDeclaratorId */
+drlVariableDeclaratorId
+ : drlIdentifier (LBRACK RBRACK)*
+ ;
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 8c874cc3c1..2f200c6abf 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
@@ -18,6 +18,9 @@
*/
package org.drools.drl.parser.antlr4;
+import java.util.List;
+import java.util.stream.Collectors;
+
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.TokenStream;
import org.antlr.v4.runtime.misc.Interval;
@@ -59,6 +62,13 @@ public class Antlr4ParserStringUtils {
return ctx.start.getTokenSource().getInputStream().getText(interval);
}
+ /**
+ * Get text from List of ParserRuleContext's CharStream without trimming
whitespace
+ */
+ public static String getTextPreservingWhitespace(List<? extends
ParserRuleContext> ctx) {
+ return
ctx.stream().map(Antlr4ParserStringUtils::getTextPreservingWhitespace).collect(Collectors.joining());
+ }
+
/**
* Get text from ParserRuleContext's CharStream without trimming whitespace
* tokenStream is required to get hidden channel token (e.g. whitespace).
@@ -78,4 +88,5 @@ public class Antlr4ParserStringUtils {
throw new DRLParserException("rhs has to start with 'then' : rhs =
" + rhs);
}
}
+
}
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 7dd6d8cfdb..16e398f946 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
@@ -59,11 +59,11 @@ import org.drools.drl.ast.descr.TypeFieldDescr;
import org.drools.drl.ast.descr.UnitDescr;
import org.drools.drl.ast.descr.WindowDeclarationDescr;
-import static
org.drools.drl.parser.antlr4.DRLParserHelper.getTextWithoutErrorNode;
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.util.StringUtils.unescapeJava;
@@ -193,7 +193,7 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
functionDescr.addParameter(typeTypeContext.getText(),
variableDeclaratorIdContext.getText());
});
}
- functionDescr.setBody(getTextPreservingWhitespace(ctx.block()));
+
functionDescr.setBody(getTextPreservingWhitespace(ctx.drlBlock().drlBlockStatement()));
return functionDescr;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]