void (final String namespace, final XmlTag element, final List<? super XmlElementDescriptor> variants, final XmlElementDescriptor elementDescriptor, final String elementNamespace, final Map<String, XmlElementDescriptor> descriptorsMap, final Set<? super XmlNSDescriptor> visited, XmlTag parent, final XmlExtension extension) { if(descriptorsMap.containsKey(namespace)){ final XmlElementDescriptor descriptor = descriptorsMap.get(namespace); if(isAcceptableNs(element, elementDescriptor, elementNamespace, namespace)){ for(XmlElementDescriptor containedDescriptor: descriptor.getElementsDescriptors(parent)) { if (containedDescriptor != null) variants.add(containedDescriptor); } } if (element instanceof HtmlTag) { HtmlUtil.addHtmlSpecificCompletions(descriptor, element, variants); } visited.add(descriptor.getNSDescriptor()); } else{ // Don't use default namespace in case there are other namespaces in scope // If there are tags from default namespace they will be handled via // their element descriptors (prev if section) if (namespace == null) return; if(namespace.isEmpty() && !visited.isEmpty()) return; XmlNSDescriptor nsDescriptor = getDescriptor(element, namespace, true, extension); if (nsDescriptor == null) { if(!descriptorsMap.isEmpty()) return; nsDescriptor = getDescriptor(element, namespace, false, extension); } if(nsDescriptor != null && !visited.contains(nsDescriptor) && isAcceptableNs(element, elementDescriptor, elementNamespace, namespace) ){ visited.add(nsDescriptor); final XmlElementDescriptor[] rootElementsDescriptors = nsDescriptor.getRootElementsDescriptors(PsiTreeUtil.getParentOfType(element, XmlDocument.class)); final XmlTag parentTag = extension.getParentTagForNamespace(element, nsDescriptor); final XmlElementDescriptor parentDescriptor; if (parentTag == element.getParentTag()) { parentDescriptor = elementDescriptor; } else { assert parentTag != null; parentDescriptor = parentTag.getDescriptor(); } for(XmlElementDescriptor candidateDescriptor: rootElementsDescriptors) { if (candidateDescriptor != null && couldContainDescriptor(parentTag, parentDescriptor, candidateDescriptor, namespace, false)) { variants.add(candidateDescriptor); } } } } }