package jetbrains.mps.idea.core.refactoring;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.search.searches.ReferencesSearch;
import jetbrains.mps.ide.findusages.model.SearchResult;
import jetbrains.mps.ide.findusages.model.SearchResults;
import jetbrains.mps.ide.project.ProjectHelper;
import jetbrains.mps.idea.core.psi.impl.MPSPsiNode;
import jetbrains.mps.idea.core.psi.impl.MPSPsiProvider;
import jetbrains.mps.refactoring.framework.IRefactoring;
import jetbrains.mps.refactoring.framework.RefactoringContext;
import org.jetbrains.mps.openapi.model.SNode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
/**
* danilla 6/14/13
*/
public class PsiAwareRefactoring extends RefactoringWrapper {
public PsiAwareRefactoring(IRefactoring base) {
super(base);
}
@Override
public SearchResults getAffectedNodes(RefactoringContext refactoringContext) {
SearchResults<SNode> mpsResults = baseRefactoring.getAffectedNodes(refactoringContext);
Project project = ProjectHelper.toIdeaProject(refactoringContext.getSelectedProject());
List<SNode> nodes = baseRefactoring.getRefactoringTarget().allowMultipleTargets() ? refactoringContext.getSelectedNodes() : Arrays.asList(refactoringContext.getSelectedNode());
for (SNode target : nodes) {
PsiElement psiTarget = MPSPsiProvider.getInstance(project).getPsi(target);
// todo search scope?
Collection<PsiReference> psiRefs = ReferencesSearch.search(psiTarget).findAll();
// size may be bigger than needed, due to MPS usages returned among PSI usages
List<SearchResult<SNode>> psiResults = new ArrayList<SearchResult<SNode>>(psiRefs.size());
for (PsiReference ref : psiRefs) {
PsiElement element = ref.getElement();
if (element instanceof MPSPsiNode) continue;
psiResults.add(new PsiSearchResult(ref));
}
mpsResults.addAll(new SearchResults<SNode>(new HashSet<SNode>(), psiResults));
}
return mpsResults;
}
}