@NotNull
public static GlobalSearchScope filesWithoutLibrariesScope(@NotNull Project project, @NotNull Collection<VirtualFile> files) {
if (files.isEmpty()) return EMPTY_SCOPE;
- return new FilesScope(project, files, false);
+ return new FilesScope(project, files, false, false);
}
@NotNull
public static GlobalSearchScope filesWithLibrariesScope(@NotNull Project project, @NotNull Collection<VirtualFile> files) {
+ return filesWithLibrariesScope(project, files, false);
+ }
+
+ /**
+ * @since 2017.3
+ */
+ @NotNull
+ public static GlobalSearchScope filesWithLibrariesScope(@NotNull Project project, @NotNull Collection<VirtualFile> files,
+ boolean searchOutsideRootModel) {
if (files.isEmpty()) return EMPTY_SCOPE;
- return new FilesScope(project, files, true);
+ return new FilesScope(project, files, true, searchOutsideRootModel);
}
/**
public static class FilesScope extends GlobalSearchScope implements Iterable<VirtualFile> {
private final Collection<VirtualFile> myFiles;
+ private final boolean mySearchOutsideRootModel;
private volatile Boolean myHasFilesOutOfProjectRoots;
/**
* @deprecated use {@link GlobalSearchScope#filesScope(Project, Collection)}
*/
public FilesScope(@Nullable Project project, @NotNull Collection<VirtualFile> files) {
- this(project, files, null);
+ this(project, files, null, false);
}
// Optimization
- private FilesScope(@Nullable Project project, @NotNull Collection<VirtualFile> files, @Nullable Boolean hasFilesOutOfProjectRoots) {
+ private FilesScope(@Nullable Project project, @NotNull Collection<VirtualFile> files, @Nullable Boolean hasFilesOutOfProjectRoots,
+ boolean searchOutsideRootModel) {
super(project);
myFiles = files;
+ mySearchOutsideRootModel = searchOutsideRootModel;
myHasFilesOutOfProjectRoots = hasFilesOutOfProjectRoots;
}
public Iterator<VirtualFile> iterator() {
return myFiles.iterator();
}
+
+ @Override
+ public boolean isSearchOutsideRootModel() {
+ return mySearchOutsideRootModel;
+ }
}
}
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlTag;
-import com.intellij.util.Consumer;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.KeyedLazyInstanceEP;
import com.intellij.util.PsiNavigateUtil;
import org.jetbrains.idea.devkit.dom.IdeaPlugin;
import org.jetbrains.idea.devkit.util.ExtensionPointCandidate;
-import java.util.List;
+import java.util.ArrayList;
import java.util.Map;
+import java.util.Set;
-/**
- * @author yole
- */
public class RegisterExtensionFix implements IntentionAction {
private final PsiClass myExtensionClass;
- private final List<ExtensionPointCandidate> myEPCandidates;
+ private final Set<ExtensionPointCandidate> myEPCandidates;
- public RegisterExtensionFix(PsiClass extensionClass, List<ExtensionPointCandidate> epCandidates) {
+ public RegisterExtensionFix(PsiClass extensionClass, Set<ExtensionPointCandidate> epCandidates) {
myExtensionClass = extensionClass;
myEPCandidates = epCandidates;
}
private void doFix(Editor editor, final DomFileElement<IdeaPlugin> element) {
if (myEPCandidates.size() == 1) {
- registerExtension(element, myEPCandidates.get(0));
+ registerExtension(element, myEPCandidates.iterator().next());
}
else {
final BaseListPopupStep<ExtensionPointCandidate> popupStep =
- new BaseListPopupStep<ExtensionPointCandidate>("Choose Extension Point", myEPCandidates) {
+ new BaseListPopupStep<ExtensionPointCandidate>("Choose Extension Point", new ArrayList<>(myEPCandidates)) {
@Override
public PopupStep onChosen(ExtensionPointCandidate selectedValue, boolean finalChoice) {
registerExtension(element, selectedValue);
import org.jetbrains.idea.devkit.util.ExtensionPointCandidate;
import org.jetbrains.idea.devkit.util.ExtensionPointLocator;
-import java.util.List;
+import java.util.Set;
-/**
- * @author Dmitry Avdeev
- * Date: 1/19/12
- */
public class RegisterExtensionFixProvider implements UnusedDeclarationFixProvider {
@NotNull
}
ExtensionPointLocator extensionPointLocator = new ExtensionPointLocator(psiClass);
- List<ExtensionPointCandidate> candidateList = extensionPointLocator.findSuperCandidates();
+ Set<ExtensionPointCandidate> candidateList = extensionPointLocator.findSuperCandidates();
if (!candidateList.isEmpty()) {
return new IntentionAction[]{new RegisterExtensionFix(psiClass, candidateList)};
}
return result;
}
- @SuppressWarnings("unchecked") // it's fine with Processor.FALSE
public static boolean isRegisteredExtension(@NotNull PsiClass psiClass) {
String name = psiClass.getQualifiedName();
if (name == null) {
import com.intellij.psi.SmartPsiElementPointer;
import com.intellij.psi.xml.XmlTag;
-/**
- * @author yole
- */
public class ExtensionPointCandidate extends PointableCandidate {
public final String epName;
public final String attributeName;
public String toString() {
return epName;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ExtensionPointCandidate candidate = (ExtensionPointCandidate)o;
+
+ if (epName != null ? !epName.equals(candidate.epName) : candidate.epName != null) return false;
+ if (attributeName != null ? !attributeName.equals(candidate.attributeName) : candidate.attributeName != null) return false;
+ if (tagName != null ? !tagName.equals(candidate.tagName) : candidate.tagName != null) return false;
+ if (beanClassName != null ? !beanClassName.equals(candidate.beanClassName) : candidate.beanClassName != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = epName != null ? epName.hashCode() : 0;
+ result = 31 * result + (attributeName != null ? attributeName.hashCode() : 0);
+ result = 31 * result + (tagName != null ? tagName.hashCode() : 0);
+ result = 31 * result + (beanClassName != null ? beanClassName.hashCode() : 0);
+ return result;
+ }
}
import com.intellij.psi.search.PsiSearchHelper;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlTag;
-import com.intellij.util.SmartList;
+import com.intellij.util.containers.SmartHashSet;
import com.intellij.util.xml.DomElement;
import com.intellij.util.xml.DomUtil;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.devkit.dom.ExtensionPoint;
import java.util.HashSet;
-import java.util.List;
+import java.util.Set;
public class ExtensionPointLocator {
-
private final PsiClass myPsiClass;
public ExtensionPointLocator(PsiClass psiClass) {
myPsiClass = psiClass;
}
- public List<ExtensionPointCandidate> findDirectCandidates() {
- final List<ExtensionPointCandidate> candidates = new SmartList<>();
+
+ public Set<ExtensionPointCandidate> findDirectCandidates() {
+ Set<ExtensionPointCandidate> candidates = new SmartHashSet<>();
findExtensionPointCandidates(myPsiClass, candidates);
return candidates;
}
- public List<ExtensionPointCandidate> findSuperCandidates() {
- final List<ExtensionPointCandidate> candidates = new SmartList<>();
+ public Set<ExtensionPointCandidate> findSuperCandidates() {
+ Set<ExtensionPointCandidate> candidates = new SmartHashSet<>();
findExtensionPointCandidatesInHierarchy(myPsiClass, candidates, new HashSet<>());
return candidates;
}
private static void findExtensionPointCandidatesInHierarchy(PsiClass psiClass,
- List<ExtensionPointCandidate> list,
+ Set<ExtensionPointCandidate> candidates,
HashSet<PsiClass> processed) {
for (PsiClass superClass : psiClass.getSupers()) {
- if (!processed.add(superClass) ||
- CommonClassNames.JAVA_LANG_OBJECT.equals(superClass.getQualifiedName())) {
+ if (!processed.add(superClass) || CommonClassNames.JAVA_LANG_OBJECT.equals(superClass.getQualifiedName())) {
continue;
}
- findExtensionPointCandidates(superClass, list);
- findExtensionPointCandidatesInHierarchy(superClass, list, processed);
+ findExtensionPointCandidates(superClass, candidates);
+ findExtensionPointCandidatesInHierarchy(superClass, candidates, processed);
}
}
- private static void findExtensionPointCandidates(PsiClass psiClass, final List<ExtensionPointCandidate> list) {
+ private static void findExtensionPointCandidates(PsiClass psiClass, Set<ExtensionPointCandidate> candidates) {
String name = psiClass.getQualifiedName();
if (name == null) return;
GlobalSearchScope scope = PluginRelatedLocatorsUtils.getCandidatesScope(project);
PsiSearchHelper.SERVICE.getInstance(project).processUsagesInNonJavaFiles(name, (file, startOffset, endOffset) -> {
PsiElement element = file.findElementAt(startOffset);
- processExtensionPointCandidate(element, list);
+ processExtensionPointCandidate(element, candidates);
return true;
}, scope);
}
- private static void processExtensionPointCandidate(PsiElement element, List<ExtensionPointCandidate> list) {
+ private static void processExtensionPointCandidate(PsiElement element, Set<ExtensionPointCandidate> candidates) {
XmlTag tag = PsiTreeUtil.getParentOfType(element, XmlTag.class);
if (tag == null) return;
if ("extensionPoint".equals(tag.getName())) {
String epName = getEPName(tag);
if (epName != null) {
- list.add(new ExtensionPointCandidate(SmartPointerManager.getInstance(tag.getProject()).createSmartPsiElementPointer(tag), epName));
+ candidates.add(new ExtensionPointCandidate(SmartPointerManager.getInstance(tag.getProject()).createSmartPsiElementPointer(tag), epName));
}
}
else if ("with".equals(tag.getName())) {
String epName = getEPName(extensionPointTag);
String beanClassName = extensionPointTag.getAttributeValue("beanClass");
if ((attrName == null && tagName == null) || epName == null) return;
- list.add(new ExtensionPointCandidate(SmartPointerManager.getInstance(extensionPointTag.getProject())
+ candidates.add(new ExtensionPointCandidate(SmartPointerManager.getInstance(extensionPointTag.getProject())
.createSmartPsiElementPointer(extensionPointTag), epName, attrName, tagName, beanClassName));
}
}
package org.jetbrains.idea.devkit.util;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.impl.LibraryScopeCache;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.search.GlobalSearchScopesCore;
import com.intellij.util.xml.DomService;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.devkit.dom.IdeaPlugin;
@NotNull
static GlobalSearchScope getCandidatesScope(@NotNull Project project) {
+ GlobalSearchScope scope = GlobalSearchScopesCore.projectProductionScope(project)
+ .uniteWith(LibraryScopeCache.getInstance(project).getLibrariesOnlyScope());
+
Collection<VirtualFile> candidates = DomService.getInstance()
- .getDomFileCandidates(IdeaPlugin.class, project, GlobalSearchScope.allScope(project));
- return GlobalSearchScope.filesScope(project, candidates);
+ .getDomFileCandidates(IdeaPlugin.class, project, scope);
+ return GlobalSearchScope.filesWithLibrariesScope(project, candidates, true);
}
}