docs: public static void process(@NonNull Document textDocument, AnnotatableType... annotationTypes) {
        if (annotationTypes == null || annotationTypes.length == 0) {
           return;
        }
  
        for (AnnotatableType annotationType : annotationTypes) {
           if (annotationType == null) {
              continue;
           }
  
           if (textDocument.getAnnotationSet().isCompleted(annotationType)) {
              continue;
           }
  
           if (log.isLoggable(Level.FINEST)) {
              log.finest("Annotating for {0}", annotationType);
           }
  
           Annotator annotator = AnnotatorCache.getInstance().get(annotationType, textDocument.getLanguage());
  
           if (annotator == null) {
              throw new IllegalStateException("Could not get annotator for " + annotationType);
           }
  
           if (!annotator.satisfies().contains(annotationType)) {
              throw new IllegalStateException(annotator.getClass().getName() + " does not satisfy " + annotationType);
           }
  
           //Get the requirements out of the way
           for (AnnotatableType prereq : annotator.requires()) {
              process(textDocument, prereq);
           }
  
           annotator.annotate(textDocument);
           for (AnnotatableType type : annotator.satisfies()) {
              textDocument
                 .getAnnotationSet()
                 .setIsCompleted(type, true, annotator.getClass().getName() + "::" + annotator.getVersion());
           }
  
        }
     }