private boolean processElement(PsiElement child, boolean deepFlag, boolean wideFlag, boolean processIncludes) { if (deepFlag) { if (!processXmlElements(child, true, wideFlag, processIncludes)) { return false; } } else { if (child instanceof XmlEntityRef) { if (!processXmlElements(child, false, wideFlag, processIncludes)) return false; } else if (child instanceof XmlConditionalSection) { if (!processXmlElements(child, false, wideFlag, processIncludes)) return false; } else if (processIncludes && XmlIncludeHandler.isXInclude(child)) { if (!processXmlElements(child, false, wideFlag, processIncludes)) return false; } else if (!processor.execute(child)) return false; } if (targetFile != null && child instanceof XmlEntityDecl) { XmlEntityDecl xmlEntityDecl = (XmlEntityDecl)child; XmlEntityCache.cacheParticularEntity(targetFile, xmlEntityDecl); } return true; }
private static PsiElement parseEntityDecl(final XmlEntityDecl entityDecl, final PsiFile targetFile, final XmlEntityDecl.EntityContextType type, final XmlEntityRef entityRef) { CachedValue<PsiElement> value; synchronized (PsiLock.LOCK) { // we depend on targetFile and entityRef value = entityRef.getUserData(PARSED_DECL_KEY); // return entityDecl.parse(targetFile, type); if (value == null) { value = CachedValuesManager.getManager(entityDecl.getProject()).createCachedValue(new CachedValueProvider<PsiElement>() { @Override public Result<PsiElement> compute() { final PsiElement res = entityDecl.parse(targetFile, type, entityRef); if (res == null) return new Result<PsiElement>(res, targetFile); if (!entityDecl.isInternalReference()) XmlEntityCache.copyEntityCaches(res.getContainingFile(), targetFile); return new Result<PsiElement>(res, res.getUserData(XmlElement.DEPENDING_ELEMENT), entityDecl, targetFile, entityRef); } }, false); entityRef.putUserData(PARSED_DECL_KEY, value); } } return value.getValue(); }
private static PsiElement parseEntityDecl(final XmlEntityDecl entityDecl, final PsiFile targetFile, final XmlEntityDecl.EntityContextType type, final XmlEntityRef entityRef) { synchronized (PsiLock.LOCK) { // we depend on targetFile and entityRef CachedValue<PsiElement> value = entityRef.getUserData(PARSED_DECL_KEY); // return entityDecl.parse(targetFile, type); if (value == null) { value = CachedValuesManager.getManager(entityDecl.getProject()).createCachedValue(new CachedValueProvider<PsiElement>() { public Result<PsiElement> compute() { final PsiElement res = entityDecl.parse(targetFile, type, entityRef); if (res == null) return new Result<PsiElement>(res, targetFile); if (!entityDecl.isInternalReference()) XmlEntityCache.copyEntityCaches(res.getContainingFile(), targetFile); return new Result<PsiElement>(res, res.getUserData(XmlElement.DEPENDING_ELEMENT), entityDecl, targetFile, entityRef); } }, false); entityRef.putUserData(PARSED_DECL_KEY, value); } return value.getValue(); } }
private static PsiElement parseEntityDecl(final XmlEntityDecl entityDecl, final PsiFile targetFile, final XmlEntityDecl.EntityContextType type, final XmlEntityRef entityRef) { CachedValue<PsiElement> value = entityRef.getUserData(PARSED_DECL_KEY); if(value == null) { value = CachedValuesManager.getManager(entityDecl.getProject()).createCachedValue(() -> { final PsiElement res = entityDecl.parse(targetFile, type, entityRef); if(res == null) { return new CachedValueProvider.Result<>(res, targetFile); } if(!entityDecl.isInternalReference()) { XmlEntityCache.copyEntityCaches(res.getContainingFile(), targetFile); } return new CachedValueProvider.Result<>(res, res.getUserData(XmlElement.DEPENDING_ELEMENT), entityDecl, targetFile, entityRef); }, false); value = ((XmlEntityRefImpl) entityRef).putUserDataIfAbsent(PARSED_DECL_KEY, value); } return value.getValue(); }
@Nullable public static PsiNamedElement findRealNamedElement(@NotNull final PsiNamedElement _element) { PsiElement currentElement = _element; final XmlEntityRef lastEntityRef = PsiTreeUtil.getParentOfType(currentElement, XmlEntityRef.class); while (!(currentElement instanceof XmlFile)) { PsiElement dependingElement = currentElement.getUserData(XmlElement.DEPENDING_ELEMENT); if (dependingElement == null) dependingElement = currentElement.getContext(); currentElement = dependingElement; if (dependingElement == null) break; } if (currentElement != null) { final String name = _element.getName(); if (_element instanceof XmlEntityDecl) { final XmlEntityDecl cachedEntity = XmlEntityCache.getCachedEntity((PsiFile)currentElement, name); if (cachedEntity != null) return cachedEntity; } final PsiNamedElement[] result = new PsiNamedElement[1]; processXmlElements((XmlFile)currentElement, new PsiElementProcessor() { @Override public boolean execute(@NotNull final PsiElement element) { if (element instanceof PsiNamedElement) { final String elementName = ((PsiNamedElement)element).getName(); if (elementName.equals(name) && _element.getClass().isInstance(element) || lastEntityRef != null && element instanceof XmlEntityDecl && elementName.equals(lastEntityRef.getText().substring(1, lastEntityRef.getTextLength() - 1))) { result[0] = (PsiNamedElement)element; return false; } } return true; } }, true); return result[0]; } return null; }
private static Set<String> extractEmbeddedFileReferences(XmlFile file, XmlFile context, final String url) { final Set<String> result = new LinkedHashSet<String>(); if (context != null) { XmlEntityCache.copyEntityCaches(file, context); } XmlUtil.processXmlElements( file, new PsiElementProcessor() { @Override public boolean execute(@NotNull PsiElement element) { if (element instanceof XmlEntityDecl) { String candidateName = null; for (PsiElement e = element.getLastChild(); e != null; e = e.getPrevSibling()) { if (e instanceof XmlAttributeValue && candidateName == null) { candidateName = e.getText().substring(1, e.getTextLength() - 1); } else if (e instanceof XmlToken && candidateName != null && (((XmlToken)e).getTokenType() == XmlTokenType.XML_DOCTYPE_PUBLIC || ((XmlToken)e).getTokenType() == XmlTokenType.XML_DOCTYPE_SYSTEM ) ) { if (!result.contains(candidateName)) { result.add(candidateName); } break; } } } else if (element instanceof XmlTag) { final XmlTag tag = (XmlTag)element; String schemaLocation = tag.getAttributeValue(XmlUtil.SCHEMA_LOCATION_ATT); if (schemaLocation != null) { // processing xsd:import && xsd:include final PsiReference[] references = tag.getAttribute(XmlUtil.SCHEMA_LOCATION_ATT).getValueElement().getReferences(); if (references.length > 0) { String extension = FileUtilRt.getExtension(new File(url).getName()); final String namespace = tag.getAttributeValue("namespace"); if (namespace != null && schemaLocation.indexOf('/') == -1 && !extension.equals(FileUtilRt.getExtension(schemaLocation))) { result.add(namespace.substring(0, namespace.lastIndexOf('/') + 1) + schemaLocation); } else { result.add(schemaLocation); } } } else { schemaLocation = tag.getAttributeValue(XmlUtil.SCHEMA_LOCATION_ATT, XmlUtil.XML_SCHEMA_INSTANCE_URI); if (schemaLocation != null) { final StringTokenizer tokenizer = new StringTokenizer(schemaLocation); while (tokenizer.hasMoreTokens()) { tokenizer.nextToken(); if (!tokenizer.hasMoreTokens()) break; String location = tokenizer.nextToken(); result.add(location); } } } } return true; } }, true, true ); return result; }
@Nullable public static PsiNamedElement findRealNamedElement(@NotNull final PsiNamedElement _element) { PsiElement currentElement = _element; final XmlEntityRef lastEntityRef = PsiTreeUtil.getParentOfType(currentElement, XmlEntityRef.class); while (!(currentElement instanceof XmlFile)) { PsiElement dependingElement = currentElement.getUserData(XmlElement.DEPENDING_ELEMENT); if (dependingElement == null) dependingElement = currentElement.getContext(); currentElement = dependingElement; if (dependingElement == null) break; } if (currentElement != null) { final String name = _element.getName(); if (_element instanceof XmlEntityDecl) { final XmlEntityDecl cachedEntity = XmlEntityCache.getCachedEntity((PsiFile)currentElement, name); if (cachedEntity != null) return cachedEntity; } final PsiNamedElement[] result = new PsiNamedElement[1]; processXmlElements((XmlFile)currentElement, new PsiElementProcessor() { public boolean execute(@NotNull final PsiElement element) { if (element instanceof PsiNamedElement) { final String elementName = ((PsiNamedElement)element).getName(); if (elementName.equals(name) && _element.getClass().isInstance(element) || lastEntityRef != null && element instanceof XmlEntityDecl && elementName.equals(lastEntityRef.getText().substring(1, lastEntityRef.getTextLength() - 1))) { result[0] = (PsiNamedElement)element; return false; } } return true; } }, true); return result[0]; } return null; }
private static Set<String> extractEmbeddedFileReferences(XmlFile file, XmlFile context, final String url) { final Set<String> result = new LinkedHashSet<String>(); if (context != null) { XmlEntityCache.copyEntityCaches(file, context); } XmlUtil.processXmlElements( file, new PsiElementProcessor() { public boolean execute(@NotNull PsiElement element) { if (element instanceof XmlEntityDecl) { String candidateName = null; for (PsiElement e = element.getLastChild(); e != null; e = e.getPrevSibling()) { if (e instanceof XmlAttributeValue && candidateName == null) { candidateName = e.getText().substring(1, e.getTextLength() - 1); } else if (e instanceof XmlToken && candidateName != null && (((XmlToken)e).getTokenType() == XmlTokenType.XML_DOCTYPE_PUBLIC || ((XmlToken)e).getTokenType() == XmlTokenType.XML_DOCTYPE_SYSTEM ) ) { if (!result.contains(candidateName)) { result.add(candidateName); } break; } } } else if (element instanceof XmlTag) { final XmlTag tag = (XmlTag)element; String schemaLocation = tag.getAttributeValue(XmlUtil.SCHEMA_LOCATION_ATT); if (schemaLocation != null) { // processing xsd:import && xsd:include final PsiReference[] references = tag.getAttribute(XmlUtil.SCHEMA_LOCATION_ATT).getValueElement().getReferences(); if (references.length > 0) { String extension = FileUtilRt.getExtension(new File(url).getName()); final String namespace = tag.getAttributeValue("namespace"); if (namespace != null && schemaLocation.indexOf('/') == -1 && !extension.equals(FileUtilRt.getExtension(schemaLocation))) { result.add(namespace.substring(0, namespace.lastIndexOf('/') + 1) + schemaLocation); } else { result.add(schemaLocation); } } } else { schemaLocation = tag.getAttributeValue(XmlUtil.SCHEMA_LOCATION_ATT, XmlUtil.XML_SCHEMA_INSTANCE_URI); if (schemaLocation != null) { final StringTokenizer tokenizer = new StringTokenizer(schemaLocation); while (tokenizer.hasMoreTokens()) { tokenizer.nextToken(); if (!tokenizer.hasMoreTokens()) break; String location = tokenizer.nextToken(); result.add(location); } } } } return true; } }, true, true ); return result; }
private boolean processElement(PsiElement child, boolean deepFlag, boolean wideFlag, boolean processIncludes) { if(deepFlag) { if(!processXmlElements(child, true, wideFlag, processIncludes)) { return false; } } else { if(child instanceof XmlEntityRef) { if(!processXmlElements(child, false, wideFlag, processIncludes)) { return false; } } else if(child instanceof XmlConditionalSection) { if(!processXmlElements(child, false, wideFlag, processIncludes)) { return false; } } else if(processIncludes && XmlIncludeHandler.isXInclude(child)) { if(!processXmlElements(child, false, wideFlag, processIncludes)) { return false; } } else if(!processor.execute(child)) { return false; } } if(targetFile != null && child instanceof XmlEntityDecl) { XmlEntityDecl xmlEntityDecl = (XmlEntityDecl) child; XmlEntityCache.cacheParticularEntity(targetFile, xmlEntityDecl); } return true; }
@Nullable public static PsiNamedElement findRealNamedElement(@NotNull final PsiNamedElement _element) { PsiElement currentElement = _element; final XmlEntityRef lastEntityRef = PsiTreeUtil.getParentOfType(currentElement, XmlEntityRef.class); while(!(currentElement instanceof XmlFile)) { PsiElement dependingElement = currentElement.getUserData(XmlElement.DEPENDING_ELEMENT); if(dependingElement == null) { dependingElement = currentElement.getContext(); } currentElement = dependingElement; if(dependingElement == null) { break; } } if(currentElement != null) { final String name = _element.getName(); if(_element instanceof XmlEntityDecl) { final XmlEntityDecl cachedEntity = XmlEntityCache.getCachedEntity((PsiFile) currentElement, name); if(cachedEntity != null) { return cachedEntity; } } final PsiNamedElement[] result = new PsiNamedElement[1]; processXmlElements((XmlFile) currentElement, new PsiElementProcessor() { @Override public boolean execute(@NotNull final PsiElement element) { if(element instanceof PsiNamedElement) { final String elementName = ((PsiNamedElement) element).getName(); if(elementName.equals(name) && _element.getClass().isInstance(element) || lastEntityRef != null && element instanceof XmlEntityDecl && elementName.equals(lastEntityRef .getText().substring(1, lastEntityRef.getTextLength() - 1))) { result[0] = (PsiNamedElement) element; return false; } } return true; } }, true); return result[0]; } return null; }