private static void defineAttributes(XmlTag xmlTag,
                                       DomExtensionsRegistrar registrar,
                                       DomGenericInfo genericInfo,
                                       AbstractIntrospector parentIntrospector) {
    final Map<String, Pair<Type, Class<?>>> registeredAttribs = getStaticallyRegisteredAttributes(genericInfo);
    // define attributes discovered by introspector and not yet defined statically
    final Iterator<String> introspectedAttributes = parentIntrospector.getAttributesIterator();
    while (introspectedAttributes.hasNext()) {
      final String attribName = introspectedAttributes.next();
      if (genericInfo.getAttributeChildDescription(attribName) == null) { // if not defined yet
        final String _attribName = StringUtil.toLowerCase(attribName);
        final Pair<Type, Class<?>> types = registeredAttribs.get(_attribName);
        Type type = Pair.getFirst(types);
        Class<?> converterClass = Pair.getSecond(types);
        if (type == null) {
          type = String.class; // use String by default
          final Class attributeType = parentIntrospector.getAttributeType(attribName);
          if (attributeType != null) {
            // handle well-known types
            if (File.class.isAssignableFrom(attributeType)) {
              type = PsiFileSystemItem.class;
              converterClass = AntPathConverter.class;
            }
            else if (Boolean.class.isAssignableFrom(attributeType)) {
              type = Boolean.class;
              converterClass = AntBooleanConverter.class;
            }
            else if (isAssignableFrom("org.apache.tools.ant.types.Reference", attributeType)) {
              converterClass = AntDomRefIdConverter.class;
            }
          }
        }

        registerAttribute(registrar, attribName, type, converterClass);
        if (types == null) { // augment the map if this was a newly added attribute
          registeredAttribs.put(_attribName, new Pair<>(type, converterClass));
        }
      }
    }
    // handle attribute case problems:
    // additionaly register all attributes that exist in XML but differ from the registered ones only in case
    for (XmlAttribute xmlAttribute : xmlTag.getAttributes()) {
      final String existingAttribName = xmlAttribute.getName();
      if (genericInfo.getAttributeChildDescription(existingAttribName) == null) {
        final Pair<Type, Class<?>> pair = registeredAttribs.get(StringUtil.toLowerCase(existingAttribName));
        if (pair != null) { // if such attribute should actually be here
          registerAttribute(registrar, existingAttribName, pair.getFirst(), pair.getSecond());
        }
      }
    }
  }
private static void defineAttributes(XmlTag xmlTag,
                                       DomExtensionsRegistrar registrar,
                                       DomGenericInfo genericInfo,
                                       AbstractIntrospector parentIntrospector)