code: @Override
    protected void printInnerDeclarations() {
      // Everything is public in interfaces.
      if (isInterfaceType() || typeNode.hasPrivateDeclaration()) {
        super.printInnerDeclarations();
        return;
      }
  
      ListMultimap<DeclarationCategory, BodyDeclaration> categorizedDecls =
          MultimapBuilder.hashKeys().arrayListValues().build();
      for (BodyDeclaration innerDecl : getInnerDeclarations()) {
        categorizedDecls.put(DeclarationCategory.categorize(innerDecl), innerDecl);
      }
      // Emit the categorized declarations using the declaration order of the category values.
      for (DeclarationCategory category : DeclarationCategory.values()) {
        List<BodyDeclaration> declarations = categorizedDecls.get(category);
        if (declarations.isEmpty()) {
          continue;
        }
        // Extract MethodDeclaration nodes so that they can be sorted.
        List<MethodDeclaration> methods = Lists.newArrayList();
        for (Iterator<BodyDeclaration> iter = declarations.iterator(); iter.hasNext(); ) {
          BodyDeclaration decl = iter.next();
          if (decl instanceof MethodDeclaration) {
            methods.add((MethodDeclaration) decl);
            iter.remove();
          }
        }
        Collections.sort(methods, METHOD_DECL_ORDER);
        newline();
        println(category.header);
        printDeclarations(methods);
        printDeclarations(declarations);
      }
    }
docs: Print method declarations with #pragma mark lines documenting their scope.