TypeX argType = shadow.getArgType(i);
TypeX argType = shadow.getArgType(argsIndex);
	public Test findResidue(Shadow shadow, ExposedState state) {		int len = shadow.getArgCount();			// do some quick length tests first		int numArgsMatchedByEllipsis = (len + arguments.ellipsisCount) - arguments.size();		if (numArgsMatchedByEllipsis < 0) return Literal.FALSE;  // should never happen		if ((numArgsMatchedByEllipsis > 0) && (arguments.ellipsisCount == 0)) {			return Literal.FALSE; // should never happen		}		// now work through the args and the patterns, skipping at ellipsis    	Test ret = Literal.TRUE;    	int argsIndex = 0;    	for (int i = 0; i < arguments.size(); i++) {			if (arguments.get(i) == AnnotationTypePattern.ELLIPSIS) {				// match ellipsisMatchCount args				argsIndex += numArgsMatchedByEllipsis;			} else if (arguments.get(i) == AnnotationTypePattern.ANY) {				argsIndex++;			} else {				// match the argument type at argsIndex with the ExactAnnotationTypePattern				// we know it is exact because nothing else is allowed in args				ExactAnnotationTypePattern ap = (ExactAnnotationTypePattern)arguments.get(i);				TypeX argType = shadow.getArgType(i);				ResolvedTypeX rArgType = argType.resolve(shadow.getIWorld());				if (rArgType == ResolvedTypeX.MISSING) {	                  IMessage msg = new Message(	                    WeaverMessages.format(WeaverMessages.CANT_FIND_TYPE_ARG_TYPE,argType.getName()),	                    "",IMessage.ERROR,shadow.getSourceLocation(),null,new ISourceLocation[]{getSourceLocation()});	            }				if (ap.matches(rArgType).alwaysTrue()) {					continue;				} else {					// we need a test...					// TODO: binding					ResolvedTypeX rAnnType = ap.annotationType.resolve(shadow.getIWorld());					ret = Test.makeAnd(ret,Test.makeHasAnnotation(shadow.getArgVar(i),rAnnType));				}							}		}   	    	return ret;	}