"Badly formatted native reference '" + ident + "'");
return null;
}
String className = parsed.className();
JReferenceType type = null;
if (!className.equals("null")) {
type = program.getFromTypeMap(className);
if (type == null) {
reportJsniError(info, methodDecl,
"Unresolvable native reference to type '" + className + "'");
return null;
}
}
if (!parsed.isMethod()) {
// look for a field
String fieldName = parsed.memberName();
if (type == null) {
if (fieldName.equals("nullField")) {
return program.getNullField();
}
} else {
for (int i = 0; i < type.fields.size(); ++i) {
JField field = type.fields.get(i);
if (field.getName().equals(fieldName)) {
return field;
}
}
}
reportJsniError(info, methodDecl,
"Unresolvable native reference to field '" + fieldName
+ "' in type '" + className + "'");
return null;
} else {
// look for a method
TreeSet<String> almostMatches = new TreeSet<String>();
String methodName = parsed.memberName();
String jsniSig = parsed.memberSignature();
if (type == null) {
if (jsniSig.equals("nullMethod()")) {
return program.getNullMethod();
}
} else {
Queue<JReferenceType> workList = new LinkedList<JReferenceType>();
workList.add(type);
while (!workList.isEmpty()) {
JReferenceType cur = workList.poll();
for (int i = 0; i < cur.methods.size(); ++i) {
JMethod method = cur.methods.get(i);
if (method.getName().equals(methodName)) {
String sig = JProgram.getJsniSig(method);
if (sig.equals(jsniSig)) {