void (final XmlElement xmlElement, final @NonNls DomElementAnnotationHolder holder, DomElement domElement) { if (xmlElement == null) { return; } Set<PsiReference> processed = null; Collection<PropertiesFile> propertyFiles = null; // to be initialized lazily for (final PsiReference ref : xmlElement.getReferences()) { if (!(ref instanceof AntDomReference antDomRef)) { continue; } if (antDomRef.shouldBeSkippedByAnnotator()) { continue; } if (processed != null && processed.contains(ref)) { continue; } if (!isResolvable(ref)) { final List<LocalQuickFix> quickFixList = new SmartList<>(); quickFixList.add(new AntChangeContextLocalFix()); if (ref instanceof AntDomPropertyReference) { final String canonicalText = ref.getCanonicalText(); quickFixList.add(new AntCreatePropertyFix(canonicalText, null)); final PsiFile containingFile = xmlElement.getContainingFile(); if (containingFile != null) { if (propertyFiles == null) { propertyFiles = getPropertyFiles(AntSupport.getAntDomProject(containingFile), xmlElement); } for (PropertiesFile propertyFile : propertyFiles) { quickFixList.add(new AntCreatePropertyFix(canonicalText, propertyFile)); } } } else if (ref instanceof AntDomTargetReference) { quickFixList.add(new AntCreateTargetFix(ref.getCanonicalText())); } holder.createProblem( domElement, ProblemHighlightType.LIKE_UNKNOWN_SYMBOL, antDomRef.getUnresolvedMessagePattern(), ref.getRangeInElement(), quickFixList.toArray(LocalQuickFix.EMPTY_ARRAY) ); if (ref instanceof AntDomFileReference) { if (processed == null) { processed = new HashSet<>(); } ContainerUtil.addAll(processed, ((AntDomFileReference)ref).getFileReferenceSet().getAllReferences()); } } } }