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 CollectionarrayToCollection(Object value) protected IRExpressionprotected IRExpressioncompileExpansionDirectlyToArray(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 IRExpressioncompileExpansionUsingArrayList(IType rootType, IType rootComponentType, IType resultType, IType resultCompType, IType propertyType) This method will compile the expansion using an ArrayList to collect temporary results.protected IRExpressioncompileExpansionWithNoReturnValue(IType rootType, IType rootComponentType, IType resultType, IType resultCompType) private IRExpressionconvertListToArray(IType resultType, IType resultCompType, IRSymbol resultArrayList) private IRExpressionconvertToPrimitiveArray(IType compType, IRExpression listToConvert) private IRExpressioncreateArrayLengthExpression(IType rootType, IRSymbol tempRoot) private IRForEachStatementcreateArrayListAddLoop(IType rootType, IType rootComponentType, IType resultCompType, IRSymbol tempRoot, IRSymbol resultArrayList, IType propertyType) private IRForEachStatementcreateArrayStoreLoop(IType rootType, IType rootComponentType, IType resultCompType, IRSymbol tempRoot, IRSymbol resultArray) protected abstract IRExpressioncreateIterationExpr(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 IRForEachStatementcreateNoValueLoop(IType rootType, IType rootComponentType, IType resultCompType, IRSymbol tempRoot) private ITypegetMoreSpecificType(IType type1, IType type2) protected abstract ITypegetPropertyOrMethodType(IType rootComponentType, IType compType) private static booleanisArrayOrCollection(IType type) static ObjectlistToArray(List l, IType compType) static ObjectlistToArray(List l, Class compType) static boolean[]static byte[]static char[]static double[]static float[]static int[]static long[]static short[]private IRExpressionmakeArray(IType componentType, IRExpression lengthExpression) Methods inherited from class gw.internal.gosu.ir.transform.expression.AbstractExpressionTransformer
_expr, compile, getIRParameters, pushArgumentsNoCasting, pushArgumentsWithCasting, shortCircuitValueMethods 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_implin 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
-