[groovy] honor order of classes in the scope, prepend the script file currently beiung run to the scope (IDEA-153553)

This commit is contained in:
Daniil Ovchinnikov
2016-09-14 14:25:16 +03:00
parent 4daac1c8cd
commit 91f2aea46f
2 changed files with 39 additions and 5 deletions
@@ -40,6 +40,7 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiClassUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.sun.jdi.AbsentInformationException;
import com.sun.jdi.Location;
@@ -178,7 +179,8 @@ public class GroovyPositionManager implements PositionManager {
GroovyPsiElement sourceImage = findReferenceTypeSourceImage(position);
if (sourceImage instanceof GrTypeDefinition) {
return getClassNameForJvm((GrTypeDefinition)sourceImage);
} else if (sourceImage == null) {
}
else if (sourceImage == null) {
return getScriptQualifiedName(position);
}
return null;
@@ -259,7 +261,7 @@ public class GroovyPositionManager implements PositionManager {
String runtimeName = dollar >= 0 ? originalQName.substring(0, dollar) : originalQName;
String qName = getOriginalQualifiedName(refType, runtimeName);
GlobalSearchScope searchScope = addModuleContent(myDebugProcess.getSearchScope());
GlobalSearchScope searchScope = myDebugProcess.getSearchScope();
GroovyShortNamesCache cache = GroovyShortNamesCache.getGroovyShortNamesCache(project);
try {
List<PsiClass> classes = cache.getClassesByFQName(qName, searchScope, true);
@@ -269,7 +271,12 @@ public class GroovyPositionManager implements PositionManager {
if (classes.isEmpty()) {
classes = cache.getClassesByFQName(qName, GlobalSearchScope.projectScope(project), false);
}
PsiClass clazz = classes.size() == 1 ? classes.get(0) : null;
if (classes.isEmpty()) {
classes = cache.getClassesByFQName(qName, addModuleContent(searchScope), false);
}
if (classes.isEmpty()) return null;
classes.sort(PsiClassUtil.createScopeComparator(searchScope));
PsiClass clazz = classes.get(0);
if (clazz != null) return clazz.getContainingFile();
}
catch (ProcessCanceledException e) {
@@ -405,8 +412,9 @@ public class GroovyPositionManager implements PositionManager {
}
//noinspection LoopStatementThatDoesntLoop
for (Location location : fromClass.allLineLocations()) {
final SourcePosition candidateFirstPosition = SourcePosition.createFromLine(toFind.getContainingFile(), location.lineNumber() - 1)
;
final SourcePosition candidateFirstPosition = SourcePosition.createFromLine(
toFind.getContainingFile(), location.lineNumber() - 1
);
if (toFind.equals(findReferenceTypeSourceImage(candidateFirstPosition))) {
return fromClass;
}
@@ -38,12 +38,15 @@ import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.JDOMExternalizer;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.DelegatingGlobalSearchScope;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.refactoring.listeners.RefactoringElementAdapter;
import com.intellij.refactoring.listeners.RefactoringElementListener;
import com.intellij.util.ObjectUtils;
@@ -422,4 +425,27 @@ public class GroovyScriptRunConfiguration extends ModuleBasedConfiguration<RunCo
public void setScriptPath(@Nullable String scriptPath) {
this.scriptPath = scriptPath;
}
@Override
public GlobalSearchScope getScope() {
GlobalSearchScope superScope = super.getScope();
String path = getScriptPath();
if (path == null) return superScope;
VirtualFile scriptFile = LocalFileSystem.getInstance().findFileByPath(path);
if (scriptFile == null) return superScope;
GlobalSearchScope fileScope = GlobalSearchScope.fileScope(getProject(), scriptFile);
if (superScope == null) return fileScope;
return new DelegatingGlobalSearchScope(fileScope.union(superScope)) {
@Override
public int compare(@NotNull VirtualFile file1, @NotNull VirtualFile file2) {
if (file1.equals(scriptFile)) return 1;
if (file2.equals(scriptFile)) return -1;
return super.compare(file1, file2);
}
};
}
}