Class AbstractMemberExpansionTransformer<T extends IMemberAccessExpression>
java.lang.Object
gw.internal.gosu.ir.transform.AbstractElementTransformer<T>
gw.internal.gosu.ir.transform.expression.AbstractExpressionTransformer<T>
gw.internal.gosu.ir.transform.expression.AbstractMemberExpansionTransformer<T>
- Direct Known Subclasses:
BeanMethodCallExpansionTransformer
,MemberExpansionAccessTransformer
public abstract class AbstractMemberExpansionTransformer<T extends IMemberAccessExpression>
extends AbstractExpressionTransformer<T>
-
Field Summary
Fields inherited from class gw.internal.gosu.ir.transform.AbstractElementTransformer
CAPTURED_VAR_PREFIX, CTX_SYMBOL, CTX_SYMBOL_SUFFIX, CUSTOM_RUNTIMES, EMPTY_CLASS_ARRAY, ENHANCEMENT_THIS_REF, ENHANCEMENT_TYPE_PARAM_PREFIX, ENUM_PARAM_PREFIX, OBJECT_TYPE, OUTER_ACCESS, TYPE_PARAM_PREFIX
-
Constructor Summary
ConstructorsModifierConstructorDescriptionprotected
-
Method Summary
Modifier and TypeMethodDescriptionstatic Collection
arrayToCollection
(Object value) protected IRExpression
protected IRExpression
compileExpansionDirectlyToArray
(IType rootType, IType rootComponentType, IType resultType, IType resultCompType) If this method is being called, it means we're expanding a one-dimensional array or collection, with a right hand side that evaluates to a property that's not an array or collection.protected IRExpression
compileExpansionUsingArrayList
(IType rootType, IType rootComponentType, IType resultType, IType resultCompType, IType propertyType) This method will compile the expansion using an ArrayList to collect temporary results.protected IRExpression
compileExpansionWithNoReturnValue
(IType rootType, IType rootComponentType, IType resultType, IType resultCompType) private IRExpression
convertListToArray
(IType resultType, IType resultCompType, IRSymbol resultArrayList) private IRExpression
convertToPrimitiveArray
(IType compType, IRExpression listToConvert) private IRExpression
createArrayLengthExpression
(IType rootType, IRSymbol tempRoot) private IRForEachStatement
createArrayListAddLoop
(IType rootType, IType rootComponentType, IType resultCompType, IRSymbol tempRoot, IRSymbol resultArrayList, IType propertyType) private IRForEachStatement
createArrayStoreLoop
(IType rootType, IType rootComponentType, IType resultCompType, IRSymbol tempRoot, IRSymbol resultArray) protected abstract IRExpression
createIterationExpr
(IType rootComponentType, String identifierName, IType identifierType, IType compType) Subclassers need only implement this method for the iteration expression i.e., the singular form of the expansion expr.private IRForEachStatement
createNoValueLoop
(IType rootType, IType rootComponentType, IType resultCompType, IRSymbol tempRoot) private IType
getMoreSpecificType
(IType type1, IType type2) protected abstract IType
getPropertyOrMethodType
(IType rootComponentType, IType compType) private static boolean
isArrayOrCollection
(IType type) static Object
listToArray
(List l, IType compType) static Object
listToArray
(List l, Class compType) static boolean[]
static byte[]
static char[]
static double[]
static float[]
static int[]
static long[]
static short[]
private IRExpression
makeArray
(IType componentType, IRExpression lengthExpression) Methods inherited from class gw.internal.gosu.ir.transform.expression.AbstractExpressionTransformer
_expr, compile, getIRParameters, pushArgumentsNoCasting, pushArgumentsWithCasting, shortCircuitValue
Methods inherited from class gw.internal.gosu.ir.transform.AbstractElementTransformer
_cc, assignStructuralTypeOwner, avoidVerifyError, booleanLiteral, boxValue, boxValue, boxValueToType, buildAddition, buildArithmetic, buildArrayLength, buildArrayLoad, buildArrayLoad, buildArrayStore, buildAssignment, buildCast, buildComposite, buildComposite, buildEquals, buildFieldGet, buildFieldSet, buildGreaterThan, buildIf, buildIfElse, buildInitializedArray, buildMethodCall, buildMethodCall, buildMethodCall, buildNegation, buildNewExpression, buildNewExpression, buildNewExpression, buildNotEquals, buildNullCheckTernary, buildReturn, buildSubtraction, buildTernary, buildThrow, callMethod, callMethod, callMethod, callMethod, callMethod, callSpecialMethod, callSpecialMethod, callSpecialMethod, callStaticMethod, castResultingTypeIfNecessary, charLiteral, checkCast, checkCast, checkCast, classLiteral, classLiteral, classLiteral, clearCustomRuntimes, collectArgsIntoObjArray, convertBoxedNullToPrimitive, convertNullToPrimitive, convertOperandToBig, convertOperandToPrimitive, convertOperandToRational, exprList, fastStringCoercion, findComparableParamType, findDimensionType, getActualPropertyInfo, getCapturedSymbolParameterName, getClassInfos, getConcreteType, getConstructorParamTypes, getCustomRuntime, getDeclaredField, getDeclaredFieldImpl, getDeclaredMethod, getDeclaredMethod, getDefaultConstIns, getDescriptor, getDescriptor, getDescriptor, getDescriptor, getEnclosingDFS, getField, getField_new, getGosuClass, getInstanceField, getIRTypes, getIRTypes, getModifiers, getParsedElement, getRuntimeEnclosingType, getStaticField, getTypes, getTypeVarParamName, getTypeVarsForDFS, handleCustomExpressionRuntime, handleNamedArgs, identifier, initLocalVar, initLocalVarWithDefault, initMultiArray, inStaticContext, isBigType, isBoxedIntType, isBytecodeType, isBytecodeType, isCheckedArithmeticEnabled, isCompilingEnhancement, isEnhancementType, isEvalProgram, isExecuteMethod, isHandledByCustomCoercion, isIntType, isMemberOnEnclosingType, isMemberOnEnhancementOfEnclosingType, isNonBigBoxedNumberType, isNonStaticInnerClass, isNumberType, isPrimitiveNumberType, isProgram, isProgramOrEnclosedInProgram, makeAnnotationInfos, makeArrayViaTypeInfo, makeEmptyArrayViaTypeInfo, makeIRSymbol, maybeUnwrapMetaType, newArray, nullCheckVar, nullLiteral, numberConvert, numberConvert, numericLiteral, pushArrayOfDefValueExpr, pushArrayOfString, pushArrayOfTypes, pushCapturedSymbols, pushConstant, pushEnumSuperConstructorArguments, pushExternalSymbolsMap, pushLazyType, pushLazyType, pushNull, pushOuter, pushOuter, pushOuter, pushParamTypes, pushRuntimeTypeOfTypeVar, pushString, pushThis, pushThisOrOuter, pushType, pushType, pushTypeParametersForConstructor, requiresExternalSymbolCapture, requiresImplicitEnhancementArg, requiresImplicitEnhancementArg, setCc, setField, setField, setInstanceField, setStaticField, stringLiteral, unboxValueFromType, unboxValueToType, unboxValueToType, valueOf
-
Constructor Details
-
AbstractMemberExpansionTransformer
-
-
Method Details
-
createIterationExpr
protected abstract IRExpression createIterationExpr(IType rootComponentType, String identifierName, IType identifierType, IType compType) Subclassers need only implement this method for the iteration expression i.e., the singular form of the expansion expr. -
getPropertyOrMethodType
-
compile_impl
- Specified by:
compile_impl
in classAbstractExpressionTransformer<T extends IMemberAccessExpression>
-
isArrayOrCollection
-
compileExpansionWithNoReturnValue
protected IRExpression compileExpansionWithNoReturnValue(IType rootType, IType rootComponentType, IType resultType, IType resultCompType) -
createNoValueLoop
private IRForEachStatement createNoValueLoop(IType rootType, IType rootComponentType, IType resultCompType, IRSymbol tempRoot) -
compileExpansionDirectlyToArray
protected IRExpression compileExpansionDirectlyToArray(IType rootType, IType rootComponentType, IType resultType, IType resultCompType) If this method is being called, it means we're expanding a one-dimensional array or collection, with a right hand side that evaluates to a property that's not an array or collection. In that case, we build up an array and simply store values directly into it. We also null-short-circuit in the event that the root is null. The member expansion portion ends up as a composite that looks like: temp_array = new Foo[temp_root.length] for (a in temp_root index i) { temp_array[i] = a.Bar } temp_array And the overall expression looks like: temp_root = root ( temp_root == null ? (Bar[]) null : (Bar[]) member_expansion ) -
makeArray
-
createArrayLengthExpression
-
createArrayStoreLoop
-
compileExpansionUsingArrayList
protected IRExpression compileExpansionUsingArrayList(IType rootType, IType rootComponentType, IType resultType, IType resultCompType, IType propertyType) 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. The overall result of the expansion thus looks like the following composite: temp_arraylist = new ArrayList() for (a in temp_root) { temp_arraylist.addAll( AbstractMemberExpansionTransform.arrayToCollection( a.Bars ) ) } AbstractMemberExpansionTransformer.listToArray(temp_array) -
createArrayListAddLoop
-
convertListToArray
private IRExpression convertListToArray(IType resultType, IType resultCompType, IRSymbol resultArrayList) -
getMoreSpecificType
-
convertToPrimitiveArray
-
listToPrimitiveArray_boolean
-
listToPrimitiveArray_byte
-
listToPrimitiveArray_char
-
listToPrimitiveArray_int
-
listToPrimitiveArray_short
-
listToPrimitiveArray_long
-
listToPrimitiveArray_float
-
listToPrimitiveArray_double
-
listToArray
-
listToArray
-
arrayToCollection
-