[ 
https://issues.apache.org/jira/browse/GROOVY-8566?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17318923#comment-17318923
 ] 

Eric Milles commented on GROOVY-8566:
-------------------------------------

One of the relevant locations is in {{BinaryExpressionHelper}}:
{code:java}
        ClassNode lhsType = 
controller.getTypeChooser().resolveType(leftExpression, 
controller.getClassNode());
        if (rightExpression instanceof ListExpression && lhsType.isArray()) {
            ListExpression list = (ListExpression) rightExpression;
            ArrayExpression array = new 
ArrayExpression(lhsType.getComponentType(), list.getExpressions());
            array.setSourcePosition(list);
            array.visit(acg);
{code}

> Array initialization from list literal without "as" should be supported under 
> static compilation for multi-dimension arrays
> ---------------------------------------------------------------------------------------------------------------------------
>
>                 Key: GROOVY-8566
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8566
>             Project: Groovy
>          Issue Type: Improvement
>          Components: Compiler
>    Affects Versions: 2.4.15
>            Reporter: mgroovy
>            Priority: Major
>              Labels: CompileStatic, array, initialization
>
> Dynamic Groovy supports initializing an array from a list literal:
> {code:java}
> @Test
> @Ignore
> void arrayFromListLiteral() {
>   int[] a0 = [1,2,3]
>   int[][] aa0 = [[1,2,3],[4,5,6]]
>   int[][][] aaa0 = [[[1],[2],[3]],[[4],[5],[6]]]
>   int[][][] aaa1 = [[1,2,3],[4,5,6]]
>   int[][][] aaa2 = [1,2,3,4,5,6]
>   int[][][] aaa3 = 1
>   println "a0=$a0"
>   println "aa0=$aa0"
>   println "aaa0=$aaa0"
>   println "aaa1=$aaa1"
>   println "aaa2=$aaa2"
>   println "aaa3=$aaa3"
>   assert a0 instanceof int[]
>   assert aa0 instanceof int[][]
>   assert aaa0 instanceof int[][][]
>   assert aaa1 instanceof int[][][]
>   assert aaa2 instanceof int[][][]
>   assert aaa3 instanceof int[][][]
> }
> {code}
> gives:
> a0=[1, 2, 3]
>  aa0=[[1, 2, 3], [4, 5, 6]]
>  aaa0=[[[1], [2], [3]], [[4], [5], [6]]]
>  aaa1=[[[1], [2], [3]], [[4], [5], [6]]]
>  aaa2=[[[1]], [[2]], [[3]], [[4]], [[5]], [[6]]]
>  aaa3=[[[1]]]
> Using @CompileStatic on the test the compiler gives:
> {code:java}
> Error:(37, 19) Groovyc: [Static type checking] - Cannot assign value of type 
> java.util.List <java.lang.Integer> into array of type int[][]
> Error:(38, 22) Groovyc: [Static type checking] - Cannot assign value of type 
> java.util.List <java.util.List> into array of type int[][][]
> Error:(39, 22) Groovyc: [Static type checking] - Cannot assign value of type 
> java.util.List <java.lang.Integer> into array of type int[][][]
> Error:(40, 22) Groovyc: [Static type checking] - Cannot assign value of type 
> int into array of type int[][][]
> Error:(41, 22) Groovyc: [Static type checking] - Cannot assign value of type 
> int to variable of type int[][][]
> {code}
> Adding the "as" operator:
> {code:java}
> @Test
> @Ignore
> void arrayFromListLiteral() {
>   int[] a0 = [1,2,3]
>   int[][] aa0 = [[1,2,3],[4,5,6]] as int[][]
>   int[][][] aaa0 = [[[1],[2],[3]],[[4],[5],[6]]]  as int[][][]
>   // etc
> }
> {code}
> makes the code work the same as in the dynamic case.
> In light of the upcoming Groovy 3.0 support for Java-style curly-braces 
> literal array syntax, it would be good to support the idiomatic Groovy array 
> initialization syntax also for the static compilation case.
> An additonal question would be, whether in the static case the automatic 
> conversion of the RHS expression to fit the LHS array type should be less 
> lenient, i.e. the list structure should be required to conform to the array 
> dimensions given on the left ?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to