a registry key to check stub-psi consistency in IDE after intentions

This commit is contained in:
peter
2017-09-04 10:01:21 +02:00
parent c79517b493
commit 99fddca673
4 changed files with 34 additions and 4 deletions
@@ -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)) {
@@ -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<PsiFile> checker) {
checker.accept(psiFile);
Document document = psiFile.getViewProvider().getDocument();
@@ -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);
}
@@ -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