IBinaryMethod[] methods = typeInfo.getMethods();
if (methods == null) {
return;
}
for (int i = 0, methodCount = methods.length; i < methodCount; i++) {
IBinaryMethod methodInfo = methods[i];
final boolean isConstructor = methodInfo.isConstructor();
boolean isEnum = false;
try {
isEnum = type.isEnum();
} catch (JavaModelException e) {
// ignore
}
// TODO (jerome) filter out synthetic members
// indexer should not index them as well
// if ((methodInfo.getModifiers() & IConstants.AccSynthetic) != 0) continue; // skip synthetic
boolean useGenericSignature = true;
char[] signature = methodInfo.getGenericSignature();
String[] pNames = null;
if (signature == null) {
useGenericSignature = false;
signature = methodInfo.getMethodDescriptor();
if (isEnum && isConstructor) {
pNames = Signature.getParameterTypes(new String(signature));
int length = pNames.length - 2;
if (length >= 0) // https://bugs.eclipse.org/bugs/show_bug.cgi?id=436347
System.arraycopy(pNames, 2, pNames = new String[length], 0, length);
}
}
String selector = new String(methodInfo.getSelector());
if (isConstructor) {
selector = type.getElementName();
}
try {
if (!(isEnum && isConstructor && !useGenericSignature)) {
pNames = Signature.getParameterTypes(new String(signature));
}
if (isConstructor
&& useGenericSignature
&& type.isMember()
&& !Flags.isStatic(type.getFlags())) {
int length = pNames.length;
System.arraycopy(pNames, 0, (pNames = new String[length + 1]), 1, length);
char[] descriptor = methodInfo.getMethodDescriptor();
final String[] parameterTypes = Signature.getParameterTypes(new String(descriptor));
pNames[0] = parameterTypes[0];
}
} catch (IllegalArgumentException e) {
// protect against malformed .class file (e.g. com/sun/crypto/provider/SunJCE_b.class has a 'a' generic signature)
signature = methodInfo.getMethodDescriptor();
pNames = Signature.getParameterTypes(new String(signature));
} catch (JavaModelException e) {
// protect against malformed .class file (e.g. com/sun/crypto/provider/SunJCE_b.class has a 'a' generic signature)
signature = methodInfo.getMethodDescriptor();
pNames = Signature.getParameterTypes(new String(signature));
}
char[][] paramNames= new char[pNames.length][];
for (int j= 0; j < pNames.length; j++) {
paramNames[j]= pNames[j].toCharArray();
}
char[][] parameterTypes = ClassFile.translatedNames(paramNames);
JavaModelManager manager = JavaModelManager.getJavaModelManager();
selector = manager.intern(selector);
for (int j= 0; j < pNames.length; j++) {
pNames[j]= manager.intern(new String(parameterTypes[j]));
}
BinaryMethod method = new BinaryMethod((JavaElement)type, selector, pNames);
childrenHandles.add(method);
// ensure that 2 binary methods with the same signature but with different return types have different occurrence counts.
// (case of bridge methods in 1.5)
while (newElements.containsKey(method))
method.occurrenceCount++;
newElements.put(method, methodInfo);
int max = pNames.length;
char[][] argumentNames = methodInfo.getArgumentNames();
if (argumentNames == null || argumentNames.length < max) {
argumentNames = new char[max][];
for (int j = 0; j < max; j++) {
argumentNames[j] = ("arg" + j).toCharArray(); //$NON-NLS-1$
}
}
int startIndex = 0;
try {
if (isConstructor) {
if (isEnum) {
startIndex = 2;
} else if (type.isMember()
&& !Flags.isStatic(type.getFlags())) {
startIndex = 1;
}
}
} catch(JavaModelException e) {
// ignore
}
for (int j = startIndex; j < max; j++) {
IBinaryAnnotation[] parameterAnnotations = methodInfo.getParameterAnnotations(j - startIndex);
if (parameterAnnotations != null) {
LocalVariable localVariable = new LocalVariable(
method,
new String(argumentNames[j]),
0,
-1,
0,
-1,
method.parameterTypes[j],
null,
-1,
true);
generateAnnotationsInfos(localVariable, argumentNames[j], parameterAnnotations, methodInfo.getTagBits(), newElements);
}
}
generateTypeParameterInfos(method, signature, newElements, typeParameterHandles);
generateAnnotationsInfos(method, methodInfo.getAnnotations(), methodInfo.getTagBits(), newElements);
Object defaultValue = methodInfo.getDefaultValue();
if (defaultValue instanceof IBinaryAnnotation) {
generateAnnotationInfo(method, newElements, (IBinaryAnnotation) defaultValue, new String(methodInfo.getSelector()));
}
}
}