void (XmlAttribute attribute) { XmlTag tag = attribute.getParent(); if (tag == null) return; final String name = attribute.getName(); PsiElement prevLeaf = PsiTreeUtil.prevLeaf(attribute); if (!(prevLeaf instanceof PsiWhiteSpace) && (!(tag instanceof HtmlTag) || !XmlUtil.hasNonEditableInjectionFragmentAt(attribute, attribute.getTextOffset()))) { TextRange textRange = attribute.getTextRange(); HighlightInfoType type = tag instanceof HtmlTag ? HighlightInfoType.WARNING : HighlightInfoType.ERROR; String description = XmlAnalysisBundle.message("xml.inspections.attribute.should.be.preceded.with.space"); HighlightInfo info = HighlightInfo.newHighlightInfo(type).range(textRange.getStartOffset(), textRange.getStartOffset()).descriptionAndTooltip(description).create(); myHolder.add(info); } if (attribute.isNamespaceDeclaration() || XmlUtil.XML_SCHEMA_INSTANCE_URI.equals(attribute.getNamespace())) { //checkReferences(attribute.getValueElement()); return; } XmlElementDescriptor elementDescriptor = tag.getDescriptor(); if (elementDescriptor == null || elementDescriptor instanceof AnyXmlElementDescriptor || ourDoJaxpTesting) { return; } XmlAttributeDescriptor attributeDescriptor = attribute.getDescriptor(); if (attributeDescriptor == null) { if (!XmlUtil.attributeFromTemplateFramework(name, tag)) { final String localizedMessage = XmlAnalysisBundle.message("xml.inspections.attribute.is.not.allowed.here", name); reportAttributeProblem(tag, name, attribute, localizedMessage); } } else { checkDuplicateAttribute(tag, attribute); // we skip resolve of attribute references since there is separate check when taking attribute descriptors PsiReference[] attrRefs = attribute.getReferences(); doCheckRefs(attribute, attrRefs, !attribute.getNamespacePrefix().isEmpty() ? 2 : 1); } }