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]

Reply via email to