Search in sources :

Example 1 with XmlTagImpl

use of com.intellij.psi.impl.source.xml.XmlTagImpl in project intellij-community by JetBrains.

the class SchemaDefinitionsSearch method execute.

@Override
public boolean execute(@NotNull final PsiElement queryParameters, @NotNull final Processor<PsiElement> consumer) {
    if (queryParameters instanceof XmlTagImpl) {
        final XmlTagImpl xml = (XmlTagImpl) queryParameters;
        if (ReadAction.compute(() -> isTypeElement(xml))) {
            final Collection<SchemaTypeInfo> infos = ApplicationManager.getApplication().runReadAction(new Computable<Collection<SchemaTypeInfo>>() {

                @Override
                public Collection<SchemaTypeInfo> compute() {
                    return gatherInheritors(xml);
                }
            });
            if (infos != null && !infos.isEmpty()) {
                final XmlFile file = XmlUtil.getContainingFile(xml);
                final Project project = file.getProject();
                final Module module = ModuleUtilCore.findModuleForPsiElement(queryParameters);
                //if (module == null) return false;
                final VirtualFile vf = file.getVirtualFile();
                String thisNs = ApplicationManager.getApplication().runReadAction(new Computable<String>() {

                    @Override
                    public String compute() {
                        return XmlNamespaceIndex.getNamespace(vf, project, file);
                    }
                });
                thisNs = thisNs == null ? getDefaultNs(file) : thisNs;
                // so thisNs can be null
                if (thisNs == null)
                    return false;
                final ArrayList<SchemaTypeInfo> infosLst = new ArrayList<>(infos);
                Collections.sort(infosLst);
                final Map<String, Set<XmlFile>> nsMap = new HashMap<>();
                for (final SchemaTypeInfo info : infosLst) {
                    Set<XmlFile> targetFiles = nsMap.get(info.getNamespaceUri());
                    if (targetFiles == null) {
                        targetFiles = new HashSet<>();
                        if (Comparing.equal(info.getNamespaceUri(), thisNs)) {
                            targetFiles.add(file);
                        }
                        final Collection<XmlFile> files = ApplicationManager.getApplication().runReadAction(new Computable<Collection<XmlFile>>() {

                            @Override
                            public Collection<XmlFile> compute() {
                                return XmlUtil.findNSFilesByURI(info.getNamespaceUri(), project, module);
                            }
                        });
                        if (files != null) {
                            targetFiles.addAll(files);
                        }
                        nsMap.put(info.getNamespaceUri(), targetFiles);
                    }
                    if (!targetFiles.isEmpty()) {
                        for (final XmlFile targetFile : targetFiles) {
                            ApplicationManager.getApplication().runReadAction(() -> {
                                final String prefixByURI = XmlUtil.findNamespacePrefixByURI(targetFile, info.getNamespaceUri());
                                if (prefixByURI == null)
                                    return;
                                final PsiElementProcessor processor = new PsiElementProcessor() {

                                    @Override
                                    public boolean execute(@NotNull PsiElement element) {
                                        if (element instanceof XmlTagImpl) {
                                            if (isCertainTypeElement((XmlTagImpl) element, info.getTagName(), prefixByURI) || isElementWithEmbeddedType((XmlTagImpl) element, info.getTagName(), prefixByURI)) {
                                                consumer.process(element);
                                                return false;
                                            }
                                        }
                                        return true;
                                    }
                                };
                                XmlUtil.processXmlElements(targetFile, processor, true);
                            });
                        }
                    }
                }
            }
        }
    }
    return true;
}
Also used : VirtualFile(com.intellij.openapi.vfs.VirtualFile) XmlTagImpl(com.intellij.psi.impl.source.xml.XmlTagImpl) HashSet(com.intellij.util.containers.hash.HashSet) XmlFile(com.intellij.psi.xml.XmlFile) HashMap(com.intellij.util.containers.hash.HashMap) NotNull(org.jetbrains.annotations.NotNull) PsiElementProcessor(com.intellij.psi.search.PsiElementProcessor) Project(com.intellij.openapi.project.Project) SchemaTypeInfo(com.intellij.xml.index.SchemaTypeInfo) Module(com.intellij.openapi.module.Module) PsiElement(com.intellij.psi.PsiElement)

Aggregations

Module (com.intellij.openapi.module.Module)1 Project (com.intellij.openapi.project.Project)1 VirtualFile (com.intellij.openapi.vfs.VirtualFile)1 PsiElement (com.intellij.psi.PsiElement)1 XmlTagImpl (com.intellij.psi.impl.source.xml.XmlTagImpl)1 PsiElementProcessor (com.intellij.psi.search.PsiElementProcessor)1 XmlFile (com.intellij.psi.xml.XmlFile)1 HashMap (com.intellij.util.containers.hash.HashMap)1 HashSet (com.intellij.util.containers.hash.HashSet)1 SchemaTypeInfo (com.intellij.xml.index.SchemaTypeInfo)1 NotNull (org.jetbrains.annotations.NotNull)1