protected IRExpression compileExpansionUsingArrayList ( IType rootType , IType rootComponentType , IType resultType , IType resultCompType , IType propertyType ) { // Evaluate the root and assign it to a temp variable IRSymbol tempRoot = _cc ( ) . makeAndIndexTempSymbol ( getDescriptor ( rootType ) ) ; IRStatement tempRootAssignment = buildAssignment ( tempRoot , ExpressionTransformer . compile ( _expr ( ) . getRootExpression ( ) , _cc ( ) ) ) ; // Create an ArrayList to store the results IRSymbol resultArrayList = _cc ( ) . makeAndIndexTempSymbol ( getDescriptor ( JavaTypes . ARRAY_LIST ( ) ) ) ; IRStatement arrayListCreation = buildAssignment ( resultArrayList , buildNewExpression ( ArrayList . class , new Class [ 0 ] , exprList ( ) ) ) ; // Now we loop over each element in the root array or collection. For each element, we evaluate the // RHS, wrap it by calling arrayToCollection, then add it to the result list via addAll IRForEachStatement forLoop = createArrayListAddLoop ( rootType , rootComponentType , resultCompType , tempRoot , resultArrayList , propertyType ) ; // Now take the ArrayList and convert it to the desired return type IRExpression listToArrayConversion = convertListToArray ( resultType , resultCompType , resultArrayList ) ; return buildComposite ( tempRootAssignment , arrayListCreation , forLoop , listToArrayConversion ) ; }
This method will compile the expansion using an ArrayList to collect temporary results . This is appropriate if the right - hand - side is a Collection or array if the root is an Iterable or Iterator or other object whose size can t easily be determined up - front or if the root is a nested Collection or array that will require additional unwrapping .