From e4e6a600e1dfcd9b2470871a38ea7c665d42a31a Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Thu, 24 Sep 2015 01:50:44 +0300 Subject: [PATCH] Add performance hack for unInvalidate Files from stdlib in tests. --- .../JetLightCodeInsightFixtureTestCase.kt | 2 +- ...LightPlatformCodeInsightFixtureTestCase.kt | 2 +- .../jetbrains/kotlin/idea/test/testUtils.kt | 36 +++++++++++++++---- .../idea/KotlinLightQuickFixTestCase.java | 2 +- .../android/KotlinAndroidTestCaseBase.java | 2 +- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/JetLightCodeInsightFixtureTestCase.kt b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/JetLightCodeInsightFixtureTestCase.kt index 9aee8989d3c..584d8c829c7 100644 --- a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/JetLightCodeInsightFixtureTestCase.kt +++ b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/JetLightCodeInsightFixtureTestCase.kt @@ -71,7 +71,7 @@ public abstract class JetLightCodeInsightFixtureTestCase : LightCodeInsightFixtu KotlinInternalMode.enabled = kotlinInternalModeOriginalValue VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()) - unInvalidateBuiltins(getProject()) { + unInvalidateBuiltinsAndStdLib(getProject()) { super.tearDown() } diff --git a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightPlatformCodeInsightFixtureTestCase.kt b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightPlatformCodeInsightFixtureTestCase.kt index cf317c8883a..6e020dc5bc9 100644 --- a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightPlatformCodeInsightFixtureTestCase.kt +++ b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightPlatformCodeInsightFixtureTestCase.kt @@ -40,7 +40,7 @@ public abstract class KotlinLightPlatformCodeInsightFixtureTestCase: LightPlatfo KotlinInternalMode.enabled = kotlinInternalModeOriginalValue VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()) - unInvalidateBuiltins(getProject()) { + unInvalidateBuiltinsAndStdLib(getProject()) { super.tearDown() } } diff --git a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/testUtils.kt b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/testUtils.kt index eb9b7def951..e29bf801639 100644 --- a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/testUtils.kt +++ b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/testUtils.kt @@ -21,17 +21,23 @@ import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ModifiableRootModel import com.intellij.openapi.roots.ModuleRootModificationUtil.updateModel +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.PsiManager +import com.intellij.psi.impl.PsiManagerEx +import com.intellij.psi.impl.file.impl.FileManagerImpl import com.intellij.psi.impl.source.PsiFileImpl import com.intellij.testFramework.LightPlatformTestCase -import com.intellij.testFramework.LightProjectDescriptor import com.intellij.util.Consumer import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages import org.jetbrains.kotlin.idea.caches.resolve.LibraryModificationTracker import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult +import org.jetbrains.kotlin.idea.decompiler.JetClassFileViewProvider +import org.jetbrains.kotlin.idea.decompiler.JetClsFile import org.jetbrains.kotlin.idea.js.KotlinJavaScriptLibraryManager import org.jetbrains.kotlin.idea.references.BuiltInsReferenceResolver import org.jetbrains.kotlin.psi.JetFile +import java.util.* public enum class ModuleKind { KOTLIN_JVM_WITH_STDLIB_SOURCES, @@ -80,21 +86,37 @@ public fun JetFile.dumpTextWithErrors(): String { public fun closeAndDeleteProject(): Unit = ApplicationManager.getApplication().runWriteAction() { LightPlatformTestCase.closeAndDeleteProject() } -public fun unInvalidateBuiltins(project: Project, runnable: RunnableWithException) { +public fun unInvalidateBuiltinsAndStdLib(project: Project, runnable: RunnableWithException) { val builtInsSources = BuiltInsReferenceResolver.getInstance(project).builtInsSources!! + val stdLibViewProviders = HashSet() + val vFileToViewProviderMap = ((PsiManager.getInstance(project) as PsiManagerEx).fileManager as FileManagerImpl).vFileToViewProviderMap + for ((file, viewProvider) in vFileToViewProviderMap) { + if (file.isStdLibFile && viewProvider is JetClassFileViewProvider) { + stdLibViewProviders.add(viewProvider) + } + } + runnable.run() - // Base tearDown() invalidates builtins. Restore them with brute force. - for (source in builtInsSources) { + // Base tearDown() invalidates builtins and std-lib files. Restore them with brute force. + fun unInvalidateFile(file: PsiFileImpl) { val field = javaClass().getDeclaredField("myInvalidated")!! field.setAccessible(true) - field.set(source, false) + field.set(file, false) + } + + builtInsSources.forEach { unInvalidateFile(it) } + stdLibViewProviders.forEach { + it.allFiles.forEach { unInvalidateFile(it as JetClsFile) } + vFileToViewProviderMap.set(it.virtualFile, it) } } -public fun unInvalidateBuiltins(project: Project, runnable: () -> Unit) { - unInvalidateBuiltins(project, RunnableWithException { runnable() }) +private val VirtualFile.isStdLibFile: Boolean get() = presentableUrl.contains("kotlin-runtime.jar") + +public fun unInvalidateBuiltinsAndStdLib(project: Project, runnable: () -> Unit) { + unInvalidateBuiltinsAndStdLib(project, RunnableWithException { runnable() }) } public fun invalidateLibraryCache(project: Project) { diff --git a/idea/tests/org/jetbrains/kotlin/idea/KotlinLightQuickFixTestCase.java b/idea/tests/org/jetbrains/kotlin/idea/KotlinLightQuickFixTestCase.java index 78a43c9d9b6..b498dbdf6a2 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/KotlinLightQuickFixTestCase.java +++ b/idea/tests/org/jetbrains/kotlin/idea/KotlinLightQuickFixTestCase.java @@ -35,7 +35,7 @@ abstract public class KotlinLightQuickFixTestCase extends LightQuickFixTestCase protected void tearDown() throws Exception { VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()); - TestPackage.unInvalidateBuiltins(getProject(), new RunnableWithException() { + TestPackage.unInvalidateBuiltinsAndStdLib(getProject(), new RunnableWithException() { @Override public void run() throws Exception { KotlinLightQuickFixTestCase.super.tearDown(); diff --git a/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCaseBase.java b/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCaseBase.java index 4e7eb4885ef..c5f96311ee2 100644 --- a/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCaseBase.java +++ b/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCaseBase.java @@ -72,7 +72,7 @@ public abstract class KotlinAndroidTestCaseBase extends UsefulTestCase { @Override protected void tearDown() throws Exception { - TestPackage.unInvalidateBuiltins(getProject(), new RunnableWithException() { + TestPackage.unInvalidateBuiltinsAndStdLib(getProject(), new RunnableWithException() { @Override public void run() throws Exception { KotlinAndroidTestCaseBase.super.tearDown();