IDEA-152063 IntelliJ fails to use encoding from project settings for files containing breakpoints when project is opened

This commit is contained in:
Alexey Kudravtsev
2016-05-26 12:21:35 +03:00
parent f47e3cf899
commit e5f213cea5
2 changed files with 20 additions and 3 deletions
@@ -65,9 +65,7 @@ import com.intellij.psi.SingleRootFileViewProvider;
import com.intellij.testFramework.LightVirtualFile;
import com.intellij.ui.UIBundle;
import com.intellij.ui.components.JBScrollPane;
import com.intellij.util.Function;
import com.intellij.util.PairProcessor;
import com.intellij.util.ThrowableRunnable;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.messages.MessageBus;
import org.jetbrains.annotations.NotNull;
@@ -640,6 +638,7 @@ public class FileDocumentManagerImpl extends FileDocumentManager implements Virt
documentEx.setReadOnly(false);
LoadTextUtil.setCharsetWasDetectedFromBytes(file, null);
file.setBOM(null); // reset BOM in case we had one and the external change stripped it away
file.setCharset(null);
if (!isBinaryWithoutDecompiler(file)) {
documentEx.replaceText(LoadTextUtil.loadText(file), file.getModificationStamp());
documentEx.setReadOnly(!wasWritable);
@@ -33,8 +33,11 @@ import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.project.ProjectManagerAdapter;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.ModificationTracker;
import com.intellij.openapi.util.SimpleModificationTracker;
@@ -67,9 +70,15 @@ public class EncodingProjectManagerImpl extends EncodingProjectManager implement
private String myOldUTFGuessing;
private boolean myNative2AsciiForPropertiesFilesWasSpecified;
public EncodingProjectManagerImpl(Project project, EncodingManager ideEncodingManager) {
public EncodingProjectManagerImpl(Project project, EncodingManager ideEncodingManager, ProjectManager projectManager) {
myProject = project;
myIdeEncodingManager = (EncodingManagerImpl)ideEncodingManager;
projectManager.addProjectManagerListener(project, new ProjectManagerAdapter() {
@Override
public void projectOpened(Project project) {
StartupManager.getInstance(project).runWhenProjectIsInitialized(EncodingProjectManagerImpl.this::reloadAlreadyLoadedDocuments);
}
});
}
private final Map<VirtualFile, Charset> myMapping = ContainerUtil.newConcurrentMap();
@@ -146,6 +155,15 @@ public class EncodingProjectManagerImpl extends EncodingProjectManager implement
}
}
private void reloadAlreadyLoadedDocuments() {
for (VirtualFile file : myMapping.keySet()) {
Document cachedDocument = FileDocumentManager.getInstance().getCachedDocument(file);
if (cachedDocument != null) {
reload(file); // reload document in the right encoding if someone sneaky (you, BreakpointManager) managed to load the document before project opened
}
}
}
@Override
@Nullable
public Charset getEncoding(@Nullable VirtualFile virtualFile, boolean useParentDefaults) {