@Override
  public void visitStruct(Struct struct) {
    super.visitStruct(struct);

    Identifier name = struct.getTag();
    if (name != null) {
      switch (struct.getType()) {
        case CPPClass:
          if (!config.runtime.equals(JNAeratorConfig.Runtime.BridJ) && !config.genCPlusPlus) break;
        case CStruct:
        case CUnion:
          boolean isFwd = struct.isForwardDeclaration();
          if (!isFwd
              && struct.getDeclarations().isEmpty()
              && config.treatEmptyStructsAsForwardDecls) {
            List<SimpleTypeRef> parents = struct.getParents();
            Struct p;
            if (parents.isEmpty()
                || parents.size() == 1
                    && ((p = structsByName.get(parents.get(0))) == null
                        || p.isForwardDeclaration())) isFwd = true;
          }

          if (isFwd) break;

          if (config.skipIncludedFrameworks) {
            String lib = getLibrary(struct);
            if (lib != null) {
              if (!config.frameworks.contains(lib)) break;
            }
          }
          Struct oldStruct = structsByName.get(name);

          if (oldStruct == null
              || oldStruct.isForwardDeclaration()
              || (!(oldStruct.getParentElement() instanceof TypeDef)
                  && struct.getParentElement() instanceof TypeDef)) {
            structsByName.put(name, struct);

            getList(structsByLibrary, getLibrary(struct)).add(struct);
            Identifier identifier = getTaggedTypeIdentifierInJava(struct);
            if (identifier != null) {
              if (struct.getType() == Type.CUnion) unionsFullNames.add(identifier);
              structsFullNames.add(identifier);
            }
          }

          break;
        case ObjCClass:
        case ObjCProtocol:
          //				if (name.equals("NSObject"))
          //					name = name.clone();

          if (struct.isForwardDeclaration()) break;

          if (struct.getCategoryName() != null) {
            getMap(objCCategoriesByTargetType, struct.getTag())
                .put(struct.getCategoryName(), struct);
            objCCategoriesByName.put(struct.getCategoryName(), struct);
          } else getMap(classes, struct.getType()).put(struct.getTag(), struct);

          break;
        default:
          struct = null;
      }
    }
  }