private boolean processImplicitNamedParam(MethodNode mNode, Parameter mapParam, ArgumentListExpression args, List<String> propNames, Parameter fromParam) { boolean required = fromParam.hasInitialExpression(); String name = fromParam.getName(); if (hasDuplicates(mNode, propNames, name)) return false; AnnotationNode namedParam = new AnnotationNode(NAMED_PARAM_TYPE); namedParam.addMember("value", constX(name)); namedParam.addMember("type", classX(fromParam.getType())); namedParam.addMember("required", constX(required, true)); mapParam.addAnnotation(namedParam); args.addExpression(propX(varX(mapParam), name)); return true; }
AnnotationNode annotationNode = Annotations.createAnnotationNode(stub, resolver); if (annotationNode != null) { parameters[entry.getKey()].addAnnotation(annotationNode);
private boolean processDelegateParam(MethodNode mNode, Parameter mapParam, ArgumentListExpression args, List<String> propNames, Parameter fromParam) { if (isInnerClass(fromParam.getType())) { if (mNode.isStatic()) { addError("Error during " + MY_TYPE_NAME + " processing. Delegate type '" + fromParam.getType().getNameWithoutPackage() + "' is an inner class which is not supported.", mNode); return false; } } Set<String> names = new HashSet<String>(); List<PropertyNode> props = getAllProperties(names, fromParam.getType(), true, false, false, true, false, true); for (String next : names) { if (hasDuplicates(mNode, propNames, next)) return false; } List<MapEntryExpression> entries = new ArrayList<MapEntryExpression>(); for (PropertyNode pNode : props) { String name = pNode.getName(); entries.add(new MapEntryExpression(constX(name), propX(varX(mapParam), name))); AnnotationNode namedParam = new AnnotationNode(NAMED_PARAM_TYPE); namedParam.addMember("value", constX(name)); namedParam.addMember("type", classX(pNode.getType())); mapParam.addAnnotation(namedParam); } Expression delegateMap = new MapExpression(entries); args.addExpression(castX(fromParam.getType(), delegateMap)); return true; }
private boolean processExplicitNamedParam(MethodNode mNode, Parameter mapParam, BlockStatement inner, ArgumentListExpression args, List<String> propNames, Parameter fromParam) { AnnotationNode namedParam = fromParam.getAnnotations(NAMED_PARAM_TYPE).get(0); boolean required = memberHasValue(namedParam, "required", true); if (getMemberStringValue(namedParam, "value") == null) { namedParam.addMember("value", constX(fromParam.getName())); } String name = getMemberStringValue(namedParam, "value"); if (getMemberValue(namedParam, "type") == null) { namedParam.addMember("type", classX(fromParam.getType())); } if (hasDuplicates(mNode, propNames, name)) return false; // TODO check specified type is assignable from declared param type? // ClassNode type = getMemberClassValue(namedParam, "type"); if (required) { if (fromParam.hasInitialExpression()) { addError("Error during " + MY_TYPE_NAME + " processing. A required parameter can't have an initial value.", mNode); return false; } inner.addStatement(new AssertStatement(boolX(callX(varX(mapParam), "containsKey", args(constX(name)))), plusX(new ConstantExpression("Missing required named argument '" + name + "'. Keys found: "), callX(varX(mapParam), "keySet")))); } args.addExpression(propX(varX(mapParam), name)); mapParam.addAnnotation(namedParam); fromParam.getAnnotations().remove(namedParam); return true; }
public void visitMethod(MethodNode method){ super.visitMethod(method); Parameter[] parms = method.getParameters(); for(Parameter parm: parms){ AnnotationNode argNode = null; for (AnnotationNode annotation : parm.getAnnotations()) { if("Arg".equals(annotation.getClassNode().getName())){ argNode=annotation; break; } } if(argNode==null){ //dynamically add annotation so we can retain the parameter name AnnotationNode dynamicAnno = new AnnotationNode(new ClassNode(Arg.class)); dynamicAnno.addMember("name", new ConstantExpression(parm.getName())); parm.addAnnotation(dynamicAnno); } else{ //fill in name on existing annotation if it is missing if(argNode.getMember("name")==null){ argNode.addMember("name", new ConstantExpression(parm.getName())); } } } } }
public void visitMethod(MethodNode method){ super.visitMethod(method); Parameter[] parms = method.getParameters(); for(Parameter parm: parms){ AnnotationNode argNode = null; for (AnnotationNode annotation : parm.getAnnotations()) { if("Arg".equals(annotation.getClassNode().getName())){ argNode=annotation; break; } } if(argNode==null){ //dynamically add annotation so we can retain the parameter name AnnotationNode dynamicAnno = new AnnotationNode(new ClassNode(Arg.class)); dynamicAnno.addMember("name", new ConstantExpression(parm.getName())); parm.addAnnotation(dynamicAnno); } else{ //fill in name on existing annotation if it is missing if(argNode.getMember("name")==null){ argNode.addMember("name", new ConstantExpression(parm.getName())); } } } } }
AnnotationNode namedAnnotation = new AnnotationNode(NAMED_TYPE); namedAnnotation.addMember("value", new ConstantExpression(beanName)); erParam.addAnnotation(namedAnnotation);