Beispiel #1
0
  @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;
  }
Beispiel #2
0
  @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;
  }