You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (Jira)" <ji...@apache.org> on 2021/04/11 19:10:00 UTC

[jira] [Comment Edited] (GROOVY-8566) Array initialization from list literal without "as" should be supported under static compilation for multi-dimension arrays

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

Eric Milles edited comment on GROOVY-8566 at 4/11/21, 7:09 PM:
---------------------------------------------------------------

When the dynamic case is written out in classgen, there is a "GroovyCast" added for each array element.  That is, "int[][] arr = [ [1], [2] ]" is written like "int[][] arr = new int[][]\{ (int[])[1], (int[])[2] \}".  It is this dynamic (runtime) conversion that converts the inner list expressions into integer arrays.

The static compiler (and probably type checker) looks at the types on both sides of the assignment and emits errors for the mismatches.  So we never get to classgen.


was (Author: emilles):
When the dynamic case is written out in classgen, there is a "GroovyCast" added for each array element.  That is, "int[][] arr = [ [1], [2] ]" is written like "int[][] arr = new int[][]{ (int[])[1], (int[])[2] }".  It is this dynamic (runtime) conversion that converts the inner list expressions into integer arrays.

The static compiler (and probably type checker) looks at the types on both sides of the assignment and emits errors for the mismatches.  So we never get to classgen.

> 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
>            Assignee: Eric Milles
>            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)