mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
a registry key to check stub-psi consistency in IDE after intentions
This commit is contained in:
+16
@@ -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();
|
||||
|
||||
+9
-2
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user