final ImmutableSet<Property> propertySet(
      ImmutableMap<ExecutableElement, AnnotatedTypeMirror> propertyMethodsAndTypes,
      ImmutableListMultimap<ExecutableElement, AnnotationMirror> annotatedPropertyFields,
      ImmutableListMultimap<ExecutableElement, AnnotationMirror> annotatedPropertyMethods,
      Nullables nullables) {
    ImmutableBiMap<ExecutableElement, String> methodToPropertyName =
        propertyNameToMethodMap(propertyMethodsAndTypes.keySet()).inverse();
    Map<ExecutableElement, String> methodToIdentifier = new LinkedHashMap<>(methodToPropertyName);
    fixReservedIdentifiers(methodToIdentifier);

    ImmutableSet.Builder<Property> props = ImmutableSet.builder();
    propertyMethodsAndTypes.forEach(
        (propertyMethod, returnType) -> {
          String propertyTypeString =
              TypeEncoder.encodeWithAnnotations(
                  returnType, ImmutableList.of(), getExcludedAnnotationTypes(propertyMethod));
          String propertyName = methodToPropertyName.get(propertyMethod);
          String identifier = methodToIdentifier.get(propertyMethod);
          ImmutableList<String> fieldAnnotations =
              annotationStrings(annotatedPropertyFields.get(propertyMethod));
          ImmutableList<AnnotationMirror> methodAnnotationMirrors =
              annotatedPropertyMethods.get(propertyMethod);
          ImmutableList<String> methodAnnotations = annotationStrings(methodAnnotationMirrors);
          Optional<String> nullableAnnotation = nullableAnnotationForMethod(propertyMethod);
          Property p =
              new GetterProperty(
                  propertyName,
                  identifier,
                  propertyMethod,
                  returnType,
                  propertyTypeString,
                  fieldAnnotations,
                  methodAnnotations,
                  nullableAnnotation,
                  nullables);
          props.add(p);
          if (p.isNullable() && returnType.getKind().isPrimitive()) {
            errorReporter()
                .reportError(
                    propertyMethod,
                    "[%sNullPrimitive] Primitive types cannot be @Nullable",
                    simpleAnnotationName);
          }
        });
    return props.build();
  }
Returns the ordered set of {@link Property} definitions for the given {@code @AutoValue} or
{@code AutoOneOf} type.

@param annotatedPropertyMethods a map from property methods to the method annotations that
    should go on the implementation of those methods. These annotations are method annotations
    specifically. Type annotations do not appear because they are considered part of the return
    type and will appear when that is spelled out. Annotations that are excluded by {@code
    AutoValue.CopyAnnotations} also do not appear here.
value/src/main/java/com/google/auto/value/processor/AutoValueishProcessor.java