in core/src/main/java/org/adoptopenjdk/jitwatch/compilation/CompilationUtil.java [200:320]
public static boolean memberMatchesMethodID(IMetaMember member, String methodID, IParseDictionary parseDictionary)
{
boolean result = false;
Tag methodTag = parseDictionary.getMethod(methodID);
StringBuilder builder = null;
if (DEBUG_LOGGING_METHOD_ID_MATCH)
{
builder = new StringBuilder();
builder.append(
String.format("methodID: %s methodTag: %s", methodID, methodTag != null ? methodTag.toString(true) : "null"))
.append(S_NEWLINE);
builder.append(String.format("member: %s ", member.toString())).append(S_NEWLINE);
}
if (methodTag != null)
{
Map<String, String> methodTagAttributes = methodTag.getAttributes();
String klassID = methodTagAttributes.get(ATTR_HOLDER);
Tag klassTag = parseDictionary.getKlass(klassID);
if (klassTag != null)
{
if (DEBUG_LOGGING_METHOD_ID_MATCH)
{
builder.append(String.format("klass tag: %s", klassTag.toString(false))).append(S_NEWLINE);
}
String klassAttrName = klassTag.getAttributes().get(ATTR_NAME);
String methodAttrName = StringUtil.replaceXMLEntities(methodTagAttributes.get(ATTR_NAME));
if (klassAttrName != null)
{
klassAttrName = klassAttrName.replace(C_SLASH, C_DOT);
}
String returnType = ParseUtil.getMethodTagReturn(methodTag, parseDictionary);
List<String> paramTypes = ParseUtil.getMethodTagArguments(methodTag, parseDictionary);
if (DEBUG_LOGGING_METHOD_ID_MATCH)
{
builder.append(String.format("memberName: %s/%s", member.getMemberName(), methodAttrName)).append(S_NEWLINE);
builder.append(String.format("metaClass : %s/%s", member.getMetaClass().getFullyQualifiedName(), klassAttrName))
.append(S_NEWLINE);
builder.append(String.format("return : %s/%s", member.getReturnTypeName(), returnType)).append(S_NEWLINE);
builder.append(String.format("params : %s/%s", StringUtil.arrayToString(member.getParamTypeNames()),
StringUtil.listToString(paramTypes))).append(S_NEWLINE);
}
boolean nameMatches;
if (S_CONSTRUCTOR_INIT.equals(methodAttrName))
{
if (DEBUG_LOGGING_METHOD_ID_MATCH)
{
builder.append(
String.format("Looks like a constructor. Checking %s vs %s", member.getMemberName(), klassAttrName))
.append(S_NEWLINE);
}
String unqualifiedClassName = StringUtil.getUnqualifiedClassName(klassAttrName);
nameMatches = member.getMemberName().equals(unqualifiedClassName);
}
else
{
nameMatches = member.getMemberName().equals(methodAttrName);
}
boolean klassMatches = member.getMetaClass().getFullyQualifiedName().equals(klassAttrName);
boolean returnMatches = member.getReturnTypeName().equals(returnType);
boolean paramsMatch = true;
if (member.getParamTypeNames().length == paramTypes.size())
{
for (int pos = 0; pos < member.getParamTypeNames().length; pos++)
{
String memberParamType = member.getParamTypeNames()[pos];
String tagParamType = paramTypes.get(pos);
if (DEBUG_LOGGING_METHOD_ID_MATCH)
{
builder.append(String.format("checking: %s/%s", memberParamType, tagParamType)).append(S_NEWLINE);
}
if (!memberParamType.equals(tagParamType))
{
paramsMatch = false;
break;
}
}
}
else
{
paramsMatch = false;
}
result = nameMatches && klassMatches && returnMatches && paramsMatch;
if (DEBUG_LOGGING_METHOD_ID_MATCH)
{
builder.append(String.format("Matched name: %s klass: %s return: %s params: %s", nameMatches, klassMatches,
returnMatches, paramsMatch)).append(S_NEWLINE);
builder.append(String.format("Matches member:%s = %s", member, result)).append(S_NEWLINE);
if (!result)
{
logger.error(builder.toString());
}
}
}
}
return result;
}