@Nonnull
  public FieldWithInitializationInfo getFieldWithInitializationInfo(
      @Nonnull FieldDeclaration fieldDeclaration) {
    MethodDeclaration getterDeclaration =
        TypeUtils.findGetterForField(classDeclaration, fieldDeclaration);

    // At first look for fields that are initialized within the constructor
    try {
      ConstructorCallInfo constructorCallInfo = findConstructorCallInfoForField(fieldDeclaration);
      return new FieldInitializedInConstructorInfo(
          fieldDeclaration, getterDeclaration, constructorCallInfo);
    } catch (IllegalArgumentException ignore) {
    }

    // Now look for fields that have a setter
    try {
      MethodDeclaration setter = TypeUtils.findSetter(classDeclaration, fieldDeclaration);
      return new FieldInitializedInSetterInfo(fieldDeclaration, getterDeclaration, setter);
    } catch (IllegalArgumentException ignore) {
    }

    // Ok, return a read only field descriptor
    return new FieldNotInitializationInfo(fieldDeclaration, getterDeclaration);
  }