diff --git a/java/java-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java b/java/java-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java index 5a0878ca003d..14c300586ff6 100644 --- a/java/java-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java +++ b/java/java-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java @@ -838,13 +838,22 @@ public class PsiClassImplUtil { return true; } - final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(aClass.getProject()).getFileIndex(); final PsiFile file1 = aClass.getContainingFile().getOriginalFile(); final PsiFile file2 = another.getContainingFile().getOriginalFile(); if (file1.equals(file2)) { return true; } + //see com.intellij.openapi.vcs.changes.PsiChangeTracker + //see com.intellij.psi.impl.PsiFileFactoryImpl#createFileFromText(CharSequence,PsiFile) + final PsiFile original1 = file1.getUserData(PsiFileFactory.ORIGINAL_FILE); + final PsiFile original2 = file2.getUserData(PsiFileFactory.ORIGINAL_FILE); + if ((original1 == original2 && original1 != null) + || original1 == file2 || original2 == file1) { + return true; + } + + final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(aClass.getProject()).getFileIndex(); final VirtualFile vfile1 = file1.getViewProvider().getVirtualFile(); final VirtualFile vfile2 = file2.getViewProvider().getVirtualFile(); if ((fileIndex.isInSource(vfile1) || fileIndex.isInLibraryClasses(vfile1)) && diff --git a/platform/lang-api/src/com/intellij/psi/PsiFileFactory.java b/platform/lang-api/src/com/intellij/psi/PsiFileFactory.java index 06a42cc92bf6..63e8be5c4251 100644 --- a/platform/lang-api/src/com/intellij/psi/PsiFileFactory.java +++ b/platform/lang-api/src/com/intellij/psi/PsiFileFactory.java @@ -7,10 +7,13 @@ import com.intellij.lang.Language; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Key; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public abstract class PsiFileFactory { + public static Key ORIGINAL_FILE = Key.create("ORIGINAL_FILE"); public static PsiFileFactory getInstance(Project project) { return ServiceManager.getService(project, PsiFileFactory.class); } @@ -43,4 +46,7 @@ public abstract class PsiFileFactory { boolean physical, boolean markAsCopy); public abstract PsiFile createFileFromText(FileType fileType, String fileName, CharSequence chars, int startOffset, int endOffset); + + @Nullable + public abstract PsiFile createFileFromText(@NotNull CharSequence chars, @NotNull PsiFile original); } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/openapi/vcs/changes/PsiChangeTracker.java b/platform/lang-impl/src/com/intellij/openapi/vcs/changes/PsiChangeTracker.java index 9679c61814e0..7613f3239473 100644 --- a/platform/lang-impl/src/com/intellij/openapi/vcs/changes/PsiChangeTracker.java +++ b/platform/lang-impl/src/com/intellij/openapi/vcs/changes/PsiChangeTracker.java @@ -39,9 +39,7 @@ public class PsiChangeTracker { final List elements = new ArrayList(); final List oldElements = new ArrayList(); final PsiFile oldFile = oldText == null - ? null - : PsiFileFactory.getInstance(project) - .createFileFromText(file.getName(), file.getLanguage(), oldText, false, true); + ? null : PsiFileFactory.getInstance(project).createFileFromText(oldText, file); file.accept(new MyVisitor(filter, elements)); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/PsiFileFactoryImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/PsiFileFactoryImpl.java index 5ff90fe67b55..62b481a28b1d 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/PsiFileFactoryImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/PsiFileFactoryImpl.java @@ -141,4 +141,13 @@ public class PsiFileFactoryImpl extends PsiFileFactory { return createFileFromText(fileName, fileType, text); } + @Nullable + @Override + public PsiFile createFileFromText(@NotNull CharSequence chars, @NotNull PsiFile original) { + final PsiFile file = createFileFromText(original.getName(), original.getLanguage(), chars, false, true); + if (file != null) { + file.putUserData(ORIGINAL_FILE, original); + } + return file; + } }