public String getText() { String object = objectExpression.getText(); String text = property.getText(); String spread = isSpreadSafe() ? "*" : ""; String safe = isSafe() ? "?" : ""; return object + spread + safe + "." + text; }
private Expression transformPropertyAssignmentToSetterCall(final PropertyExpression leftExpression, final Expression rightExpression, final MethodNode directMCT) { // transform "a.x = b" into "def tmp = b; a.setX(tmp); tmp" Expression arg = staticCompilationTransformer.transform(rightExpression); return StaticPropertyAccessHelper.transformToSetterCall( leftExpression.getObjectExpression(), directMCT, arg, false, leftExpression.isSafe(), false, true, // to be replaced with a proper test whether a return value should be used or not leftExpression ); }
public void fallbackAttributeOrPropertySite(PropertyExpression expression, Expression objectExpression, String name, MethodCallerMultiAdapter adapter) { if (controller.getCompileStack().isLHS()) controller.getOperandStack().box(); controller.getInvocationWriter().makeCall( expression, objectExpression, // receiver new CastExpression(ClassHelper.STRING_TYPE, expression.getProperty()), // messageName MethodCallExpression.NO_ARGUMENTS, adapter, expression.isSafe(), expression.isSpreadSafe(), expression.isImplicitThis() ); } }
} else if (exp instanceof MethodCallExpression && ((MethodCallExpression) exp).isSafe() && isPrimitiveType(cn)) { cn = getWrapper(cn); } else if (exp instanceof PropertyExpression && ((PropertyExpression) exp).isSafe() && isPrimitiveType(cn)) { cn = getWrapper(cn);
@Override public void visitPropertyExpression(PropertyExpression expr) { PropertyExpression conversion = new PropertyExpression( expr.isImplicitThis() ? expr.getObjectExpression() : convert(expr.getObjectExpression()), expr.getProperty(), expr.isSafe()); conversion.setSourcePosition(expr); conversion.setSpreadSafe(expr.isSpreadSafe()); conversion.setStatic(expr.isStatic()); conversion.setImplicitThis(expr.isImplicitThis()); result = record(conversion); }
@Override public void visitPropertyExpression(PropertyExpression expr) { PropertyExpression result = new PropertyExpression( replaceExpr(expr.getObjectExpression()), replaceExpr(expr.getProperty()), expr.isSafe() ); result.setSpreadSafe(expr.isSpreadSafe()); result.setStatic(expr.isStatic()); result.setImplicitThis(expr.isImplicitThis()); result.setType(expr.getType()); result.setSourcePosition(expr); replaceVisitedExpressionWith(result); }
pexp, ((PropertyExpression) origin).getProperty(), ((PropertyExpression) origin).isSafe() ); rewritten.setSpreadSafe(((PropertyExpression) origin).isSpreadSafe());
@Override public void evaluateEqual(final BinaryExpression expression, final boolean defineVariable) { if (!defineVariable) { Expression leftExpression = expression.getLeftExpression(); if (leftExpression instanceof PropertyExpression) { PropertyExpression pexp = (PropertyExpression) leftExpression; if (makeSetProperty( pexp.getObjectExpression(), pexp.getProperty(), expression.getRightExpression(), pexp.isSafe(), pexp.isSpreadSafe(), pexp.isImplicitThis(), pexp instanceof AttributeExpression)) return; } } // GROOVY-5620: Spread safe/Null safe operator on LHS is not supported if (expression.getLeftExpression() instanceof PropertyExpression && ((PropertyExpression) expression.getLeftExpression()).isSpreadSafe() && StaticTypeCheckingSupport.isAssignment(expression.getOperation().getType())) { // rewrite it so that it can be statically compiled transformSpreadOnLHS(expression); return; } super.evaluateEqual(expression, defineVariable); }
pe = new PropertyExpression(objectExpression, property, pe.isSafe()); pe.setSpreadSafe(spreadSafe); pe.setSourcePosition(old);
private boolean getField(PropertyExpression expression, Expression receiver, ClassNode receiverType, String name) { ClassNode classNode = controller.getClassNode(); boolean safe = expression.isSafe(); boolean implicitThis = expression.isImplicitThis(); if (makeGetField(receiver, receiverType, name, safe, implicitThis, samePackages(receiverType.getPackageName(), classNode.getPackageName()))) return true; if (receiver instanceof ClassExpression) { if (makeGetField(receiver, receiver.getType(), name, safe, implicitThis, samePackages(receiver.getType().getPackageName(), classNode.getPackageName()))) return true; if (makeGetPrivateFieldWithBridgeMethod(receiver, receiver.getType(), name, safe, implicitThis)) return true; } if (makeGetPrivateFieldWithBridgeMethod(receiver, receiverType, name, safe, implicitThis)) return true; boolean isClassReceiver = false; if (isClassClassNodeWrappingConcreteType(receiverType)) { isClassReceiver = true; receiverType = receiverType.getGenericsTypes()[0].getType(); } if (isClassReceiver && makeGetField(receiver, CLASS_Type, name, safe, false, true)) return true; if (receiverType.isEnum()) { controller.getMethodVisitor().visitFieldInsn(GETSTATIC, BytecodeHelper.getClassInternalName(receiverType), name, BytecodeHelper.getTypeDescription(receiverType)); controller.getOperandStack().push(receiverType); return true; } return false; } }
private boolean setField(PropertyExpression expression, Expression objectExpression, ClassNode rType, String name) { if (expression.isSafe()) return false; FieldNode fn = AsmClassGenerator.getDeclaredFieldOfCurrentClassOrAccessibleFieldOfSuper(controller.getClassNode(), rType, name, false); if (fn==null) return false; OperandStack stack = controller.getOperandStack(); stack.doGroovyCast(fn.getType()); MethodVisitor mv = controller.getMethodVisitor(); String ownerName = BytecodeHelper.getClassInternalName(fn.getOwner()); if (!fn.isStatic()) { controller.getCompileStack().pushLHS(false); objectExpression.visit(controller.getAcg()); controller.getCompileStack().popLHS(); if (!rType.equals(stack.getTopOperand())) { BytecodeHelper.doCast(mv, rType); stack.replace(rType); } stack.swap(); mv.visitFieldInsn(PUTFIELD, ownerName, name, BytecodeHelper.getTypeDescription(fn.getType())); stack.remove(1); } else { mv.visitFieldInsn(PUTSTATIC, ownerName, name, BytecodeHelper.getTypeDescription(fn.getType())); } //mv.visitInsn(ACONST_NULL); //stack.replace(OBJECT_TYPE); return true; }
controller.getCallSiteWriter().makeGetPropertySite(objectExpression, propName, expression.isSafe(), expression.isImplicitThis()); } else if (adapter == getGroovyObjectProperty && !expression.isSpreadSafe()) { controller.getCallSiteWriter().makeGroovyObjectGetPropertySite(objectExpression, propName, expression.isSafe(), expression.isImplicitThis()); } else { controller.getCallSiteWriter().fallbackAttributeOrPropertySite(expression, objectExpression, propName, adapter);
/** * Tells you if the expression is a null safe dereference. * @param expression * expression * @return * true if is null safe dereference. */ public static boolean isSafe(Expression expression) { if (expression instanceof MethodCallExpression) { return ((MethodCallExpression) expression).isSafe(); } if (expression instanceof PropertyExpression) { return ((PropertyExpression) expression).isSafe(); } return false; }
public String getText() { String object = objectExpression.getText(); String text = property.getText(); String spread = isSpreadSafe() ? "*" : ""; String safe = isSafe() ? "?" : ""; return object + spread + safe + "." + text; }
@Override public void run() { loc(exp); visit(exp.getObjectExpression()); visit(exp.getProperty()); literal(exp.isSafe()); } });
@Override public void run() { loc(exp); visit(exp.getObjectExpression()); visit(exp.getProperty()); literal(exp.isSafe()); } });
makeGetPropertySite(objectExpression, methodName, expression.isSafe(), expression.isImplicitThis()); makeGroovyObjectGetPropertySite(objectExpression, methodName, expression.isSafe(), expression.isImplicitThis()); MethodCallExpression.NO_ARGUMENTS, adapter, expression.isSafe(), expression.isSpreadSafe(), expression.isImplicitThis() );
@Override public void visitPropertyExpression(PropertyExpression expr) { PropertyExpression result = new PropertyExpression( replaceExpr(expr.getObjectExpression()), replaceExpr(expr.getProperty()), expr.isSafe() ); result.setSpreadSafe(expr.isSpreadSafe()); result.setStatic(expr.isStatic()); result.setImplicitThis(expr.isImplicitThis()); result.setType(expr.getType()); result.setSourcePosition(expr); replaceVisitedExpressionWith(result); }
pe = new PropertyExpression(objectExpression, property, pe.isSafe()); pe.setSpreadSafe(spreadSafe); pe.setSourcePosition(old);
pe = new PropertyExpression(objectExpression, property, pe.isSafe()); pe.setSpreadSafe(spreadSafe); pe.setSourcePosition(old);