From 99fddca673d8f287df0ee48f9d809b55fafef76c Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 4 Sep 2017 10:01:21 +0200 Subject: [PATCH] a registry key to check stub-psi consistency in IDE after intentions --- .../impl/ShowIntentionActionsHandler.java | 16 ++++++++++++++++ .../com/intellij/testFramework/PsiTestUtil.java | 8 ++++++-- .../impl/CodeInsightTestFixtureImpl.java | 11 +++++++++-- platform/util/resources/misc/registry.properties | 3 +++ 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/ShowIntentionActionsHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/ShowIntentionActionsHandler.java index c19af1371630..b41f61a8d729 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/ShowIntentionActionsHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/ShowIntentionActionsHandler.java @@ -34,17 +34,21 @@ import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.featureStatistics.FeatureUsageTrackerImpl; import com.intellij.injected.editor.EditorWindow; import com.intellij.lang.injection.InjectedLanguageManager; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.TransactionGuard; import com.intellij.openapi.application.WriteAction; +import com.intellij.openapi.application.impl.ApplicationInfoImpl; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.registry.Registry; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.stubs.StubTextInconsistencyException; import com.intellij.util.PairProcessor; import com.intellij.util.ThreeState; import org.jetbrains.annotations.NotNull; @@ -193,9 +197,21 @@ public class ShowIntentionActionsHandler implements CodeInsightActionHandler { CommandProcessor.getInstance().executeCommand(project, () -> TransactionGuard.getInstance().submitTransactionAndWait( () -> invokeIntention(action, pair.second, pair.first)), text, null); + + checkPsiTextConsistency(hostFile); + return true; } + private static void checkPsiTextConsistency(@NotNull PsiFile hostFile) { + if (Registry.is("ide.check.psi.text.consistency") || + ApplicationManager.getApplication().isUnitTestMode() && !ApplicationInfoImpl.isInStressTest()) { + if (hostFile.isValid()) { + StubTextInconsistencyException.checkStubTextConsistency(hostFile); + } + } + } + private static void invokeIntention(@NotNull IntentionAction action, @Nullable Editor editor, @NotNull PsiFile file) { PsiElement elementToMakeWritable = action.getElementToMakeWritable(file); if (elementToMakeWritable != null && !FileModificationService.getInstance().preparePsiElementsForWrite(elementToMakeWritable)) { diff --git a/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java b/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java index 328d35146c39..457b231d5737 100644 --- a/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java +++ b/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java @@ -430,11 +430,15 @@ public class PsiTestUtil { StubTextInconsistencyException.checkStubTextConsistency(file); } catch (StubTextInconsistencyException e) { - Assert.assertEquals("Re-created from text:\n" + e.getStubsFromText(), "Stubs from PSI structure:\n" + e.getStubsFromPsi()); - throw e; + compareStubTexts(e); } } + public static void compareStubTexts(@NotNull StubTextInconsistencyException e) { + Assert.assertEquals("Re-created from text:\n" + e.getStubsFromText(), "Stubs from PSI structure:\n" + e.getStubsFromPsi()); + throw e; + } + public static void checkPsiStructureWithCommit(@NotNull PsiFile psiFile, Consumer checker) { checker.accept(psiFile); Document document = psiFile.getViewProvider().getDocument(); diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java index c182ca57a248..e03a977ad2a8 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -107,6 +107,7 @@ import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.UsageSearchContext; +import com.intellij.psi.stubs.StubTextInconsistencyException; import com.intellij.psi.stubs.StubUpdatingIndex; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesProcessor; @@ -1882,8 +1883,14 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig handler.setClearReadOnlyInTests(true); AtomicBoolean result = new AtomicBoolean(); try { - ApplicationManager.getApplication().invokeLater( - () -> result.set(ShowIntentionActionsHandler.chooseActionAndInvoke(file, editor, action, actionText))); + ApplicationManager.getApplication().invokeLater(() -> { + try { + result.set(ShowIntentionActionsHandler.chooseActionAndInvoke(file, editor, action, actionText)); + } + catch (StubTextInconsistencyException e) { + PsiTestUtil.compareStubTexts(e); + } + }); UIUtil.dispatchAllInvocationEvents(); checkPsiTextConsistency(project, vFile); } diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index c84469272e65..f7213f27eecc 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -456,6 +456,9 @@ java.hierarchy.service.restartRequired=true java.use.stub.hierarchy.in.inheritor.search=false java.use.stub.hierarchy.in.inheritor.search.description=Use stub hierarchy (enabled by java.hierarchy.service key) in inheritor searches +ide.check.psi.text.consistency=false +ide.check.psi.text.consistency.description=Whether syntactic trees should be periodically checked to correspond to the text (can be expensive) + java.max.package.name.length=1000 java.max.package.name.length.description=An upper length limit on string that the IDE considers worth checking for being package names