Create non-physical preview PSI files with event system disabled

IDEA-168994 Throwable at com.intellij.psi.impl.source.text.BlockSupportImpl.sendBeforeChildrenChangeEvent on navigating through Code Style settings
This commit is contained in:
Rustam Vishnyakov
2017-07-09 15:52:10 +03:00
parent bdf655cefe
commit 5e6d64976a
4 changed files with 33 additions and 19 deletions
@@ -190,7 +190,7 @@ public class JavaLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSett
@Override
public PsiFile createFileFromText(final Project project, final String text) {
final PsiFile file = PsiFileFactory.getInstance(project).createFileFromText(
"sample.java", StdFileTypes.JAVA, text, LocalTimeCounter.currentTime(), true, false
"sample.java", StdFileTypes.JAVA, text, LocalTimeCounter.currentTime(), false, false
);
file.putUserData(PsiUtil.FILE_LANGUAGE_LEVEL_KEY, LanguageLevel.HIGHEST);
return file;
@@ -29,6 +29,7 @@ import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.editor.ex.util.EditorUtil;
import com.intellij.openapi.editor.highlighter.EditorHighlighter;
import com.intellij.openapi.editor.impl.DocumentImpl;
import com.intellij.openapi.editor.markup.*;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.options.ConfigurationException;
@@ -88,6 +89,7 @@ public abstract class CodeStyleAbstractPanel implements Disposable {
private boolean myShowsPreviewHighlighters;
private final CodeStyleSettings myCurrentSettings;
private final Language myDefaultLanguage;
private Document myDocumentBeforeChanges;
protected CodeStyleAbstractPanel(@NotNull CodeStyleSettings settings) {
this(null, null, settings);
@@ -259,23 +261,31 @@ public abstract class CodeStyleAbstractPanel implements Disposable {
private Document collectChangesBeforeCurrentSettingsAppliance(Project project) {
PsiFile psiFile = createFileFromText(project, myTextToReformat);
prepareForReformat(psiFile);
CodeStyleSettings clone = mySettings.clone();
clone.setRightMargin(getDefaultLanguage(), getAdjustedRightMargin());
CodeStyleSettingsManager.getInstance(project).setTemporarySettings(clone);
try {
CodeStyleManager.getInstance(project).reformat(psiFile);
}
finally {
CodeStyleSettingsManager.getInstance(project).dropTemporarySettings();
}
return getDocumentBeforeChanges(project, psiFile);
}
private Document getDocumentBeforeChanges(@NotNull Project project, @NotNull PsiFile file) {
PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project);
if (documentManager != null) {
Document document = documentManager.getDocument(psiFile);
if (document != null) {
CodeStyleSettings clone = mySettings.clone();
clone.setRightMargin(getDefaultLanguage(), getAdjustedRightMargin());
CodeStyleSettingsManager.getInstance(project).setTemporarySettings(clone);
try {
CodeStyleManager.getInstance(project).reformat(psiFile);
}
finally {
CodeStyleSettingsManager.getInstance(project).dropTemporarySettings();
}
return document;
}
Document document = documentManager.getDocument(file);
if (document != null) return document;
}
return null;
if (myDocumentBeforeChanges == null) {
myDocumentBeforeChanges = new DocumentImpl(file.getText());
}
else {
myDocumentBeforeChanges.replaceString(0, myDocumentBeforeChanges.getTextLength(), file.getText());
}
return myDocumentBeforeChanges;
}
protected void prepareForReformat(PsiFile psiFile) {
@@ -287,7 +297,7 @@ public abstract class CodeStyleAbstractPanel implements Disposable {
protected PsiFile createFileFromText(Project project, String text) {
return PsiFileFactory.getInstance(project).createFileFromText(
"a." + getFileExt(), getFileType(), text, LocalTimeCounter.currentTime(), true
"a." + getFileExt(), getFileType(), text, LocalTimeCounter.currentTime(), false
);
}
@@ -131,8 +131,10 @@ public abstract class CustomizableLanguageCodeStylePanel extends CodeStyleAbstra
final PsiDocumentManager manager = PsiDocumentManager.getInstance(project);
final Document doc = manager.getDocument(psiFile);
CommandProcessor.getInstance().executeCommand(project, () -> ApplicationManager.getApplication().runWriteAction(() -> {
doc.replaceString(0, doc.getTextLength(), text);
manager.commitDocument(doc);
if (doc != null) {
doc.replaceString(0, doc.getTextLength(), text);
manager.commitDocument(doc);
}
try {
CodeStyleManager.getInstance(project).reformat(psiFile);
}
@@ -80,7 +80,9 @@ public class FormattingDocumentModelImpl implements FormattingDocumentModel {
public static Document getDocumentToBeUsedFor(final PsiFile file) {
final Project project = file.getProject();
final Document document = PsiDocumentManager.getInstance(project).getDocument(file);
if (document == null) return null;
if (document == null) {
return file.getViewProvider().getDocument();
};
if (PsiDocumentManager.getInstance(project).isUncommited(document)) return null;
PsiToDocumentSynchronizer synchronizer = ((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(project)).getSynchronizer();
if (synchronizer.isDocumentAffectedByTransactions(document)) return null;