diff --git a/xml/impl/src/com/intellij/codeInsight/completion/ExtendedTagInsertHandler.java b/xml/impl/src/com/intellij/codeInsight/completion/ExtendedTagInsertHandler.java index 65b560a451f8..d935312f634e 100644 --- a/xml/impl/src/com/intellij/codeInsight/completion/ExtendedTagInsertHandler.java +++ b/xml/impl/src/com/intellij/codeInsight/completion/ExtendedTagInsertHandler.java @@ -134,8 +134,13 @@ public class ExtendedTagInsertHandler extends XmlTagInsertHandler { if (myNamespace == null) { return null; } - final XmlSchemaProvider provider = XmlSchemaProvider.getAvailableProvider(file); - return provider == null ? null : provider.getDefaultPrefix(myNamespace, file); + for (XmlSchemaProvider provider : XmlSchemaProvider.getAvailableProviders(file)) { + String prefix = provider.getDefaultPrefix(myNamespace, file); + if (prefix != null) { + return prefix; + } + } + return null; } protected Set getNamespaces(final XmlFile file) { diff --git a/xml/impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/URLReference.java b/xml/impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/URLReference.java index 4ccc5f9dc191..e8c65f185c38 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/URLReference.java +++ b/xml/impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/URLReference.java @@ -11,10 +11,11 @@ import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.daemon.impl.quickfix.*; import com.intellij.javaee.ExternalResourceManager; import com.intellij.javaee.ExternalResourceManagerEx; +import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlAttribute; @@ -32,6 +33,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.HashSet; import java.util.Set; /** @@ -180,12 +182,17 @@ public class URLReference implements PsiReference, QuickFixProvider, EmptyResolv return myElement.getManager().areElementsEquivalent(resolve(),element); } + @NotNull public Object[] getVariants() { final XmlFile file = (XmlFile)myElement.getContainingFile(); - final XmlSchemaProvider provider = XmlSchemaProvider.getAvailableProvider(file); - if (provider != null) { - final Set strings = provider.getAvailableNamespaces(file, null); - return ArrayUtil.toObjectArray(strings); + Set list = new HashSet(); + for (XmlSchemaProvider provider : Extensions.getExtensions(XmlSchemaProvider.EP_NAME)) { + if (provider.isAvailable(file)) { + list.addAll(provider.getAvailableNamespaces(file, null)); + } + } + if (!list.isEmpty()) { + return ArrayUtil.toObjectArray(list); } String[] resourceUrls = ExternalResourceManager.getInstance().getResourceUrls(null, true); final XmlDocument document = file.getDocument(); diff --git a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlDoctypeImpl.java b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlDoctypeImpl.java index b1fd03fb051e..93640437e49b 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlDoctypeImpl.java +++ b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlDoctypeImpl.java @@ -195,9 +195,10 @@ public class XmlDoctypeImpl extends XmlElementImpl implements XmlDoctype, XmlEle if (dtdUrlElement != null) { uriRefs = new PsiReference[1]; uriRefs[0] = new URLReference(XmlDoctypeImpl.this) { + @NotNull public Object[] getVariants() { return (docTypePublic != null)? - super.getVariants(): PsiReference.EMPTY_ARRAY; + super.getVariants(): EMPTY_ARRAY; } public String getCanonicalText() { return extractValue(dtdUrlElement); diff --git a/xml/openapi/src/com/intellij/xml/XmlSchemaProvider.java b/xml/openapi/src/com/intellij/xml/XmlSchemaProvider.java index a9c8a471cf9d..8f5704584595 100644 --- a/xml/openapi/src/com/intellij/xml/XmlSchemaProvider.java +++ b/xml/openapi/src/com/intellij/xml/XmlSchemaProvider.java @@ -20,16 +20,19 @@ import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; -import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.DumbAware; -import com.intellij.psi.PsiFile; +import com.intellij.openapi.project.DumbService; +import com.intellij.openapi.util.Condition; import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlFile; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collections; +import java.util.List; import java.util.Set; /** @@ -66,6 +69,10 @@ public abstract class XmlSchemaProvider { return findSchema(url, module, baseFile); } + /** + * @see #getAvailableProviders(com.intellij.psi.xml.XmlFile) + */ + @Deprecated @Nullable public static XmlSchemaProvider getAvailableProvider(final @NotNull XmlFile file) { for (XmlSchemaProvider provider: Extensions.getExtensions(EP_NAME)) { @@ -76,6 +83,14 @@ public abstract class XmlSchemaProvider { return null; } + public static List getAvailableProviders(final @NotNull XmlFile file) { + return ContainerUtil.findAll(Extensions.getExtensions(EP_NAME), new Condition() { + public boolean value(XmlSchemaProvider xmlSchemaProvider) { + return xmlSchemaProvider.isAvailable(file); + } + }); + } + @Nullable public abstract XmlFile getSchema(@NotNull @NonNls String url, @Nullable Module module, @NotNull final PsiFile baseFile);