public FuzzyBoolean matches(Class[] types, TypePattern.MatchKind kind) {
public FuzzyBoolean matches(ResolvedTypeX[] types, TypePattern.MatchKind kind) {
    public FuzzyBoolean matches(Class[] types, TypePattern.MatchKind kind) {    	int nameLength = types.length;		int patternLength = typePatterns.length;				int nameIndex = 0;		int patternIndex = 0;				if (ellipsisCount == 0) {			if (nameLength != patternLength) return FuzzyBoolean.NO;			FuzzyBoolean finalReturn = FuzzyBoolean.YES;			while (patternIndex < patternLength) {				FuzzyBoolean ret = typePatterns[patternIndex++].matches(types[nameIndex++], kind);				if (ret == FuzzyBoolean.NO) return ret;				if (ret == FuzzyBoolean.MAYBE) finalReturn = ret;			}			return finalReturn;		} else if (ellipsisCount == 1) {			if (nameLength < patternLength-1) return FuzzyBoolean.NO;			FuzzyBoolean finalReturn = FuzzyBoolean.YES;			while (patternIndex < patternLength) {				TypePattern p = typePatterns[patternIndex++];				if (p == TypePattern.ELLIPSIS) {					nameIndex = nameLength - (patternLength-patternIndex);				} else {					FuzzyBoolean ret = p.matches(types[nameIndex++], kind);				    if (ret == FuzzyBoolean.NO) return ret;				    if (ret == FuzzyBoolean.MAYBE) finalReturn = ret;				}			}			return finalReturn;		} else {//            System.err.print("match(" + arguments + ", " + types + ") -> ");            FuzzyBoolean b =  outOfStar(typePatterns, types, 0, 0, patternLength - ellipsisCount, nameLength, ellipsisCount, kind);//            System.err.println(b);            return b;    	}    }