in core/src/main/java/org/adoptopenjdk/jitwatch/util/ParseUtil.java [468:579]
public static boolean paramClassesMatch(boolean memberHasVarArgs, List<String> memberParamClassesNames,
List<String> signatureParamClassesNames, boolean matchTypesExactly)
{
boolean result = true;
final int memberParamCount = memberParamClassesNames.size();
final int signatureParamCount = signatureParamClassesNames.size();
if (DEBUG_LOGGING_SIG_MATCH)
{
logger.debug("MemberParamCount:{} SignatureParamCount:{} varArgs:{}", memberParamCount, signatureParamCount,
memberHasVarArgs);
}
if (memberParamCount == 0 && signatureParamCount == 0)
{
if (DEBUG_LOGGING_SIG_MATCH)
{
logger.debug("both have zero params");
}
result = true;
}
else if (signatureParamCount < memberParamCount)
{
if (DEBUG_LOGGING_SIG_MATCH)
{
logger.debug("signature has less params than method");
}
result = false;
}
else if (signatureParamCount > memberParamCount && !memberHasVarArgs)
{
if (DEBUG_LOGGING_SIG_MATCH)
{
logger.debug("signature has more params than non-varargs method");
}
result = false;
}
else
{
// signature params >= memberParams
int memPos = 0;
for (int sigPos = 0; sigPos < signatureParamCount; sigPos++)
{
String sigParamClassName = signatureParamClassesNames.get(sigPos);
String memParamClassName = memberParamClassesNames.get(memPos);
if (DEBUG_LOGGING_SIG_MATCH)
{
logger.debug("Comparing member param[{}] {} to sig param[{}] {}", memPos, memParamClassName, sigPos, sigParamClassName);
}
boolean classMatch = false;
if (matchTypesExactly)
{
classMatch = memParamClassName.equals(sigParamClassName);
}
else
{
classMatch = memParamClassName.equals(sigParamClassName);
logger.error("matchTypesExactly=false not implemented");
}
if (classMatch)
{
if (DEBUG_LOGGING_SIG_MATCH)
{
logger.debug("{} equals/isAssignableFrom {}", memParamClassName, sigParamClassName);
}
}
else
{
boolean memberParamCouldBeVarArgs = false;
boolean isLastParameter = (memPos == memberParamCount - 1);
if (memberHasVarArgs && isLastParameter)
{
memberParamCouldBeVarArgs = true;
}
if (memberParamCouldBeVarArgs)
{
logger.debug("vararg member param {} approximately {}", memParamClassName, sigParamClassName);
}
else
{
result = false;
break;
}
} // if classMatch
memPos++;
if (memPos >= memberParamCount)
{
memPos = memberParamCount - 1;
}
} // for
}
return result;
}