From 94db320f7a76765ae909528f022d765abfe9a1eb Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 1 Jun 2015 19:08:36 +0300 Subject: [PATCH] Update hack for restore validity of builtins files --- .../JetLightCodeInsightFixtureTestCase.kt | 13 ++---- ...LightPlatformCodeInsightFixtureTestCase.kt | 46 +++++++++++++++++++ .../idea/test/RunnableWithException.java | 21 +++++++++ .../jetbrains/kotlin/idea/test/testUtils.kt | 22 ++++++++- .../idea/KotlinLightQuickFixTestCase.java | 10 +++- .../idea/quickfix/AbstractQuickFixTest.java | 15 ------ .../resolve/AbstractReferenceResolveTest.java | 42 +++-------------- .../android-idea-plugin.iml | 1 + .../kotlin/android/KotlinAndroidTestCase.java | 31 ++----------- .../android/KotlinAndroidTestCaseBase.java | 26 ++++++----- 10 files changed, 126 insertions(+), 101 deletions(-) create mode 100644 idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightPlatformCodeInsightFixtureTestCase.kt create mode 100644 idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/RunnableWithException.java 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 74e68f78e8f..b631bf19395 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 @@ -28,6 +28,7 @@ import com.intellij.psi.FileViewProvider import com.intellij.psi.PsiManager import com.intellij.psi.impl.PsiManagerEx import com.intellij.psi.impl.file.impl.FileManager +import com.intellij.psi.impl.source.PsiFileImpl import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.actions.internal.KotlinInternalMode @@ -57,16 +58,8 @@ public abstract class JetLightCodeInsightFixtureTestCase : LightCodeInsightFixtu KotlinInternalMode.enabled = kotlinInternalModeOriginalValue VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()) - val builtInsSources = getProject().getComponent(javaClass()).getBuiltInsSources() - val fileManager = (PsiManager.getInstance(getProject()) as PsiManagerEx).getFileManager() - - super.tearDown() - - // Restore mapping between PsiFiles and VirtualFiles dropped in FileManager.cleanupForNextTest(), - // otherwise built-ins psi elements will become invalid in next test. - for (source in builtInsSources) { - val provider = source.getViewProvider() - fileManager.setViewProvider(provider.getVirtualFile(), provider) + unInvalidateBuiltins(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 new file mode 100644 index 00000000000..b2f7a5c5326 --- /dev/null +++ b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightPlatformCodeInsightFixtureTestCase.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.test + +import com.intellij.ide.startup.impl.StartupManagerImpl +import com.intellij.openapi.startup.StartupManager +import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess +import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase +import org.jetbrains.kotlin.idea.actions.internal.KotlinInternalMode +import org.jetbrains.kotlin.test.JetTestUtils + +public abstract class KotlinLightPlatformCodeInsightFixtureTestCase: LightPlatformCodeInsightFixtureTestCase() { + private var kotlinInternalModeOriginalValue: Boolean = false + + override fun setUp() { + super.setUp() + (StartupManager.getInstance(getProject()) as StartupManagerImpl).runPostStartupActivities() + VfsRootAccess.allowRootAccess(JetTestUtils.getHomeDirectory()) + + kotlinInternalModeOriginalValue = KotlinInternalMode.enabled + KotlinInternalMode.enabled = true + } + + override fun tearDown() { + KotlinInternalMode.enabled = kotlinInternalModeOriginalValue + VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()) + + unInvalidateBuiltins(getProject()) { + super.tearDown() + } + } +} \ No newline at end of file diff --git a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/RunnableWithException.java b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/RunnableWithException.java new file mode 100644 index 00000000000..3e76be0db39 --- /dev/null +++ b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/RunnableWithException.java @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.test; + +public interface RunnableWithException { + void run() throws Exception; +} 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 d7925ad0cad..f2ceee92f56 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 @@ -18,8 +18,10 @@ package org.jetbrains.kotlin.idea.test import com.intellij.openapi.application.ApplicationManager 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.psi.impl.source.PsiFileImpl import com.intellij.testFramework.LightPlatformTestCase import com.intellij.testFramework.LightProjectDescriptor import com.intellij.util.Consumer @@ -27,8 +29,7 @@ import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult import org.jetbrains.kotlin.idea.js.KotlinJavaScriptLibraryManager -import org.jetbrains.kotlin.idea.test.KotlinStdJSProjectDescriptor -import org.jetbrains.kotlin.idea.test.ProjectDescriptorWithStdlibSources +import org.jetbrains.kotlin.idea.references.BuiltInsReferenceResolver import org.jetbrains.kotlin.psi.JetFile public enum class ModuleKind { @@ -74,3 +75,20 @@ public fun JetFile.dumpTextWithErrors(): String { public fun closeAndDeleteProject(): Unit = ApplicationManager.getApplication().runWriteAction() { LightPlatformTestCase.closeAndDeleteProject() } +public fun unInvalidateBuiltins(project: Project, runnable: RunnableWithException) { + val builtInsSources = project.getComponent(javaClass()).getBuiltInsSources() + + runnable.run() + + // Base tearDown() invalidates builtins. Restore them with brute force. + for (source in builtInsSources) { + val psiFileImpl = source as PsiFileImpl + val field = javaClass().getDeclaredField("myInvalidated")!! + field.setAccessible(true) + field.set(psiFileImpl, false) + } +} + +public fun unInvalidateBuiltins(project: Project, runnable: () -> Unit) { + unInvalidateBuiltins(project, RunnableWithException { runnable() }) +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/KotlinLightQuickFixTestCase.java b/idea/tests/org/jetbrains/kotlin/idea/KotlinLightQuickFixTestCase.java index fcc8054276d..84eb9a615f6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/KotlinLightQuickFixTestCase.java +++ b/idea/tests/org/jetbrains/kotlin/idea/KotlinLightQuickFixTestCase.java @@ -18,6 +18,8 @@ package org.jetbrains.kotlin.idea; import com.intellij.codeInsight.daemon.quickFix.LightQuickFixTestCase; import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; +import org.jetbrains.kotlin.idea.test.RunnableWithException; +import org.jetbrains.kotlin.idea.test.TestPackage; import org.jetbrains.kotlin.test.JetTestUtils; abstract public class KotlinLightQuickFixTestCase extends LightQuickFixTestCase { @@ -30,6 +32,12 @@ abstract public class KotlinLightQuickFixTestCase extends LightQuickFixTestCase @Override protected void tearDown() throws Exception { VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()); - super.tearDown(); + + TestPackage.unInvalidateBuiltins(getProject(), new RunnableWithException() { + @Override + public void run() throws Exception { + KotlinLightQuickFixTestCase.super.tearDown(); + } + }); } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixTest.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixTest.java index ab09af4f8a9..520945f8ea2 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixTest.java @@ -69,21 +69,6 @@ public abstract class AbstractQuickFixTest extends KotlinLightQuickFixTestCase { ((StartupManagerImpl) StartupManager.getInstance(getProject())).runPostStartupActivities(); } - @Override - protected void tearDown() throws Exception { - Set builtInsSources = getProject().getComponent(BuiltInsReferenceResolver.class).getBuiltInsSources(); - FileManager fileManager = ((PsiManagerEx) PsiManager.getInstance(getProject())).getFileManager(); - - super.tearDown(); - - // Restore mapping between PsiFiles and VirtualFiles dropped in FileManager.cleanupForNextTest(), - // otherwise built-ins psi elements will become invalid in next test. - for (JetFile source : builtInsSources) { - FileViewProvider provider = source.getViewProvider(); - fileManager.setViewProvider(provider.getVirtualFile(), provider); - } - } - @Nullable private static File findInspectionFile(@NotNull File startDir) { File currentDir = startDir; diff --git a/idea/tests/org/jetbrains/kotlin/idea/resolve/AbstractReferenceResolveTest.java b/idea/tests/org/jetbrains/kotlin/idea/resolve/AbstractReferenceResolveTest.java index 5416727fb19..811a2fd490a 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/resolve/AbstractReferenceResolveTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/resolve/AbstractReferenceResolveTest.java @@ -18,29 +18,23 @@ package org.jetbrains.kotlin.idea.resolve; import com.google.common.collect.Lists; import com.google.common.collect.Ordering; -import com.intellij.ide.startup.impl.StartupManagerImpl; -import com.intellij.openapi.startup.StartupManager; -import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; -import com.intellij.psi.*; -import com.intellij.psi.impl.PsiManagerEx; -import com.intellij.psi.impl.file.impl.FileManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiPolyVariantReference; +import com.intellij.psi.PsiReference; +import com.intellij.psi.ResolveResult; import com.intellij.testFramework.LightProjectDescriptor; -import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.idea.test.JetWithJdkAndRuntimeLightProjectDescriptor; -import org.jetbrains.kotlin.idea.references.BuiltInsReferenceResolver; -import org.jetbrains.kotlin.psi.JetFile; +import org.jetbrains.kotlin.idea.test.KotlinLightPlatformCodeInsightFixtureTestCase; import org.jetbrains.kotlin.test.InTextDirectivesUtils; -import org.jetbrains.kotlin.test.JetTestUtils; import org.jetbrains.kotlin.test.ReferenceUtils; import org.jetbrains.kotlin.test.util.UtilPackage; import org.junit.Assert; import java.util.List; -import java.util.Set; -public abstract class AbstractReferenceResolveTest extends LightPlatformCodeInsightFixtureTestCase { +public abstract class AbstractReferenceResolveTest extends KotlinLightPlatformCodeInsightFixtureTestCase { public static class ExpectedResolveData { private final Boolean shouldBeUnresolved; private final String referenceToString; @@ -62,30 +56,6 @@ public abstract class AbstractReferenceResolveTest extends LightPlatformCodeInsi public static final String MULTIRESOLVE = "MULTIRESOLVE"; public static final String REF_EMPTY = "REF_EMPTY"; - @Override - protected void setUp() throws Exception { - super.setUp(); - ((StartupManagerImpl) StartupManager.getInstance(getProject())).runPostStartupActivities(); - VfsRootAccess.allowRootAccess(JetTestUtils.getHomeDirectory()); - } - - @Override - protected void tearDown() throws Exception { - VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()); - - Set builtInsSources = getProject().getComponent(BuiltInsReferenceResolver.class).getBuiltInsSources(); - FileManager fileManager = ((PsiManagerEx) PsiManager.getInstance(getProject())).getFileManager(); - - super.tearDown(); - - // Restore mapping between PsiFiles and VirtualFiles dropped in FileManager.cleanupForNextTest(), - // otherwise built-ins psi elements will become invalid in next test. - for (JetFile source : builtInsSources) { - FileViewProvider provider = source.getViewProvider(); - fileManager.setViewProvider(provider.getVirtualFile(), provider); - } - } - protected void doTest(@NotNull String path) { assert path.endsWith(".kt") : path; UtilPackage.configureWithExtraFile(myFixture, path, ".Data"); diff --git a/plugins/android-idea-plugin/android-idea-plugin.iml b/plugins/android-idea-plugin/android-idea-plugin.iml index 4e66ab33e63..861a0257349 100644 --- a/plugins/android-idea-plugin/android-idea-plugin.iml +++ b/plugins/android-idea-plugin/android-idea-plugin.iml @@ -17,5 +17,6 @@ + \ No newline at end of file diff --git a/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCase.java b/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCase.java index 42a9c6c5007..e98b51c45a7 100644 --- a/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCase.java +++ b/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCase.java @@ -18,10 +18,6 @@ package org.jetbrains.kotlin.android; import com.android.SdkConstants; import com.android.ide.common.rendering.RenderSecurityManager; -import com.intellij.analysis.AnalysisScope; -import com.intellij.codeInspection.InspectionManager; -import com.intellij.codeInspection.ex.GlobalInspectionToolWrapper; -import com.intellij.codeInspection.ex.InspectionManagerEx; import com.intellij.facet.FacetManager; import com.intellij.facet.ModifiableFacetModel; import com.intellij.ide.startup.impl.StartupManagerImpl; @@ -33,21 +29,15 @@ import com.intellij.openapi.roots.ModuleRootModificationUtil; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; -import com.intellij.psi.FileViewProvider; -import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerEx; -import com.intellij.psi.impl.file.impl.FileManager; -import com.intellij.testFramework.InspectionTestUtil; import com.intellij.testFramework.builders.JavaModuleFixtureBuilder; -import com.intellij.testFramework.fixtures.*; -import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; -import com.intellij.testFramework.fixtures.impl.GlobalInspectionContextForTests; +import com.intellij.testFramework.fixtures.IdeaProjectTestFixture; +import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory; +import com.intellij.testFramework.fixtures.JavaTestFixtureFactory; +import com.intellij.testFramework.fixtures.TestFixtureBuilder; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.idea.actions.internal.KotlinInternalMode; -import org.jetbrains.kotlin.idea.references.BuiltInsReferenceResolver; -import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.test.JetTestUtils; import java.io.File; @@ -55,7 +45,6 @@ import java.io.FileFilter; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Set; @SuppressWarnings({"JUnitTestCaseWithNonTrivialConstructors"}) @@ -220,8 +209,7 @@ public abstract class KotlinAndroidTestCase extends KotlinAndroidTestCaseBase { KotlinInternalMode.Instance.setEnabled(kotlinInternalModeOriginalValue); VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()); - Set builtInsSources = getProject().getComponent(BuiltInsReferenceResolver.class).getBuiltInsSources(); - FileManager fileManager = ((PsiManagerEx) PsiManager.getInstance(getProject())).getFileManager(); + super.tearDown(); myModule = null; myAdditionalModules = null; @@ -231,15 +219,6 @@ public abstract class KotlinAndroidTestCase extends KotlinAndroidTestCaseBase { if (RenderSecurityManager.RESTRICT_READS) { RenderSecurityManager.sEnabled = true; } - - super.tearDown(); - - // Restore mapping between PsiFiles and VirtualFiles dropped in FileManager.cleanupForNextTest(), - // otherwise built-ins psi elements will become invalid in next test. - for (JetFile source : builtInsSources) { - FileViewProvider provider = source.getViewProvider(); - fileManager.setViewProvider(provider.getVirtualFile(), provider); - } } public AndroidFacet addAndroidFacet(Module module, String sdkPath, String platformDir) { 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 61b5775f26c..6dbd0a83db9 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 @@ -16,8 +16,6 @@ package org.jetbrains.kotlin.android; import com.android.sdklib.IAndroidTarget; -import com.android.tools.idea.rendering.ResourceHelper; -import com.intellij.openapi.application.PathManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.ProjectJdkTable; @@ -26,21 +24,17 @@ import com.intellij.openapi.projectRoots.SdkModificator; import com.intellij.openapi.roots.JavadocOrderRootType; import com.intellij.openapi.roots.ModuleRootModificationUtil; import com.intellij.openapi.roots.OrderRootType; -import com.intellij.openapi.util.Segment; -import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.testFramework.IdeaTestCase; import com.intellij.testFramework.UsefulTestCase; import com.intellij.testFramework.fixtures.CodeInsightTestFixture; -import org.jetbrains.android.dom.wrappers.LazyValueResourceElementWrapper; -import org.jetbrains.android.sdk.*; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.android.sdk.AndroidSdkAdditionalData; +import org.jetbrains.android.sdk.AndroidSdkData; +import org.jetbrains.android.sdk.AndroidSdkType; +import org.jetbrains.kotlin.idea.test.RunnableWithException; +import org.jetbrains.kotlin.idea.test.TestPackage; import org.jetbrains.kotlin.test.JetTestUtils; import java.io.File; @@ -76,6 +70,16 @@ public abstract class KotlinAndroidTestCaseBase extends UsefulTestCase { return getTestDataPath() + "/sdk1.5"; } + @Override + protected void tearDown() throws Exception { + TestPackage.unInvalidateBuiltins(getProject(), new RunnableWithException() { + @Override + public void run() throws Exception { + KotlinAndroidTestCaseBase.super.tearDown(); + } + }); + } + public String getDefaultPlatformDir() { return "android-1.5"; }