private void setPropertyOfSuperClass(ClassNode classNode, PropertyExpression expression, MethodVisitor mv) {
String fieldName = expression.getPropertyAsString();
FieldNode fieldNode = classNode.getSuperClass().getField(fieldName);
if (null == fieldNode) {
throw new RuntimeParserException("Failed to find field[" + fieldName + "] of " + classNode.getName() + "'s super class", expression);
}
if (fieldNode.isFinal()) {
throw new RuntimeParserException("Cannot modify final field[" + fieldName + "] of " + classNode.getName() + "'s super class", expression);
}
MethodNode setter = findSetterOfSuperClass(classNode, fieldNode);
MethodNode getter = findGetterOfSuperClass(classNode, fieldNode);
if (fieldNode.isPrivate() && !getterAndSetterExists(setter, getter)) {
throw new RuntimeParserException("Cannot access private field[" + fieldName + "] of " + classNode.getName() + "'s super class", expression);
}
OperandStack operandStack = controller.getOperandStack();
operandStack.doAsType(fieldNode.getType());
mv.visitVarInsn(ALOAD, 0);
operandStack.push(classNode);
operandStack.swap();
String owner = BytecodeHelper.getClassInternalName(classNode.getSuperClass().getName());
String desc = BytecodeHelper.getTypeDescription(fieldNode.getType());
if (fieldNode.isPublic() || fieldNode.isProtected()) {
mv.visitFieldInsn(PUTFIELD, owner, fieldName, desc);
} else {
mv.visitMethodInsn(INVOKESPECIAL, owner, setter.getName(), BytecodeHelper.getMethodDescriptor(setter), false);
}
}