code: public void complete(List<JCCompilationUnit> trees, ClassSymbol c) {
          annotate.enterStart();
          ListBuffer<ClassSymbol> prevUncompleted = uncompleted;
          if (memberEnter.completionEnabled) uncompleted = new ListBuffer<ClassSymbol>();
  
          try {
              // enter all classes, and construct uncompleted list
              classEnter(trees, null);
  
              // complete all uncompleted classes in memberEnter
              if  (memberEnter.completionEnabled) {
                  while (uncompleted.nonEmpty()) {
                      ClassSymbol clazz = uncompleted.next();
                      if (c == null || c == clazz || prevUncompleted == null)
                          clazz.complete();
                      else
                          // defer
                          prevUncompleted.append(clazz);
                  }
  
                  // if there remain any unimported toplevels (these must have
                  // no classes at all), process their import statements as well.
                  for (JCCompilationUnit tree : trees) {
                      if (tree.starImportScope.elems == null) {
                          JavaFileObject prev = log.useSource(tree.sourcefile);
                          Env<AttrContext> topEnv = topLevelEnv(tree);
                          memberEnter.memberEnter(tree, topEnv);
                          log.useSource(prev);
                      }
                  }
              }
          } finally {
              uncompleted = prevUncompleted;
              annotate.enterDone();
          }
      }
docs: Main method: enter one class from a list of toplevel trees and
  place the rest on uncompleted for later processing.
  @param trees      The list of trees to be processed.
  @param c          The class symbol to be processed.