docs: public boolean visit(TypeDeclaration node)
      {
          Object clzInterfaces = node.getStructuralProperty(TypeDeclaration.SUPER_INTERFACE_TYPES_PROPERTY);
          Object clzSuperClasses = node.getStructuralProperty(TypeDeclaration.SUPERCLASS_TYPE_PROPERTY);
  
          if (clzInterfaces != null)
          {
              if (List.class.isAssignableFrom(clzInterfaces.getClass()))
              {
                  TypeReferenceLocation typeReferenceLocation = node.isInterface() ? TypeReferenceLocation.INHERITANCE
                              : TypeReferenceLocation.IMPLEMENTS_TYPE;
  
                  List<?> clzInterfacesList = (List<?>) clzInterfaces;
                  for (Object clzInterface : clzInterfacesList)
                  {
                      ParameterizedType parameterizedType = null;
                      if (clzInterface instanceof ParameterizedType)
                      {
                          parameterizedType = (ParameterizedType) clzInterface;
                          clzInterface = parameterizedType.getType();
                      }
  
                      if (clzInterface instanceof SimpleType)
                      {
                          SimpleType simpleType = (SimpleType) clzInterface;
                          ITypeBinding resolvedSuperInterface = simpleType.resolveBinding();
                          if (resolvedSuperInterface == null)
                          {
                              ResolveClassnameResult result = resolveClassname(simpleType.getName().toString());
                              ResolutionStatus status = result.found ? ResolutionStatus.RECOVERED : ResolutionStatus.UNRESOLVED;
                              PackageAndClassName packageAndClassName = PackageAndClassName.parseFromQualifiedName(result.result);
                              processTypeAsString(result.result, packageAndClassName.packageName, packageAndClassName.className, status,
                                          typeReferenceLocation,
                                          compilationUnit.getLineNumber(node.getStartPosition()),
                                          compilationUnit.getColumnNumber(node.getStartPosition()),
                                          node.getLength(), extractDefinitionLine(node.toString()));
                          }
                          else
                          {
                              /*
                               * Register all the implemented interfaces (even super interfaces, if we are able to resolve them.)
                               */
                              Stack<ITypeBinding> stack = new Stack<>();
                              stack.push(resolvedSuperInterface);
                              while (!stack.isEmpty())
                              {
                                  resolvedSuperInterface = stack.pop();
                                  processTypeBinding(resolvedSuperInterface, ResolutionStatus.RESOLVED, typeReferenceLocation,
                                              compilationUnit.getLineNumber(node.getStartPosition()),
                                              compilationUnit.getColumnNumber(node.getStartPosition()), node.getLength(),
                                              extractDefinitionLine(node.toString()));
                                  if (resolvedSuperInterface != null)
                                  {
                                      ITypeBinding[] interfaces = resolvedSuperInterface.getInterfaces();
                                      for (ITypeBinding oneInterface : interfaces)
                                      {
                                          stack.push(oneInterface);
                                      }
                                  }
                              }
                          }
                      }
                  }
              }
          }
          if (clzSuperClasses != null)
          {
              if (clzSuperClasses instanceof SimpleType)
              {
                  ITypeBinding resolvedSuperClass = ((SimpleType) clzSuperClasses).resolveBinding();
  
                  if (resolvedSuperClass == null)
                  {
                      ResolveClassnameResult result = resolveClassname(((SimpleType) clzSuperClasses).getName().toString());
                      ResolutionStatus status = result.found ? ResolutionStatus.RECOVERED : ResolutionStatus.UNRESOLVED;
                      PackageAndClassName packageAndClassName = PackageAndClassName.parseFromQualifiedName(result.result);
                      processTypeAsString(result.result, packageAndClassName.packageName, packageAndClassName.className, status,
                                  TypeReferenceLocation.INHERITANCE,
                                  compilationUnit.getLineNumber(node.getStartPosition()),
                                  compilationUnit.getColumnNumber(node.getStartPosition()),
                                  node.getLength(), extractDefinitionLine(node.toString()));
                  }
  
                  // register all the superClasses up to Object
                  while (resolvedSuperClass != null && !resolvedSuperClass.getQualifiedName().equals("java.lang.Object"))
                  {
                      processTypeBinding(resolvedSuperClass, ResolutionStatus.RESOLVED, TypeReferenceLocation.INHERITANCE,
                                  compilationUnit.getLineNumber(node.getStartPosition()),
                                  compilationUnit.getColumnNumber(node.getStartPosition()), node.getLength(), extractDefinitionLine(node.toString()));
  
                      for (ITypeBinding iface : resolvedSuperClass.getInterfaces())
                      {
                          processTypeBinding(iface, ResolutionStatus.RESOLVED, TypeReferenceLocation.IMPLEMENTS_TYPE,
                                      compilationUnit.getLineNumber(node.getStartPosition()),
                                      compilationUnit.getColumnNumber(node.getStartPosition()), node.getLength(),
                                      extractDefinitionLine(node.toString()));
                      }
                      resolvedSuperClass = resolvedSuperClass.getSuperclass();
                  }
              }
          }
  
          return super.visit(node);
      }