mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
@@ -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;
|
||||
|
||||
+25
-15
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
+4
-2
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user