diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/FileReferenceContextUtil.java b/platform/lang-impl/src/com/intellij/refactoring/move/FileReferenceContextUtil.java index aff1cd9729fc..dcef9296759c 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/FileReferenceContextUtil.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/FileReferenceContextUtil.java @@ -18,10 +18,14 @@ package com.intellij.refactoring.move; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReference; import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceOwner; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.HashMap; + +import java.util.Map; public class FileReferenceContextUtil { private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.move.FileReferenceContextUtil"); @@ -30,7 +34,8 @@ public class FileReferenceContextUtil { private FileReferenceContextUtil() { } - public static void encodeFileReferences(PsiElement element) { + public static Map encodeFileReferences(PsiElement element) { + final Map map = new HashMap(); element.accept(new PsiRecursiveElementWalkingVisitor(true) { @Override public void visitElement(PsiElement element) { final PsiReference[] refs = element.getReferences(); @@ -40,7 +45,9 @@ public class FileReferenceContextUtil { final ResolveResult[] results = ref.multiResolve(false); for (ResolveResult result : results) { if (result.getElement() instanceof PsiFileSystemItem) { - element.putCopyableUserData(REF_FILE_SYSTEM_ITEM_KEY, (PsiFileSystemItem)result.getElement()); + PsiFileSystemItem fileSystemItem = (PsiFileSystemItem)result.getElement(); + element.putCopyableUserData(REF_FILE_SYSTEM_ITEM_KEY, fileSystemItem); + map.put(element.getText(), fileSystemItem); break; } } @@ -49,6 +56,7 @@ public class FileReferenceContextUtil { super.visitElement(element); } }); + return map; } public static void decodeFileReferences(PsiElement element) { @@ -56,24 +64,43 @@ public class FileReferenceContextUtil { @Override public void visitElement(PsiElement element) { final PsiFileSystemItem item = element.getCopyableUserData(REF_FILE_SYSTEM_ITEM_KEY); element.putCopyableUserData(REF_FILE_SYSTEM_ITEM_KEY, null); - if (item != null && item.isValid()) { - PsiReference[] refs = element.getReferences(); - if (refs.length > 0 && refs[0] instanceof FileReferenceOwner) { - final FileReference ref = ((FileReferenceOwner)refs[0]).getLastFileReference(); - if (ref != null) { - try { - element = ref.bindToElement(item); - } - catch (IncorrectOperationException e) { - LOG.error(e); - } - } - } - } + element = bindElement(element, item); if (element != null) { element.acceptChildren(this); } } }); } + + public static void decodeFileReferences(PsiElement element, final Map map, final TextRange range) { + element.accept(new PsiRecursiveElementVisitor(true) { + @Override public void visitElement(PsiElement element) { + if (!range.intersects(element.getTextRange())) return; + String text = element.getText(); + PsiFileSystemItem item = map.get(text); + element = bindElement(element, item); + if (element != null) { + element.acceptChildren(this); + } + } + }); + } + + private static PsiElement bindElement(PsiElement element, PsiFileSystemItem item) { + if (item != null && item.isValid()) { + PsiReference[] refs = element.getReferences(); + if (refs.length > 0 && refs[0] instanceof FileReferenceOwner) { + final FileReference ref = ((FileReferenceOwner)refs[0]).getLastFileReference(); + if (ref != null) { + try { + element = ref.bindToElement(item); + } + catch (IncorrectOperationException e) { + LOG.error(e); + } + } + } + } + return element; + } }