public void visit(ASTNode[] nodes, SourceUnit source) { init(nodes, source); addError("You can only delegate to methods that take no parameters, but " + delegate.name + " takes " + methodNode.getParameters().length + " parameters.", parent); addError(MY_TYPE_NAME + " " + delegate.origin + " '" + delegate.name + "' has an inappropriate type: " + delegate.type.getName() + ". Please add an explicit type but not java.lang.Object or groovy.lang.GroovyObject.", parent); return; addError(MY_TYPE_NAME + " " + delegate.origin + " '" + delegate.name + "' has an inappropriate type: " + delegate.type.getName() + ". Delegation to own type not supported. Please use a different type.", parent); return; final boolean skipInterfaces = memberHasValue(node, MEMBER_INTERFACES, false); final boolean includeDeprecated = memberHasValue(node, MEMBER_DEPRECATED, true) || (delegate.type.isInterface() && !skipInterfaces); final boolean allNames = memberHasValue(node, MEMBER_ALL_NAMES, true); delegate.excludes = getMemberStringList(node, MEMBER_EXCLUDES); delegate.includes = getMemberStringList(node, MEMBER_INCLUDES); delegate.excludeTypes = getMemberClassList(node, MEMBER_EXCLUDE_TYPES); delegate.includeTypes = getMemberClassList(node, MEMBER_INCLUDE_TYPES); checkIncludeExcludeUndefinedAware(node, delegate.excludes, delegate.includes, delegate.excludeTypes, delegate.includeTypes, MY_TYPE_NAME); addDelegateMethod(delegate, ownerMethods, mn, includeDeprecated, allNames); continue; String name = prop.getName(); addGetterIfNeeded(delegate, prop, name, allNames);
private static String getParamName(Parameter[] params, int i, String fieldName) { String name = params[i].getName(); while(name.equals(fieldName) || clashesWithOtherParams(name, params, i)) { name = "_" + name; } return name; }
final ClassNode owner = fieldNode.getOwner(); if (type.equals(ClassHelper.OBJECT_TYPE) || type.equals(GROOVYOBJECT_TYPE)) { addError("@Delegate field '" + fieldNode.getName() + "' has an inappropriate type: " + type.getName() + ". Please add an explicit type but not java.lang.Object or groovy.lang.GroovyObject.", parent, source); return; addError("@Delegate field '" + fieldNode.getName() + "' has an inappropriate type: " + type.getName() + ". Delegation to own type not supported. Please use a different type.", parent, source); return; final List<MethodNode> fieldMethods = getAllMethods(type); for (ClassNode next : type.getAllInterfaces()) { fieldMethods.addAll(getAllMethods(next)); final boolean skipInterfaces = hasBooleanValue(interfacesElement, false); final boolean includeDeprecated = hasBooleanValue(deprecatedElement, true) || (type.isInterface() && !skipInterfaces); final List<MethodNode> ownerMethods = getAllMethods(owner); for (MethodNode mn : fieldMethods) { addDelegateMethod(fieldNode, owner, ownerMethods, mn, includeDeprecated); continue; String name = prop.getName(); addGetterIfNeeded(fieldNode, owner, prop, name); addSetterIfNeeded(fieldNode, owner, prop, name); final Set<ClassNode> allInterfaces = getInterfacesAndSuperInterfaces(type); final Set<ClassNode> ownerIfaces = owner.getAllInterfaces(); for (ClassNode iface : allInterfaces) {
addDelegateMethod(fieldNode, owner, ownMethods, e, deprecated); addGetterIfNeeded(fieldNode, owner, prop, name); addSetterIfNeeded(fieldNode, owner, prop, name);
private void addDelegateMethod(FieldNode fieldNode, ClassNode owner, Map ownMethods, Map.Entry e) { MethodNode method = (MethodNode) e.getValue(); if (!method.isPublic() || method.isStatic()) return; if (!ownMethods.containsKey(e.getKey())) { final ArgumentListExpression args = new ArgumentListExpression(); final Parameter[] params = method.getParameters(); final Parameter[] newParams = new Parameter[params.length]; for (int i = 0; i < newParams.length; i++) { Parameter newParam = new Parameter(nonGeneric(params[i].getType()), params[i].getName()); newParams[i] = newParam; args.addExpression(new VariableExpression(newParam)); } owner.addMethod(method.getName(), method.getModifiers() & (~ACC_ABSTRACT), nonGeneric(method.getReturnType()), newParams, method.getExceptions(), new ExpressionStatement( new MethodCallExpression( new FieldExpression(fieldNode), method.getName(), args))); } }
Map.Entry e = (Map.Entry) it.next(); addDelegateMethod(fieldNode, owner, ownMethods, e); owner.addMethod(getterName, ACC_PUBLIC, nonGeneric(prop.getType()), Parameter.EMPTY_ARRAY, null, ACC_PUBLIC, ClassHelper.VOID_TYPE, new Parameter[] {new Parameter(nonGeneric(prop.getType()), "value")}, null, new ExpressionStatement(
private void addDelegateMethod(FieldNode fieldNode, ClassNode owner, Map<String, MethodNode> ownMethods, Map.Entry<String, MethodNode> e, boolean deprecated) { MethodNode method = e.getValue(); if (!method.isPublic() || method.isStatic() || 0 != (method.getModifiers () & Opcodes.ACC_SYNTHETIC)) return; if (!method.getAnnotations(DEPRECATED_TYPE).isEmpty() && !deprecated) return; MethodNode existingNode = ownMethods.get(e.getKey()); // TODO work out why the code was null for super interfaces if (existingNode == null || existingNode.getCode() == null) { final ArgumentListExpression args = new ArgumentListExpression(); final Parameter[] params = method.getParameters(); final Parameter[] newParams = new Parameter[params.length]; for (int i = 0; i < newParams.length; i++) { Parameter newParam = new Parameter(nonGeneric(params[i].getType()), params[i].getName()); newParams[i] = newParam; args.addExpression(new VariableExpression(newParam)); } owner.addMethod(method.getName(), method.getModifiers() & (~ACC_ABSTRACT) & (~ACC_NATIVE), nonGeneric(method.getReturnType()), newParams, method.getExceptions(), new ExpressionStatement( new MethodCallExpression( new FieldExpression(fieldNode), method.getName(), args))); } }
private void addGetterIfNeeded(FieldNode fieldNode, ClassNode owner, PropertyNode prop, String name) { String getterName = "get" + Verifier.capitalize(name); if (owner.getGetterMethod(getterName) == null) { owner.addMethod(getterName, ACC_PUBLIC, nonGeneric(prop.getType()), Parameter.EMPTY_ARRAY, null, new ReturnStatement( new PropertyExpression( new FieldExpression(fieldNode), name))); } }
private void addGetterIfNeeded(FieldNode fieldNode, ClassNode owner, PropertyNode prop, String name) { String getterName = "get" + Verifier.capitalize(name); if (owner.getGetterMethod(getterName) == null) { owner.addMethod(getterName, ACC_PUBLIC, nonGeneric(prop.getType()), Parameter.EMPTY_ARRAY, null, new ReturnStatement( new PropertyExpression( new VariableExpression(fieldNode), name))); } }
final Parameter[] newParams = new Parameter[params.length]; for (int i = 0; i < newParams.length; i++) { Parameter newParam = new Parameter(nonGeneric(params[i].getType()), params[i].getName()); newParam.setInitialExpression(params[i].getInitialExpression()); newParams[i] = newParam; nonGeneric(candidate.getReturnType()), newParams, candidate.getExceptions(),
private void addSetterIfNeeded(FieldNode fieldNode, ClassNode owner, PropertyNode prop, String name) { String setterName = "set" + Verifier.capitalize(name); if ((prop.getModifiers() & ACC_FINAL) != 0 && owner.getSetterMethod(setterName) == null) { owner.addMethod(setterName, ACC_PUBLIC, ClassHelper.VOID_TYPE, new Parameter[]{new Parameter(nonGeneric(prop.getType()), "value")}, null, new ExpressionStatement( new BinaryExpression( new PropertyExpression( new FieldExpression(fieldNode), name), Token.newSymbol(Types.EQUAL, -1, -1), new VariableExpression("value")))); } }
private void addSetterIfNeeded(FieldNode fieldNode, ClassNode owner, PropertyNode prop, String name) { String setterName = "set" + Verifier.capitalize(name); if ((prop.getModifiers() & ACC_FINAL) == 0 && owner.getSetterMethod(setterName) == null) { owner.addMethod(setterName, ACC_PUBLIC, ClassHelper.VOID_TYPE, new Parameter[]{new Parameter(nonGeneric(prop.getType()), "value")}, null, new ExpressionStatement( new BinaryExpression( new PropertyExpression( new VariableExpression(fieldNode), name), Token.newSymbol(Types.EQUAL, -1, -1), new VariableExpression("value")))); } }