From 5e6d64976a701f9b1559573a322a87f3bb0b0004 Mon Sep 17 00:00:00 2001 From: Rustam Vishnyakov Date: Sun, 9 Jul 2017 15:44:23 +0300 Subject: [PATCH] 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 --- ...JavaLanguageCodeStyleSettingsProvider.java | 2 +- .../options/CodeStyleAbstractPanel.java | 40 ++++++++++++------- .../CustomizableLanguageCodeStylePanel.java | 6 ++- .../FormattingDocumentModelImpl.java | 4 +- 4 files changed, 33 insertions(+), 19 deletions(-) diff --git a/java/java-impl/src/com/intellij/ide/JavaLanguageCodeStyleSettingsProvider.java b/java/java-impl/src/com/intellij/ide/JavaLanguageCodeStyleSettingsProvider.java index 7e67d189bf20..29d176510f22 100644 --- a/java/java-impl/src/com/intellij/ide/JavaLanguageCodeStyleSettingsProvider.java +++ b/java/java-impl/src/com/intellij/ide/JavaLanguageCodeStyleSettingsProvider.java @@ -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; diff --git a/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java b/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java index afac36c2dc19..3b9853f15521 100644 --- a/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java @@ -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 ); } diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CustomizableLanguageCodeStylePanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CustomizableLanguageCodeStylePanel.java index d1e1d6858383..fbf5cd0ca3fa 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CustomizableLanguageCodeStylePanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CustomizableLanguageCodeStylePanel.java @@ -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); } diff --git a/platform/lang-impl/src/com/intellij/psi/formatter/FormattingDocumentModelImpl.java b/platform/lang-impl/src/com/intellij/psi/formatter/FormattingDocumentModelImpl.java index 99f7a4055148..7ec9fde1caed 100644 --- a/platform/lang-impl/src/com/intellij/psi/formatter/FormattingDocumentModelImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/formatter/FormattingDocumentModelImpl.java @@ -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;