@Value.Lazy
    public boolean isJSpecifyNullMarked() {
      if (JSpecifyNullMarkedMirror.isPresent(element())) {
        return true;
      }

      @Nullable Element module = getModule();
      if (module != null && JSpecifyNullMarkedMirror.isPresent(module)) {
        return true;
      }
      // let's also check parent packages
      String parentPackageName = SourceNames.parentPackageName(element());
      while (!parentPackageName.isEmpty()) {
        @Nullable PackageElement parentPackage = environment().processing()
            .getElementUtils()
            .getPackageElement(parentPackageName);
        if (parentPackage != null && JSpecifyNullMarkedMirror.isPresent(parentPackage)) {
          return true;
        }
        parentPackageName = SourceNames.parentPackageName(parentPackageName);
      }
      return false;
    }
Name is the only equivalence attribute. Basically packages are interned by name.
@return package name
value-processor/src/org/immutables/value/processor/meta/Proto.java