public static boolean isWildcardRef(Expression expr) { VariableExpression varExpr = ObjectUtil.asInstance(expr, VariableExpression.class); if (varExpr == null || !varExpr.getName().equals(Wildcard.INSTANCE.toString())) return false; Variable accessedVar = varExpr.getAccessedVariable(); if (!(accessedVar instanceof FieldNode)) return false; return ((FieldNode) accessedVar).getOwner().getName().equals(Specification.class.getName()); }
static String helperGetterName(final FieldNode field) { return remappedFieldName(unwrapOwner(field.getOwner()), field.getName()) + DIRECT_GETTER_SUFFIX; }
static String helperSetterName(final FieldNode field) { return remappedFieldName(unwrapOwner(field.getOwner()), field.getName()) + DIRECT_SETTER_SUFFIX; }
@Override public void visitClass(ClassNode node) { FieldNode logField = node.getField(logFieldName); if (logField != null && logField.getOwner().equals(node)) { addError("Class annotated with Log annotation cannot have log field declared", logField); } else if (logField != null && !Modifier.isPrivate(logField.getModifiers())) { addError("Class annotated with Log annotation cannot have log field declared because the field exists in the parent class: " + logField.getOwner().getName(), logField); } else { logNode = loggingStrategy.addLoggerFieldToClass(node, logFieldName, categoryName); } super.visitClass(node); }
/** * RHS instance field. should move most of the code in the BytecodeHelper * * @param fldExp */ public void loadInstanceField(FieldExpression fldExp) { MethodVisitor mv = controller.getMethodVisitor(); FieldNode field = fldExp.getField(); boolean holder = field.isHolder() && !controller.isInClosureConstructor(); ClassNode type = field.getType(); String ownerName = (field.getOwner().equals(controller.getClassNode())) ? controller.getInternalClassName() : BytecodeHelper.getClassInternalName(field.getOwner()); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ownerName, fldExp.getFieldName(), BytecodeHelper.getTypeDescription(type)); if (holder) { mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference", "get", "()Ljava/lang/Object;", false); controller.getOperandStack().push(ClassHelper.OBJECT_TYPE); } else { controller.getOperandStack().push(field.getType()); } }
/** * @param fldExp */ public void loadStaticField(FieldExpression fldExp) { MethodVisitor mv = controller.getMethodVisitor(); FieldNode field = fldExp.getField(); boolean holder = field.isHolder() && !controller.isInClosureConstructor(); ClassNode type = field.getType(); String ownerName = (field.getOwner().equals(controller.getClassNode())) ? controller.getInternalClassName() : BytecodeHelper.getClassInternalName(field.getOwner()); if (holder) { mv.visitFieldInsn(GETSTATIC, ownerName, fldExp.getFieldName(), BytecodeHelper.getTypeDescription(type)); mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference", "get", "()Ljava/lang/Object;", false); controller.getOperandStack().push(ClassHelper.OBJECT_TYPE); } else { mv.visitFieldInsn(GETSTATIC, ownerName, fldExp.getFieldName(), BytecodeHelper.getTypeDescription(type)); controller.getOperandStack().push(field.getType()); } }
private void storeStaticField(FieldExpression expression) { MethodVisitor mv = controller.getMethodVisitor(); FieldNode field = expression.getField(); boolean holder = field.isHolder() && !controller.isInClosureConstructor(); controller.getOperandStack().doGroovyCast(field); String ownerName = (field.getOwner().equals(controller.getClassNode())) ? controller.getInternalClassName() : BytecodeHelper.getClassInternalName(field.getOwner()); if (holder) { controller.getOperandStack().box(); mv.visitFieldInsn(GETSTATIC, ownerName, expression.getFieldName(), BytecodeHelper.getTypeDescription(field.getType())); mv.visitInsn(SWAP); mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference", "set", "(Ljava/lang/Object;)V", false); } else { mv.visitFieldInsn(PUTSTATIC, ownerName, expression.getFieldName(), BytecodeHelper.getTypeDescription(field.getType())); } controller.getOperandStack().remove(1); }
OperandStack operandStack = controller.getOperandStack(); if (field.isStatic()) { mv.visitFieldInsn(GETSTATIC, BytecodeHelper.getClassInternalName(field.getOwner()), fieldName, BytecodeHelper.getTypeDescription(replacementType)); operandStack.push(replacementType); } else { mv.visitLabel(doGet); if (!operandStack.getTopOperand().isDerivedFrom(field.getOwner())) { mv.visitTypeInsn(CHECKCAST, BytecodeHelper.getClassInternalName(field.getOwner())); mv.visitFieldInsn(GETFIELD, BytecodeHelper.getClassInternalName(field.getOwner()), fieldName, BytecodeHelper.getTypeDescription(replacementType)); if (safe) { if (ClassHelper.isPrimitiveType(replacementType)) {
private void storeThisInstanceField(FieldExpression expression) { MethodVisitor mv = controller.getMethodVisitor(); FieldNode field = expression.getField(); boolean setReferenceFromReference = field.isHolder() && expression.isUseReferenceDirectly(); String ownerName = (field.getOwner().equals(controller.getClassNode())) ? controller.getInternalClassName() : BytecodeHelper.getClassInternalName(field.getOwner()); OperandStack operandStack = controller.getOperandStack(); if (setReferenceFromReference) { // rhs is ready to use reference, just put it in the field mv.visitVarInsn(ALOAD, 0); operandStack.push(controller.getClassNode()); operandStack.swap(); mv.visitFieldInsn(PUTFIELD, ownerName, field.getName(), BytecodeHelper.getTypeDescription(field.getType())); } else if (field.isHolder()){ // rhs is normal value, set the value in the Reference operandStack.doGroovyCast(field.getOriginType()); operandStack.box(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ownerName, expression.getFieldName(), BytecodeHelper.getTypeDescription(field.getType())); mv.visitInsn(SWAP); mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference", "set", "(Ljava/lang/Object;)V", false); } else { // rhs is normal value, set normal value operandStack.doGroovyCast(field.getOriginType()); mv.visitVarInsn(ALOAD, 0); operandStack.push(controller.getClassNode()); operandStack.swap(); mv.visitFieldInsn(PUTFIELD, ownerName, field.getName(), BytecodeHelper.getTypeDescription(field.getType())); } }
delegate.name = fieldNode.getName(); delegate.type = fieldNode.getType(); delegate.owner = fieldNode.getOwner(); delegate.getOp = varX(fieldNode); delegate.origin = "field";
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; }
operandStack.doGroovyCast(fn.getOriginType()); mv.visitFieldInsn(fn.isStatic() ? PUTSTATIC : PUTFIELD, BytecodeHelper.getClassInternalName(fn.getOwner()), property, BytecodeHelper.getTypeDescription(fn.getOriginType()));
public void putField(FieldNode fld) { putField(fld, getClassInternalName(fld.getOwner())); }
public void putField(FieldNode fld) { putField(fld, getClassInternalName(fld.getOwner())); }
public void putField(FieldNode fld) { putField(fld, getClassInternalName(fld.getOwner())); }
public void removeChromatticField(ClassNode classNode) { Iterator<FieldNode> it = classNode.getFields().iterator(); while(it.hasNext()) { FieldNode fieldNode = it.next(); if (GroovyUtils.isChromatticAnnoted(GroovyUtils.getGetter(classNode, fieldNode))) { it.remove(); fieldNode.getOwner().redirect().renameField(fieldNode.getName(), fieldNode.getName() + "_"); } } } }
@Override public void visitClass(ClassNode node) { FieldNode logField = node.getField(logFieldName); if (logField != null && logField.getOwner().equals(node)) { addError("Class annotated with Log annotation cannot have log field declared", logField); } else if (logField != null && !Modifier.isPrivate(logField.getModifiers())) { addError("Class annotated with Log annotation cannot have log field declared because the field exists in the parent class: " + logField.getOwner().getName(), logField); } else { logNode = loggingStrategy.addLoggerFieldToClass(node, logFieldName); } super.visitClass(node); }
/** * Creates a copy of a FieldNode with a new name and, optionally, a new type. * * @param newName The name for the new field node. * @param newType The new type of the field. If null, the old FieldNode's type will be used. * @param f The FieldNode to copy. * * @return The new FieldNode. */ private FieldNode createFieldNodeCopy(String newName, ClassNode newType, FieldNode f) { if (newType == null) { newType = f.getType(); } newType = newType.getPlainNodeReference(); return new FieldNode(newName, f.getModifiers(), newType, f.getOwner(), f.getInitialValueExpression()); }
/** * Creates a copy of a FieldNode with a new name and, optionally, a new type. * * @param newName The name for the new field node. * @param newType The new type of the field. If null, the old FieldNode's type will be used. * @param f The FieldNode to copy. * @return The new FieldNode. */ private FieldNode createFieldNodeCopy(String newName, ClassNode newType, FieldNode f) { if (newType == null) newType = f.getType(); newType = newType.getPlainNodeReference(); return new FieldNode(newName, f.getModifiers(), newType, f.getOwner(), f.getInitialValueExpression()); }