diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FilePathReferenceProvider.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FilePathReferenceProvider.java index 298025209ca0..d14698237643 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FilePathReferenceProvider.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FilePathReferenceProvider.java @@ -23,6 +23,8 @@ import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.util.ProcessingContext; +import com.intellij.util.containers.*; +import com.intellij.util.containers.HashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -45,11 +47,15 @@ public class FilePathReferenceProvider extends PsiReferenceProvider { @NotNull public PsiReference[] getReferencesByElement(PsiElement element, String text, int offset, final boolean soft) { - return getReferencesByElement(element, text, offset, soft, null); + return getReferencesByElement(element, text, offset, soft, Module.EMPTY_ARRAY); } @NotNull - public PsiReference[] getReferencesByElement(PsiElement element, String text, int offset, final boolean soft, final @Nullable Module forModule) { + public PsiReference[] getReferencesByElement(PsiElement element, + String text, + int offset, + final boolean soft, + final @NotNull Module... forModules) { return new FileReferenceSet(text, element, offset, this, true, myEndingSlashNotAllowed) { @@ -75,9 +81,17 @@ public class FilePathReferenceProvider extends PsiReferenceProvider { } @Override - @NotNull public Collection computeDefaultContexts() { - final Module module = forModule == null ? ModuleUtil.findModuleForPsiElement(getElement()) : forModule; - return getRoots(module, true); + @NotNull + public Collection computeDefaultContexts() { + Set systemItems = new HashSet(); + if (forModules.length > 0) { + for (Module forModule : forModules) { + systemItems.addAll(getRoots(forModule, true)); + } + } else { + systemItems.addAll(getRoots(ModuleUtil.findModuleForPsiElement(getElement()), true)); + } + return systemItems; } @Override @@ -95,7 +109,6 @@ public class FilePathReferenceProvider extends PsiReferenceProvider { }; } }.getAllReferences(); - } @Override @@ -162,5 +175,4 @@ public class FilePathReferenceProvider extends PsiReferenceProvider { } return result; } - } diff --git a/java/java-impl/src/com/intellij/util/xml/JvmPsiTypeConverterImpl.java b/java/java-impl/src/com/intellij/util/xml/JvmPsiTypeConverterImpl.java index a7eabd13ad4d..9c1eae2971f8 100644 --- a/java/java-impl/src/com/intellij/util/xml/JvmPsiTypeConverterImpl.java +++ b/java/java-impl/src/com/intellij/util/xml/JvmPsiTypeConverterImpl.java @@ -86,7 +86,7 @@ public class JvmPsiTypeConverterImpl extends JvmPsiTypeConverter implements Cust if (Arrays.binarySearch(CanonicalPsiTypeConverterImpl.PRIMITIVES, s) >= 0) { return JavaPsiFacade.getInstance(context.getProject()).getElementFactory().createPrimitiveType(s); } - final PsiClass aClass1 = DomJavaUtil.findClass(s, context.getFile(), context.getModule(), null); + final PsiClass aClass1 = DomJavaUtil.findClass(s, context.getFile(), context.getModule(), context.getSearchScope()); return aClass1 == null ? null : createType(aClass1); } diff --git a/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java b/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java index 27b71df5d6d3..a5b0cf2698c3 100644 --- a/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java +++ b/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java @@ -43,7 +43,7 @@ public class PsiClassConverter extends Converter implements CustomRefe public static PsiClass findClass(String s, ConvertContext context) { final DomElement element = context.getInvocationElement(); - final GlobalSearchScope scope = element instanceof GenericDomValue ? getSearchScope(context) : null; + final GlobalSearchScope scope = element instanceof GenericDomValue ? context.getSearchScope() : null; return DomJavaUtil.findClass(s, context.getFile(), context.getModule(), scope); } @@ -64,7 +64,8 @@ public class PsiClassConverter extends Converter implements CustomRefe return provider.getReferencesByElement(element); } - protected JavaClassReferenceProvider createClassReferenceProvider(final GenericDomValue genericDomValue, final ConvertContext context, + protected JavaClassReferenceProvider createClassReferenceProvider(final GenericDomValue genericDomValue, + final ConvertContext context, ExtendClass extendClass) { return createJavaClassReferenceProvider(genericDomValue, extendClass, new JavaClassReferenceProvider() { @@ -99,7 +100,6 @@ public class PsiClassConverter extends Converter implements CustomRefe provider.setOption(JavaClassReferenceProvider.JVM_FORMAT, Boolean.TRUE); } provider.setAllowEmpty(extendClass.allowEmpty()); - } ClassTemplate template = genericDomValue.getAnnotation(ClassTemplate.class); @@ -114,22 +114,9 @@ public class PsiClassConverter extends Converter implements CustomRefe return provider; } - public static GlobalSearchScope getSearchScope(@NotNull ConvertContext context) { - final Module module = context.getModule(); - if (module == null) return null; - PsiFile file = context.getFile(); - file = file.getOriginalFile(); - VirtualFile virtualFile = file.getVirtualFile(); - if (virtualFile == null) return null; - ProjectFileIndex fileIndex = ProjectRootManager.getInstance(file.getProject()).getFileIndex(); - boolean tests = fileIndex.isInTestSourceContent(virtualFile); - return module.getModuleRuntimeScope(tests); - - } - @Nullable - protected GlobalSearchScope getScope(@NotNull ConvertContext context) { - return getSearchScope(context); + protected GlobalSearchScope getScope(@NotNull ConvertContext context) { + return context.getSearchScope(); } public static class AnnotationType extends PsiClassConverter { diff --git a/platform/lang-api/src/com/intellij/openapi/paths/PathReferenceManager.java b/platform/lang-api/src/com/intellij/openapi/paths/PathReferenceManager.java index 69e077ee9237..a646ecaea3d2 100644 --- a/platform/lang-api/src/com/intellij/openapi/paths/PathReferenceManager.java +++ b/platform/lang-api/src/com/intellij/openapi/paths/PathReferenceManager.java @@ -84,7 +84,9 @@ public abstract class PathReferenceManager { @Nullable - public abstract PathReference getPathReference(@NotNull String path, @NotNull Module module, @NotNull PsiElement element, PathReferenceProvider... additionalProviders); + public abstract PathReference getPathReference(@NotNull String path, + @NotNull PsiElement element, + PathReferenceProvider... additionalProviders); @Nullable public abstract PathReference getCustomPathReference(@NotNull String path, @NotNull Module module, @NotNull PsiElement element, PathReferenceProvider... providers); diff --git a/platform/lang-impl/src/com/intellij/openapi/paths/PathReferenceManagerImpl.java b/platform/lang-impl/src/com/intellij/openapi/paths/PathReferenceManagerImpl.java index 10efa41c1b09..23c4d1fdb3e2 100644 --- a/platform/lang-impl/src/com/intellij/openapi/paths/PathReferenceManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/paths/PathReferenceManagerImpl.java @@ -43,7 +43,9 @@ public class PathReferenceManagerImpl extends PathReferenceManager { @Override @Nullable - public PathReference getPathReference(@NotNull String path, @NotNull final Module module, @NotNull PsiElement element, PathReferenceProvider... additionalProviders) { + public PathReference getPathReference(@NotNull String path, + @NotNull PsiElement element, + PathReferenceProvider... additionalProviders) { PathReference pathReference; for (PathReferenceProvider provider : getProviders()) { pathReference = provider.getPathReference(path, element); diff --git a/xml/dom-impl/dom-impl.iml b/xml/dom-impl/dom-impl.iml index 55edc2294f84..8b2feb012eaf 100644 --- a/xml/dom-impl/dom-impl.iml +++ b/xml/dom-impl/dom-impl.iml @@ -9,7 +9,7 @@ - + diff --git a/xml/dom-impl/src/META-INF/DomPlugin.xml b/xml/dom-impl/src/META-INF/DomPlugin.xml index 71ce3f7d6235..3b2e0ff1e073 100644 --- a/xml/dom-impl/src/META-INF/DomPlugin.xml +++ b/xml/dom-impl/src/META-INF/DomPlugin.xml @@ -17,6 +17,8 @@ + + diff --git a/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementAnnotationHolderImpl.java b/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementAnnotationHolderImpl.java index f38114009914..55b140a05ff4 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementAnnotationHolderImpl.java +++ b/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementAnnotationHolderImpl.java @@ -27,7 +27,7 @@ import com.intellij.psi.xml.XmlElement; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xml.*; -import com.intellij.util.xml.impl.ConvertContextImpl; +import com.intellij.util.xml.impl.ConvertContextFactory; import com.intellij.util.xml.impl.DomManagerImpl; import com.intellij.util.xml.reflect.DomCollectionChildDescription; import org.jetbrains.annotations.NotNull; @@ -122,7 +122,7 @@ public class DomElementAnnotationHolderImpl extends SmartList extends PsiReferenceBase im } public String getUnresolvedMessagePattern() { - final ConvertContextImpl context = getConvertContext(); + final ConvertContext context = getConvertContext(); return getConverter().getErrorMessage(getStringValue(), context); } - public final ConvertContextImpl getConvertContext() { - return new ConvertContextImpl(DomManagerImpl.getDomInvocationHandler(myGenericValue)); + public final ConvertContext getConvertContext() { + return ConvertContextFactory.createConvertContext(DomManagerImpl.getDomInvocationHandler(myGenericValue)); } public PsiElement handleElementRename(final String newElementName) throws IncorrectOperationException { diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/GenericValueReferenceProvider.java b/xml/dom-impl/src/com/intellij/util/xml/impl/GenericValueReferenceProvider.java index 4040ade8572a..b457c9d6b10a 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/GenericValueReferenceProvider.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/GenericValueReferenceProvider.java @@ -89,17 +89,8 @@ public class GenericValueReferenceProvider extends PsiReferenceProvider { return references; } - private static AbstractConvertContext createConvertContext(final PsiElement psiElement, final GenericDomValue domValue) { - return new AbstractConvertContext() { - @NotNull - public DomElement getInvocationElement() { - return domValue; - } - - public PsiManager getPsiManager() { - return psiElement.getManager(); - } - }; + private static ConvertContext createConvertContext(final PsiElement psiElement, final GenericDomValue domValue) { + return ConvertContextFactory.createConvertContext(domValue); } @Nullable @@ -108,7 +99,7 @@ public class GenericValueReferenceProvider extends PsiReferenceProvider { } private PsiReference[] createReferences(final GenericDomValue domValue, final XmlElement psiElement, final Object converter) { - AbstractConvertContext context = createConvertContext(psiElement, domValue); + ConvertContext context = createConvertContext(psiElement, domValue); List result = new ArrayList(); String unresolvedText = ElementManipulators.getValueText(psiElement); diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/GetInvocation.java b/xml/dom-impl/src/com/intellij/util/xml/impl/GetInvocation.java index e8534f390c01..c2642f1c1fb6 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/GetInvocation.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/GetInvocation.java @@ -9,10 +9,7 @@ import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.xml.Converter; -import com.intellij.util.xml.DomReferenceInjector; -import com.intellij.util.xml.DomUtil; -import com.intellij.util.xml.SubTag; +import com.intellij.util.xml.*; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -81,7 +78,7 @@ public class GetInvocation implements Invocation { } String tagValue = handler.getValue(); - ConvertContextImpl context = new ConvertContextImpl(handler); + ConvertContext context = ConvertContextFactory.createConvertContext(handler); for (DomReferenceInjector each : DomUtil.getFileElement(handler).getFileDescription().getReferenceInjectors()) { tagValue = each.resolveString(tagValue, context); diff --git a/xml/dom-openapi/src/com/intellij/util/xml/AbstractConvertContext.java b/xml/dom-openapi/src/com/intellij/util/xml/AbstractConvertContext.java index dd2c03f0bbd4..b3580d6de9ea 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/AbstractConvertContext.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/AbstractConvertContext.java @@ -17,7 +17,12 @@ package com.intellij.util.xml; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.xml.XmlElement; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; @@ -29,15 +34,6 @@ import org.jetbrains.annotations.Nullable; */ public abstract class AbstractConvertContext extends ConvertContext { - public static ConvertContext createConvertContext(final DomElement domElement) { - return new AbstractConvertContext() { - @NotNull - public DomElement getInvocationElement() { - return domElement; - } - }; - } - public final XmlTag getTag() { return getInvocationElement().getXmlTag(); } @@ -56,7 +52,7 @@ public abstract class AbstractConvertContext extends ConvertContext { final DomFileElement fileElement = DomUtil.getFileElement(getInvocationElement()); if (fileElement == null) { final XmlElement xmlElement = getInvocationElement().getXmlElement(); - return xmlElement == null? null : ModuleUtil.findModuleForPsiElement(xmlElement); + return xmlElement == null ? null : ModuleUtil.findModuleForPsiElement(xmlElement); } return fileElement.getRootElement().getModule(); } @@ -65,4 +61,66 @@ public abstract class AbstractConvertContext extends ConvertContext { return getFile().getManager(); } + @Nullable + public GlobalSearchScope getSearchScope() { + GlobalSearchScope scope = null; + + Module[] modules = getConvertContextModules(this); + if (modules.length != 0) { + + PsiFile file = getFile(); + file = file.getOriginalFile(); + VirtualFile virtualFile = file.getVirtualFile(); + if (virtualFile != null) { + ProjectFileIndex fileIndex = ProjectRootManager.getInstance(file.getProject()).getFileIndex(); + boolean tests = fileIndex.isInTestSourceContent(virtualFile); + + for (Module module : modules) { + if (scope == null) { + scope = module.getModuleRuntimeScope(tests); + } + else { + scope.union(module.getModuleRuntimeScope(tests)); + } + } + } + } + return scope; // ??? scope == null ? GlobalSearchScope.allScope(getProject()) : scope; ??? + } + + public static GlobalSearchScope getSearchScope(@NotNull ConvertContext context) { + Module[] modules = getConvertContextModules(context); + if (modules.length == 0) return null; + + PsiFile file = context.getFile(); + file = file.getOriginalFile(); + VirtualFile virtualFile = file.getVirtualFile(); + if (virtualFile == null) return null; + ProjectFileIndex fileIndex = ProjectRootManager.getInstance(file.getProject()).getFileIndex(); + boolean tests = fileIndex.isInTestSourceContent(virtualFile); + + + GlobalSearchScope scope = null; + for (Module module : modules) { + if (scope == null) { + scope = module.getModuleRuntimeScope(tests); + } + else { + scope.union(module.getModuleRuntimeScope(tests)); + } + } + return scope; + } + + + @NotNull + private static Module[] getConvertContextModules(@NotNull ConvertContext context) { + Module[] modules = ModuleContextProvider.getModules(context.getFile()); + if (modules.length > 0) return modules; + + final Module module = context.getModule(); + if (module != null) return new Module[]{module}; + + return new Module[0]; + } } diff --git a/xml/dom-openapi/src/com/intellij/util/xml/ConvertContext.java b/xml/dom-openapi/src/com/intellij/util/xml/ConvertContext.java index 2ee1b01aa5b4..00550b0713f4 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/ConvertContext.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/ConvertContext.java @@ -18,6 +18,7 @@ package com.intellij.util.xml; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiManager; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlElement; import com.intellij.psi.xml.XmlFile; @@ -56,6 +57,9 @@ public abstract class ConvertContext { @Nullable public abstract Module getModule(); + + @Nullable + public abstract GlobalSearchScope getSearchScope(); public abstract PsiManager getPsiManager(); diff --git a/xml/dom-openapi/src/com/intellij/util/xml/ModuleContextProvider.java b/xml/dom-openapi/src/com/intellij/util/xml/ModuleContextProvider.java new file mode 100644 index 000000000000..7cf5525509e0 --- /dev/null +++ b/xml/dom-openapi/src/com/intellij/util/xml/ModuleContextProvider.java @@ -0,0 +1,33 @@ +package com.intellij.util.xml; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleUtilCore; +import com.intellij.psi.PsiFile; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.HashSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; + +public abstract class ModuleContextProvider { + public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.moduleContextProvider"); + + @NotNull + public abstract Module[] getContextModules(@NotNull PsiFile context); + + public static Module[] getModules(@Nullable PsiFile context) { + if (context == null) return Module.EMPTY_ARRAY; + + final Set modules = new HashSet(); + for (ModuleContextProvider moduleContextProvider : Extensions.getExtensions(EP_NAME)) { + ContainerUtil.addAllNotNull(modules, moduleContextProvider.getContextModules(context)); + } + Module module = ModuleUtilCore.findModuleForPsiElement(context); + if (module != null) modules.add(module); + + return modules.toArray(new Module[modules.size()]); + } +} diff --git a/xml/dom-openapi/src/com/intellij/util/xml/converters/PathReferenceConverter.java b/xml/dom-openapi/src/com/intellij/util/xml/converters/PathReferenceConverter.java index c533e58e9862..2d578a111bda 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/converters/PathReferenceConverter.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/converters/PathReferenceConverter.java @@ -36,9 +36,8 @@ public class PathReferenceConverter extends Converter implements public final static Converter INSTANCE = new PathReferenceConverter(); public PathReference fromString(@Nullable final String s, final ConvertContext context) { - Module module = context.getModule(); final XmlElement element = context.getXmlElement(); - return s == null || module == null || element == null ? null : PathReferenceManager.getInstance().getPathReference(s, module, element); + return s == null || element == null ? null : PathReferenceManager.getInstance().getPathReference(s, element); } public String toString(final PathReference t, final ConvertContext context) { diff --git a/xml/dom-openapi/src/com/intellij/util/xml/ui/ComboControl.java b/xml/dom-openapi/src/com/intellij/util/xml/ui/ComboControl.java index db9c5eda4625..3984d19fba47 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/ui/ComboControl.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/ui/ComboControl.java @@ -112,24 +112,6 @@ public class ComboControl extends BaseModifiableControl { }; } - public static Factory> createVariantsGetter(final GenericDomValue reference) { - return new Factory>() { - public Collection create() { - final Converter converter = reference.getConverter(); - if (converter instanceof ResolvingConverter) { - return ((ResolvingConverter)converter).getVariants(new AbstractConvertContext() { - @NotNull - public DomElement getInvocationElement() { - return reference; - } - }); - - } - return Collections.emptyList(); - } - }; - } - public static Factory>> createPresentationFunction(final Factory> variantFactory) { return new Factory>>() { public List> create() {