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
VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory())
unInvalidateBuiltins(getProject()) {
unInvalidateBuiltinsAndStdLib(getProject()) {
super.tearDown()
}
@@ -40,7 +40,7 @@ public abstract class KotlinLightPlatformCodeInsightFixtureTestCase: LightPlatfo
KotlinInternalMode.enabled = kotlinInternalModeOriginalValue
VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory())
unInvalidateBuiltins(getProject()) {
unInvalidateBuiltinsAndStdLib(getProject()) {
super.tearDown()
}
}
@@ -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<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()
// 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<PsiFileImpl>().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) {
@@ -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();
@@ -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();