package com.igormaznitsa.ideamindmap.lang.refactoring.move;
import com.igormaznitsa.ideamindmap.lang.refactoring.references.providers.PsiExtraFileReference;
import com.igormaznitsa.mindmap.model.logger.Logger;
import com.igormaznitsa.mindmap.model.logger.LoggerFactory;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler;
import com.intellij.usageView.UsageInfo;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.Processor;
import com.intellij.util.Query;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class FileMoveHandler extends MoveFileHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(FileMoveHandler.class);
@Override public boolean canProcessElement(final PsiFile element) {
return true;
}
@Override public void prepareMovedFile(PsiFile file, PsiDirectory moveDestination, Map<PsiElement, PsiElement> oldToNewMap) {
oldToNewMap.put(file, file);
}
@Nullable @Override public List<UsageInfo> findUsages(final PsiFile psiFile, final PsiDirectory newParent, final boolean searchInComments, final boolean searchInNonJavaFiles) {
Query<PsiReference> search = ReferencesSearch.search(psiFile);
final List<PsiExtraFileReference> extraFileRefs = new ArrayList<PsiExtraFileReference>();
search.forEach(new Processor<PsiReference>() {
@Override public boolean process(PsiReference psiReference) {
if (psiReference instanceof PsiExtraFileReference){
extraFileRefs.add((PsiExtraFileReference)psiReference);
}
return true;
}
});
if (extraFileRefs.isEmpty()){
return null;
}else{
final List<UsageInfo> result = new ArrayList<UsageInfo>(extraFileRefs.size());
for(final PsiExtraFileReference e : extraFileRefs){
result.add(new FileUsageInfo(e));
}
return result;
}
}
@Override public void retargetUsages(final List<UsageInfo> usageInfos, Map<PsiElement, PsiElement> oldToNewMap) {
final PsiFile newFile = (PsiFile) oldToNewMap.values().iterator().next();
for(final UsageInfo i : usageInfos){
final PsiExtraFileReference reference = ((FileUsageInfo) i).getExtraFileReference();
reference.retargetToFile(newFile);
}
}
@Override public void updateMovedFile(PsiFile file) throws IncorrectOperationException {
}
}