@Override public IField getField(Atom name) { if (fieldMap.containsKey(name)) { return fieldMap.get(name); } else { List<IField> fields = findDeclaredField(name); if (!fields.isEmpty()) { if (fields.size() == 1) { IField f = fields.iterator().next(); fieldMap.put(name, f); return f; } else { throw new IllegalStateException("multiple fields with name " + name); } } else if ((superClass = getSuperclass()) != null) { IField f = superClass.getField(name); if (f != null) { fieldMap.put(name, f); return f; } } // try superinterfaces for (IClass i : getAllImplementedInterfaces()) { IField f = i.getField(name); if (f != null) { fieldMap.put(name, f); return f; } } } return null; }
@Override public IField getField(Atom name, TypeName type) { boolean unresolved = false; try { // typically, there will be at most one field with the name IField field = getField(name); if (field != null && field.getFieldTypeReference().getName().equals(type)) { return field; } else { unresolved = true; } } catch (IllegalStateException e) { assert e.getMessage().startsWith("multiple fields with"); unresolved = true; } if (unresolved) { // multiple fields. look through all of them and see if any have the appropriate type List<IField> fields = findDeclaredField(name); for (IField f : fields) { if (f.getFieldTypeReference().getName().equals(type)) { return f; } } // check superclass if (getSuperclass() != null) { IField f = superClass.getField(name, type); if (f != null) { return f; } } // try superinterfaces for (IClass i : getAllImplementedInterfaces()) { IField f = i.getField(name, type); if (f != null) { return f; } } } return null; }