docs: @Override public boolean process(Set<? extends TypeElement> types, RoundEnvironment env) {
      if (!env.processingOver()) {
        // Storing module names for later retrieval as the element instance is invalidated across
        // passes.
        for (Element e : env.getElementsAnnotatedWith(Module.class)) {
          if (!(e instanceof TypeElement)) {
            error("@Module applies to a type, " + e.getSimpleName() + " is a " + e.getKind(), e);
            continue;
          }
          delayedModuleNames.add(((TypeElement) e).getQualifiedName().toString());
        }
        return false;
      }
  
      Set<Element> modules = new LinkedHashSet<Element>();
      for (String moduleName : delayedModuleNames) {
        modules.add(elements().getTypeElement(moduleName));
      }
  
      for (Element element : modules) {
        Map<String, Object> annotation = null;
        try {
          annotation = getAnnotation(Module.class, element);
        } catch (CodeGenerationIncompleteException e) {
          continue; // skip this element. An up-stream compiler error is in play.
        }
  
        TypeElement moduleType = (TypeElement) element;
        if (annotation == null) {
          error("Missing @Module annotation.", moduleType);
          continue;
        }
        if (annotation.get("complete").equals(Boolean.TRUE)) {
          Map<String, Binding<?>> bindings;
          try {
            bindings = processCompleteModule(moduleType, false);
            new ProblemDetector().detectCircularDependencies(bindings.values());
          } catch (ModuleValidationException e) {
            error("Graph validation failed: " + e.getMessage(), e.source);
            continue;
          } catch (InvalidBindingException e) {
            error("Graph validation failed: " + e.getMessage(), elements().getTypeElement(e.type));
            continue;
          } catch (RuntimeException e) {
            if (ERROR_NAMES_TO_PROPAGATE.contains(e.getClass().getName())) {
              throw e;
            }
            error("Unknown error " + e.getClass().getName() + " thrown by javac in graph validation: "
                + e.getMessage(), moduleType);
            continue;
          }
          try {
            writeDotFile(moduleType, bindings);
          } catch (IOException e) {
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));
            processingEnv.getMessager()
                .printMessage(Diagnostic.Kind.WARNING,
                    "Graph visualization failed. Please report this as a bug.\n\n" + sw, moduleType);
          }
        }
  
        if (annotation.get("library").equals(Boolean.FALSE)) {
          Map<String, Binding<?>> bindings = processCompleteModule(moduleType, true);
          try {
            new ProblemDetector().detectUnusedBinding(bindings.values());
          } catch (IllegalStateException e) {
            error("Graph validation failed: " + e.getMessage(), moduleType);
          }
        }
      }
      return false;
    }