Update hack for restore validity of builtins files

This commit is contained in:
Nikolay Krasko
2015-06-01 19:08:36 +03:00
parent 53ab02e877
commit 94db320f7a
10 changed files with 126 additions and 101 deletions
@@ -28,6 +28,7 @@ import com.intellij.psi.FileViewProvider
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import com.intellij.psi.impl.PsiManagerEx import com.intellij.psi.impl.PsiManagerEx
import com.intellij.psi.impl.file.impl.FileManager import com.intellij.psi.impl.file.impl.FileManager
import com.intellij.psi.impl.source.PsiFileImpl
import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.actions.internal.KotlinInternalMode import org.jetbrains.kotlin.idea.actions.internal.KotlinInternalMode
@@ -57,16 +58,8 @@ public abstract class JetLightCodeInsightFixtureTestCase : LightCodeInsightFixtu
KotlinInternalMode.enabled = kotlinInternalModeOriginalValue KotlinInternalMode.enabled = kotlinInternalModeOriginalValue
VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()) VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory())
val builtInsSources = getProject().getComponent<BuiltInsReferenceResolver>(javaClass<BuiltInsReferenceResolver>()).getBuiltInsSources() unInvalidateBuiltins(getProject()) {
val fileManager = (PsiManager.getInstance(getProject()) as PsiManagerEx).getFileManager() super.tearDown()
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)
} }
} }
@@ -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()
}
}
}
@@ -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;
}
@@ -18,8 +18,10 @@ package org.jetbrains.kotlin.idea.test
import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
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.psi.impl.source.PsiFileImpl
import com.intellij.testFramework.LightPlatformTestCase import com.intellij.testFramework.LightPlatformTestCase
import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.util.Consumer 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.diagnostics.rendering.DefaultErrorMessages
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult
import org.jetbrains.kotlin.idea.js.KotlinJavaScriptLibraryManager import org.jetbrains.kotlin.idea.js.KotlinJavaScriptLibraryManager
import org.jetbrains.kotlin.idea.test.KotlinStdJSProjectDescriptor import org.jetbrains.kotlin.idea.references.BuiltInsReferenceResolver
import org.jetbrains.kotlin.idea.test.ProjectDescriptorWithStdlibSources
import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetFile
public enum class ModuleKind { public enum class ModuleKind {
@@ -74,3 +75,20 @@ 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) {
val builtInsSources = project.getComponent<org.jetbrains.kotlin.idea.references.BuiltInsReferenceResolver>(javaClass<BuiltInsReferenceResolver>()).getBuiltInsSources()
runnable.run()
// Base tearDown() invalidates builtins. Restore them with brute force.
for (source in builtInsSources) {
val psiFileImpl = source as PsiFileImpl
val field = javaClass<PsiFileImpl>().getDeclaredField("myInvalidated")!!
field.setAccessible(true)
field.set(psiFileImpl, false)
}
}
public fun unInvalidateBuiltins(project: Project, runnable: () -> Unit) {
unInvalidateBuiltins(project, RunnableWithException { runnable() })
}
@@ -18,6 +18,8 @@ package org.jetbrains.kotlin.idea;
import com.intellij.codeInsight.daemon.quickFix.LightQuickFixTestCase; import com.intellij.codeInsight.daemon.quickFix.LightQuickFixTestCase;
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; 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; import org.jetbrains.kotlin.test.JetTestUtils;
abstract public class KotlinLightQuickFixTestCase extends LightQuickFixTestCase { abstract public class KotlinLightQuickFixTestCase extends LightQuickFixTestCase {
@@ -30,6 +32,12 @@ abstract public class KotlinLightQuickFixTestCase extends LightQuickFixTestCase
@Override @Override
protected void tearDown() throws Exception { protected void tearDown() throws Exception {
VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()); VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory());
super.tearDown();
TestPackage.unInvalidateBuiltins(getProject(), new RunnableWithException() {
@Override
public void run() throws Exception {
KotlinLightQuickFixTestCase.super.tearDown();
}
});
} }
} }
@@ -69,21 +69,6 @@ public abstract class AbstractQuickFixTest extends KotlinLightQuickFixTestCase {
((StartupManagerImpl) StartupManager.getInstance(getProject())).runPostStartupActivities(); ((StartupManagerImpl) StartupManager.getInstance(getProject())).runPostStartupActivities();
} }
@Override
protected void tearDown() throws Exception {
Set<JetFile> 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 @Nullable
private static File findInspectionFile(@NotNull File startDir) { private static File findInspectionFile(@NotNull File startDir) {
File currentDir = startDir; File currentDir = startDir;
@@ -18,29 +18,23 @@ package org.jetbrains.kotlin.idea.resolve;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Ordering; import com.google.common.collect.Ordering;
import com.intellij.ide.startup.impl.StartupManagerImpl; import com.intellij.psi.PsiElement;
import com.intellij.openapi.startup.StartupManager; import com.intellij.psi.PsiPolyVariantReference;
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; import com.intellij.psi.PsiReference;
import com.intellij.psi.*; import com.intellij.psi.ResolveResult;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.file.impl.FileManager;
import com.intellij.testFramework.LightProjectDescriptor; import com.intellij.testFramework.LightProjectDescriptor;
import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.idea.test.JetWithJdkAndRuntimeLightProjectDescriptor; import org.jetbrains.kotlin.idea.test.JetWithJdkAndRuntimeLightProjectDescriptor;
import org.jetbrains.kotlin.idea.references.BuiltInsReferenceResolver; import org.jetbrains.kotlin.idea.test.KotlinLightPlatformCodeInsightFixtureTestCase;
import org.jetbrains.kotlin.psi.JetFile;
import org.jetbrains.kotlin.test.InTextDirectivesUtils; import org.jetbrains.kotlin.test.InTextDirectivesUtils;
import org.jetbrains.kotlin.test.JetTestUtils;
import org.jetbrains.kotlin.test.ReferenceUtils; import org.jetbrains.kotlin.test.ReferenceUtils;
import org.jetbrains.kotlin.test.util.UtilPackage; import org.jetbrains.kotlin.test.util.UtilPackage;
import org.junit.Assert; import org.junit.Assert;
import java.util.List; import java.util.List;
import java.util.Set;
public abstract class AbstractReferenceResolveTest extends LightPlatformCodeInsightFixtureTestCase { public abstract class AbstractReferenceResolveTest extends KotlinLightPlatformCodeInsightFixtureTestCase {
public static class ExpectedResolveData { public static class ExpectedResolveData {
private final Boolean shouldBeUnresolved; private final Boolean shouldBeUnresolved;
private final String referenceToString; private final String referenceToString;
@@ -62,30 +56,6 @@ public abstract class AbstractReferenceResolveTest extends LightPlatformCodeInsi
public static final String MULTIRESOLVE = "MULTIRESOLVE"; public static final String MULTIRESOLVE = "MULTIRESOLVE";
public static final String REF_EMPTY = "REF_EMPTY"; 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<JetFile> 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) { protected void doTest(@NotNull String path) {
assert path.endsWith(".kt") : path; assert path.endsWith(".kt") : path;
UtilPackage.configureWithExtraFile(myFixture, path, ".Data"); UtilPackage.configureWithExtraFile(myFixture, path, ".Data");
@@ -17,5 +17,6 @@
<orderEntry type="module" module-name="light-classes" /> <orderEntry type="module" module-name="light-classes" />
<orderEntry type="module" module-name="idea-completion" scope="TEST" /> <orderEntry type="module" module-name="idea-completion" scope="TEST" />
<orderEntry type="library" name="kotlin-runtime" level="project" /> <orderEntry type="library" name="kotlin-runtime" level="project" />
<orderEntry type="module" module-name="idea-test-framework" scope="TEST" />
</component> </component>
</module> </module>
@@ -18,10 +18,6 @@ package org.jetbrains.kotlin.android;
import com.android.SdkConstants; import com.android.SdkConstants;
import com.android.ide.common.rendering.RenderSecurityManager; 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.FacetManager;
import com.intellij.facet.ModifiableFacetModel; import com.intellij.facet.ModifiableFacetModel;
import com.intellij.ide.startup.impl.StartupManagerImpl; 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.startup.StartupManager;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; 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.builders.JavaModuleFixtureBuilder;
import com.intellij.testFramework.fixtures.*; import com.intellij.testFramework.fixtures.IdeaProjectTestFixture;
import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory;
import com.intellij.testFramework.fixtures.impl.GlobalInspectionContextForTests; import com.intellij.testFramework.fixtures.JavaTestFixtureFactory;
import com.intellij.testFramework.fixtures.TestFixtureBuilder;
import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.facet.AndroidRootUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.idea.actions.internal.KotlinInternalMode; 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 org.jetbrains.kotlin.test.JetTestUtils;
import java.io.File; import java.io.File;
@@ -55,7 +45,6 @@ import java.io.FileFilter;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
@SuppressWarnings({"JUnitTestCaseWithNonTrivialConstructors"}) @SuppressWarnings({"JUnitTestCaseWithNonTrivialConstructors"})
@@ -220,8 +209,7 @@ public abstract class KotlinAndroidTestCase extends KotlinAndroidTestCaseBase {
KotlinInternalMode.Instance.setEnabled(kotlinInternalModeOriginalValue); KotlinInternalMode.Instance.setEnabled(kotlinInternalModeOriginalValue);
VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()); VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory());
Set<JetFile> builtInsSources = getProject().getComponent(BuiltInsReferenceResolver.class).getBuiltInsSources(); super.tearDown();
FileManager fileManager = ((PsiManagerEx) PsiManager.getInstance(getProject())).getFileManager();
myModule = null; myModule = null;
myAdditionalModules = null; myAdditionalModules = null;
@@ -231,15 +219,6 @@ public abstract class KotlinAndroidTestCase extends KotlinAndroidTestCaseBase {
if (RenderSecurityManager.RESTRICT_READS) { if (RenderSecurityManager.RESTRICT_READS) {
RenderSecurityManager.sEnabled = true; 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) { public AndroidFacet addAndroidFacet(Module module, String sdkPath, String platformDir) {
@@ -16,8 +16,6 @@
package org.jetbrains.kotlin.android; package org.jetbrains.kotlin.android;
import com.android.sdklib.IAndroidTarget; 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.module.Module;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.ProjectJdkTable; 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.JavadocOrderRootType;
import com.intellij.openapi.roots.ModuleRootModificationUtil; import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.roots.OrderRootType; 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.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager; 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.IdeaTestCase;
import com.intellij.testFramework.UsefulTestCase; import com.intellij.testFramework.UsefulTestCase;
import com.intellij.testFramework.fixtures.CodeInsightTestFixture; import com.intellij.testFramework.fixtures.CodeInsightTestFixture;
import org.jetbrains.android.dom.wrappers.LazyValueResourceElementWrapper; import org.jetbrains.android.sdk.AndroidSdkAdditionalData;
import org.jetbrains.android.sdk.*; import org.jetbrains.android.sdk.AndroidSdkData;
import org.jetbrains.annotations.NotNull; import org.jetbrains.android.sdk.AndroidSdkType;
import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.idea.test.RunnableWithException;
import org.jetbrains.kotlin.idea.test.TestPackage;
import org.jetbrains.kotlin.test.JetTestUtils; import org.jetbrains.kotlin.test.JetTestUtils;
import java.io.File; import java.io.File;
@@ -76,6 +70,16 @@ public abstract class KotlinAndroidTestCaseBase extends UsefulTestCase {
return getTestDataPath() + "/sdk1.5"; 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() { public String getDefaultPlatformDir() {
return "android-1.5"; return "android-1.5";
} }