diff --git a/java/java-impl/src/com/intellij/spi/psi/SPIFile.java b/java/java-impl/src/com/intellij/spi/psi/SPIFile.java index 42013d5128f2..9f1e8106878a 100644 --- a/java/java-impl/src/com/intellij/spi/psi/SPIFile.java +++ b/java/java-impl/src/com/intellij/spi/psi/SPIFile.java @@ -16,11 +16,18 @@ package com.intellij.spi.psi; import com.intellij.extapi.psi.PsiFileBase; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileTypes.FileType; -import com.intellij.psi.FileViewProvider; +import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.*; +import com.intellij.psi.util.ClassUtil; import com.intellij.spi.SPIFileType; import com.intellij.lang.spi.SPILanguage; +import com.intellij.util.ArrayUtil; +import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * User: anna @@ -30,9 +37,61 @@ public class SPIFile extends PsiFileBase { super(viewProvider, SPILanguage.INSTANCE); } + @Override + public PsiReference getReference() { + return new SPIFileName2ClassReference(this, ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public PsiClass compute() { + return ClassUtil.findPsiClass(getManager(), getName(), null, true, getResolveScope()); + } + })); + } + @NotNull @Override public FileType getFileType() { return SPIFileType.INSTANCE; } + + private static class SPIFileName2ClassReference extends PsiReferenceBase { + private final PsiClass myClass; + + public SPIFileName2ClassReference(PsiFile file, PsiClass aClass) { + super(file, new TextRange(0, 0), false); + myClass = aClass; + } + + @Nullable + @Override + public PsiElement resolve() { + return myClass; + } + + @Override + public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException { + final String className = ClassUtil.getJVMClassName(myClass); + if (className != null) { + final String newFileName = className.substring(0, className.lastIndexOf(myClass.getName())) + newElementName; + return getElement().setName(newFileName); + } + return getElement(); + } + + @Override + public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException { + if (element instanceof PsiClass) { + final String className = ClassUtil.getJVMClassName((PsiClass)element); + if (className != null) { + return getElement().setName(className); + } + } + return getElement(); + } + + @NotNull + @Override + public Object[] getVariants() { + return ArrayUtil.EMPTY_OBJECT_ARRAY; + } + } } diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/SPIReferencesSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/SPIReferencesSearcher.java new file mode 100644 index 000000000000..6ffe6247d4e7 --- /dev/null +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/SPIReferencesSearcher.java @@ -0,0 +1,66 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.psi.impl.search; + +import com.intellij.lang.spi.SPILanguage; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.QueryExecutorBase; +import com.intellij.openapi.util.Computable; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiReference; +import com.intellij.psi.search.FilenameIndex; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.SearchScope; +import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.ClassUtil; +import com.intellij.util.Processor; +import org.jetbrains.annotations.NotNull; + +public class SPIReferencesSearcher extends QueryExecutorBase { + @Override + public void processQuery(@NotNull ReferencesSearch.SearchParameters p, @NotNull Processor consumer) { + final PsiElement element = p.getElementToSearch(); + if (!(element instanceof PsiClass)) { + return; + } + final SearchScope scope = p.getEffectiveSearchScope(); + if (!(scope instanceof GlobalSearchScope)) return; + final PsiClass aClass = (PsiClass)element; + final String jvmClassName = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public String compute() { + return ClassUtil.getJVMClassName(aClass); + } + }); + if (jvmClassName == null) return; + final PsiFile[] files = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public PsiFile[] compute() { + return FilenameIndex.getFilesByName(aClass.getProject(), jvmClassName, (GlobalSearchScope)scope); + } + }); + for (PsiFile file : files) { + if (file.getLanguage() == SPILanguage.INSTANCE) { + final PsiReference reference = file.getReference(); + if (reference != null) { + consumer.process(reference); + } + } + } + } +} diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 1a07be6cf983..aed44f39600a 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -243,6 +243,7 @@ +