From 056f8716e1693af39dd6cc8d3cfacd8fb8fc3c93 Mon Sep 17 00:00:00 2001 From: Piotr Tomiak Date: Tue, 17 Sep 2024 10:39:13 +0200 Subject: [PATCH] WebTestUtil: call getPsiFile within a read action. GitOrigin-RevId: d88b6b595ab5401fb89296ccaed27d3dc00c616d --- .../com/intellij/webSymbols/WebTestUtil.kt | 62 ++++++++++++------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/platform/webSymbols/testSrc/com/intellij/webSymbols/WebTestUtil.kt b/platform/webSymbols/testSrc/com/intellij/webSymbols/WebTestUtil.kt index fc1c72b02f2b..41f165bff0c8 100644 --- a/platform/webSymbols/testSrc/com/intellij/webSymbols/WebTestUtil.kt +++ b/platform/webSymbols/testSrc/com/intellij/webSymbols/WebTestUtil.kt @@ -7,6 +7,7 @@ import com.intellij.codeInsight.CodeInsightSettings import com.intellij.codeInsight.completion.PrioritizedLookupElement import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInsight.navigation.actions.GotoDeclarationOrUsageHandler2 +import com.intellij.codeInsight.navigation.actions.GotoDeclarationOrUsageHandler2.Companion.testGTDUOutcome import com.intellij.find.usages.api.SearchTarget import com.intellij.find.usages.api.UsageOptions import com.intellij.find.usages.impl.AllSearchOptions @@ -17,6 +18,7 @@ import com.intellij.lang.documentation.ide.IdeDocumentationTargetProvider import com.intellij.lang.injection.InjectedLanguageManager import com.intellij.model.psi.PsiSymbolReference import com.intellij.model.psi.impl.referencesAt +import com.intellij.openapi.application.ReadAction import com.intellij.openapi.application.WriteAction import com.intellij.openapi.command.CommandProcessor import com.intellij.openapi.diagnostic.Logger @@ -45,6 +47,7 @@ import com.intellij.testFramework.fixtures.CodeInsightTestFixture import com.intellij.testFramework.fixtures.TestLookupElementPresentation import com.intellij.usages.Usage import com.intellij.util.ObjectUtils.coalesce +import com.intellij.util.concurrency.AppExecutorUtil import com.intellij.util.concurrency.annotations.RequiresEdt import com.intellij.webSymbols.declarations.WebSymbolDeclaration import com.intellij.webSymbols.declarations.WebSymbolDeclarationProvider @@ -54,6 +57,7 @@ import com.intellij.webSymbols.query.WebSymbolsQueryExecutorFactory import junit.framework.TestCase.* import org.junit.Assert import java.io.File +import java.util.concurrent.Callable import kotlin.math.max import kotlin.math.min @@ -162,12 +166,14 @@ data class LookupElementInfo( val isItemTextUnderline: Boolean, val isTypeGreyed: Boolean, ) { - fun render(renderPriority: Boolean, - renderTypeText: Boolean, - renderTailText: Boolean, - renderProximity: Boolean, - renderDisplayText: Boolean, - renderDisplayEffects: Boolean): String { + fun render( + renderPriority: Boolean, + renderTypeText: Boolean, + renderTailText: Boolean, + renderProximity: Boolean, + renderDisplayText: Boolean, + renderDisplayEffects: Boolean, + ): String { val result = StringBuilder() result.append(lookupString) if (renderPriority || renderTypeText || renderTailText || renderProximity || renderDisplayText || renderDisplayEffects) { @@ -224,9 +230,11 @@ data class LookupElementInfo( } } -private fun CodeInsightTestFixture.checkDocumentation(actualDocumentation: String?, - fileSuffix: String = ".expected", - directory: String = "") { +private fun CodeInsightTestFixture.checkDocumentation( + actualDocumentation: String?, + fileSuffix: String = ".expected", + directory: String = "", +) { assertNotNull("No documentation rendered", actualDocumentation) val expectedFile = InjectedLanguageManager.getInstance(project).getTopLevelFile(file) .virtualFile.nameWithoutExtension + fileSuffix + ".html" @@ -258,13 +266,15 @@ infix fun ((item: LookupElementInfo) -> Boolean).and(other: (item: LookupElement } @JvmOverloads -fun CodeInsightTestFixture.renderLookupItems(renderPriority: Boolean, - renderTypeText: Boolean, - renderTailText: Boolean = false, - renderProximity: Boolean = false, - renderDisplayText: Boolean = false, - renderDisplayEffects: Boolean = renderPriority, - lookupFilter: (item: LookupElementInfo) -> Boolean = { true }): List = +fun CodeInsightTestFixture.renderLookupItems( + renderPriority: Boolean, + renderTypeText: Boolean, + renderTailText: Boolean = false, + renderProximity: Boolean = false, + renderDisplayText: Boolean = false, + renderDisplayEffects: Boolean = renderPriority, + lookupFilter: (item: LookupElementInfo) -> Boolean = { true }, +): List = lookupElements?.asSequence() ?.map { val presentation = TestLookupElementPresentation.renderReal(it) @@ -483,8 +493,14 @@ fun CodeInsightTestFixture.checkGTDUOutcome(expectedOutcome: GotoDeclarationOrUs val actualSignature = signature ?: editor.currentPositionSignature val editor = InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(editor, file) val offset = editor.caretModel.offset - val file = PsiDocumentManager.getInstance(project).getPsiFile(editor.document) ?: file - val gtduOutcome = GotoDeclarationOrUsageHandler2.testGTDUOutcomeInNonBlockingReadAction(editor, file, offset) + + val gtduOutcome = ReadAction + .nonBlocking(Callable { + val file = PsiDocumentManager.getInstance(project).getPsiFile(editor.document) ?: file + testGTDUOutcome(editor, file, offset) + }) + .submit(AppExecutorUtil.getAppExecutorService()) + .get() Assert.assertEquals(actualSignature, expectedOutcome, gtduOutcome) @@ -578,10 +594,12 @@ fun CodeInsightTestFixture.renameWebSymbol(newName: String) { } -fun doCompletionItemsTest(fixture: CodeInsightTestFixture, - fileName: String, - goldFileWithExtension: Boolean = false, - renderDisplayText: Boolean = false) { +fun doCompletionItemsTest( + fixture: CodeInsightTestFixture, + fileName: String, + goldFileWithExtension: Boolean = false, + renderDisplayText: Boolean = false, +) { val fileNameNoExt = FileUtil.getNameWithoutExtension(fileName) fixture.configureByFile(fileName) WriteAction.runAndWait { WebSymbolsQueryExecutorFactory.getInstance(fixture.project) }