void (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(Reference.class.getName(), 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()); } } } }