daniellansun commented on code in PR #3054:
URL: https://github.com/apache/groovy/pull/3054#discussion_r4424899676


##########
src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java:
##########
@@ -2485,10 +2495,30 @@ public DeclarationExpression 
visitVariableDeclarator(final VariableDeclaratorCon
                                 ),
                                 ctx.variableDeclaratorId()),
                         token,
-                        
this.visitVariableInitializer(ctx.variableInitializer())),
+                        init),
                 ctx);
     }
 
+    private void checkArrayInitEdgeCase(final Expression expr) {
+        if (expr instanceof ArrayExpression array && array.hasInitializer()) {
+            ClassNode elementType = array.getElementType();
+
+            ClassNode baseType = elementType;
+            while (baseType.isArray()) baseType = baseType.getComponentType();
+            if (isPrimitiveType(baseType)) {
+                return; // closure coerced to boolean or integer is not likely
+            }
+
+            if (!elementType.isArray()) {
+                if (array.getExpressions().size() == 1 && 
!(array.getExpression(0) instanceof ClosureExpression)) {

Review Comment:
   Please narrow this predicate so we only warn when the leaf element type 
could previously have been closure/SAM/(optional) Object promotion — not for 
`String[]` / `Boolean[]` / other ordinary reference arrays. As written, the 
primary Java single-element idiom gets a warning on every use.



##########
src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java:
##########
@@ -4655,7 +4693,31 @@ private void validateParameterList(final List<Parameter> 
parameterList) {
 
     @Override
     public Parameter visitFormalParameter(final FormalParameterContext ctx) {
-        return this.processFormalParameter(ctx, ctx.variableModifiersOpt(), 
ctx.type(), ctx.ELLIPSIS(), ctx.variableDeclaratorId(), ctx.expression());
+        ClassNode parameterType = this.visitType(ctx.type());
+        var init = (Expression) this.visit(ctx.expression());
+
+        if (ctx.arrayInitializer() != null) {
+            ClassNode elementType = parameterType.getComponentType();
+            ctx.arrayInitializer().putNodeMetaData("elementType", elementType);
+            init = configureAST(

Review Comment:
   After building this `ArrayExpression`, please also call 
`checkArrayInitEdgeCase(init)` (same as `visitVariableDeclarator`). Parameter 
defaults such as `Closure[] cs = { println('x') }` otherwise keep the silent 
eager-eval behaviour with no diagnostic.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to