Add performance hack for unInvalidate Files from stdlib in tests.

This commit is contained in:
Stanislav Erokhin
2015-09-24 01:50:44 +03:00
parent 9cc6d1cf58
commit e4e6a600e1
5 changed files with 33 additions and 11 deletions
@@ -71,7 +71,7 @@ public abstract class JetLightCodeInsightFixtureTestCase : LightCodeInsightFixtu
KotlinInternalMode.enabled = kotlinInternalModeOriginalValue KotlinInternalMode.enabled = kotlinInternalModeOriginalValue
VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()) VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory())
unInvalidateBuiltins(getProject()) { unInvalidateBuiltinsAndStdLib(getProject()) {
super.tearDown() super.tearDown()
} }
@@ -40,7 +40,7 @@ public abstract class KotlinLightPlatformCodeInsightFixtureTestCase: LightPlatfo
KotlinInternalMode.enabled = kotlinInternalModeOriginalValue KotlinInternalMode.enabled = kotlinInternalModeOriginalValue
VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()) VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory())
unInvalidateBuiltins(getProject()) { unInvalidateBuiltinsAndStdLib(getProject()) {
super.tearDown() super.tearDown()
} }
} }
@@ -21,17 +21,23 @@ import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ModifiableRootModel import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.openapi.roots.ModuleRootModificationUtil.updateModel 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.psi.impl.source.PsiFileImpl
import com.intellij.testFramework.LightPlatformTestCase import com.intellij.testFramework.LightPlatformTestCase
import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.util.Consumer import com.intellij.util.Consumer
import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.diagnostics.Severity
import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages
import org.jetbrains.kotlin.idea.caches.resolve.LibraryModificationTracker import org.jetbrains.kotlin.idea.caches.resolve.LibraryModificationTracker
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult 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.js.KotlinJavaScriptLibraryManager
import org.jetbrains.kotlin.idea.references.BuiltInsReferenceResolver import org.jetbrains.kotlin.idea.references.BuiltInsReferenceResolver
import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetFile
import java.util.*
public enum class ModuleKind { public enum class ModuleKind {
KOTLIN_JVM_WITH_STDLIB_SOURCES, KOTLIN_JVM_WITH_STDLIB_SOURCES,
@@ -80,21 +86,37 @@ public fun JetFile.dumpTextWithErrors(): String {
public fun closeAndDeleteProject(): Unit = public fun closeAndDeleteProject(): Unit =
ApplicationManager.getApplication().runWriteAction() { LightPlatformTestCase.closeAndDeleteProject() } 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 builtInsSources = BuiltInsReferenceResolver.getInstance(project).builtInsSources!!
val stdLibViewProviders = HashSet<JetClassFileViewProvider>()
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() runnable.run()
// Base tearDown() invalidates builtins. Restore them with brute force. // Base tearDown() invalidates builtins and std-lib files. Restore them with brute force.
for (source in builtInsSources) { fun unInvalidateFile(file: PsiFileImpl) {
val field = javaClass<PsiFileImpl>().getDeclaredField("myInvalidated")!! val field = javaClass<PsiFileImpl>().getDeclaredField("myInvalidated")!!
field.setAccessible(true) 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) { private val VirtualFile.isStdLibFile: Boolean get() = presentableUrl.contains("kotlin-runtime.jar")
unInvalidateBuiltins(project, RunnableWithException { runnable() })
public fun unInvalidateBuiltinsAndStdLib(project: Project, runnable: () -> Unit) {
unInvalidateBuiltinsAndStdLib(project, RunnableWithException { runnable() })
} }
public fun invalidateLibraryCache(project: Project) { public fun invalidateLibraryCache(project: Project) {
@@ -35,7 +35,7 @@ abstract public class KotlinLightQuickFixTestCase extends LightQuickFixTestCase
protected void tearDown() throws Exception { protected void tearDown() throws Exception {
VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()); VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory());
TestPackage.unInvalidateBuiltins(getProject(), new RunnableWithException() { TestPackage.unInvalidateBuiltinsAndStdLib(getProject(), new RunnableWithException() {
@Override @Override
public void run() throws Exception { public void run() throws Exception {
KotlinLightQuickFixTestCase.super.tearDown(); KotlinLightQuickFixTestCase.super.tearDown();
@@ -72,7 +72,7 @@ public abstract class KotlinAndroidTestCaseBase extends UsefulTestCase {
@Override @Override
protected void tearDown() throws Exception { protected void tearDown() throws Exception {
TestPackage.unInvalidateBuiltins(getProject(), new RunnableWithException() { TestPackage.unInvalidateBuiltinsAndStdLib(getProject(), new RunnableWithException() {
@Override @Override
public void run() throws Exception { public void run() throws Exception {
KotlinAndroidTestCaseBase.super.tearDown(); KotlinAndroidTestCaseBase.super.tearDown();