MissingRecentApiInspection test: replace unnecessary IDE JDK and library project descriptors.

GitOrigin-RevId: 801bc9ff02ffe3ff91ebfee40a25f719a89fb0ac
This commit is contained in:
Sergey Patrikeev
2019-05-17 15:02:49 +03:00
committed by intellij-monorepo-bot
parent f0f28abbc5
commit a77a0d7b3e
3 changed files with 24 additions and 202 deletions
@@ -2,24 +2,44 @@
package org.jetbrains.idea.devkit.kotlin.inspections.missingApi
import com.intellij.codeInsight.AnnotationUtil
import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.ContentEntry
import com.intellij.openapi.roots.JavaModuleExternalPaths
import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.openapi.roots.ModuleRootModificationUtil
import com.intellij.pom.java.LanguageLevel
import com.intellij.testFramework.PsiTestUtil
import com.intellij.testFramework.TestDataPath
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
import com.intellij.util.PathUtil
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.idea.devkit.DevkitJavaTestsUtil
import org.jetbrains.idea.devkit.inspections.PluginModuleTestCase
import org.jetbrains.idea.devkit.inspections.missingApi.MissingRecentApiInspection
import org.jetbrains.idea.devkit.inspections.missingApi.MissingRecentApiUsageProcessor
import org.jetbrains.idea.devkit.kotlin.inspections.missingApi.project.PluginProjectWithIdeaJdkDescriptor
import org.jetbrains.idea.devkit.kotlin.inspections.missingApi.project.PluginProjectWithIdeaLibraryDescriptor
import org.jetbrains.idea.devkit.module.PluginModuleType
/**
* Base class for tests of [MissingRecentApiInspection] on Java and Kotlin sources.
*/
@TestDataPath("\$CONTENT_ROOT/testData/inspections/missingApi")
abstract class MissingRecentApiInspectionTestBase : PluginModuleTestCase() {
class MissingRecentApiInspectionTestBase : PluginModuleTestCase() {
private val projectDescriptor = object : LightCodeInsightFixtureTestCase.ProjectDescriptor(LanguageLevel.HIGHEST) {
override fun configureModule(module: Module, model: ModifiableRootModel, contentEntry: ContentEntry) {
super.configureModule(module, model, contentEntry)
PsiTestUtil.addProjectLibrary(model, "annotations", listOf(PathUtil.getJarPathForClass(ApiStatus.OverrideOnly::class.java)))
PsiTestUtil.addProjectLibrary(model, "library", listOf(testDataPath))
PsiTestUtil.addProjectLibrary(model, "kotlin-stdlib", listOf(PathUtil.getJarPathForClass(Function::class.java)))
}
override fun getModuleType() = PluginModuleType.getInstance()
}
private var inspection = MissingRecentApiInspection()
override fun getProjectDescriptor() = projectDescriptor
override fun setUp() {
super.setUp()
configureInspection()
@@ -35,19 +55,13 @@ abstract class MissingRecentApiInspectionTestBase : PluginModuleTestCase() {
override fun tearDown() {
try {
myFixture.disableInspections(inspection)
//Dispose IDEA module or JDK and all attached roots.
PluginProjectWithIdeaLibraryDescriptor.disposeIdeaLibrary(project)
PluginProjectWithIdeaJdkDescriptor.disposeIdeaJdk()
}
catch (e: Throwable) {
addSuppressedException(e)
}
finally {
super.tearDown()
}
}
final override fun getTestDataPath() = DevkitJavaTestsUtil.TESTDATA_ABSOLUTE_PATH + "inspections/missingApi"
override fun getTestDataPath() = DevkitJavaTestsUtil.TESTDATA_ABSOLUTE_PATH + "inspections/missingApi"
/**
* "Library" classes are put to the same test source root as "client" one,
@@ -103,18 +117,4 @@ abstract class MissingRecentApiInspectionTestBase : PluginModuleTestCase() {
myFixture.testHighlighting("plugin/missingApiUsages.kt")
}
}
/**
* Implementation of [MissingRecentApiInspectionTestBase] for sources with configured IDEA library.
*/
class MissingRecentApiWithIdeaLibraryInspectionTest : MissingRecentApiInspectionTestBase() {
override fun getProjectDescriptor() = PluginProjectWithIdeaLibraryDescriptor()
}
/**
* Implementation of [MissingRecentApiInspectionTestBase] for sources with configured IDEA JDK.
*/
class MissingRecentApiWithIdeaJdkInspectionTest : MissingRecentApiInspectionTestBase() {
override fun getProjectDescriptor() = PluginProjectWithIdeaJdkDescriptor()
}
@@ -1,89 +0,0 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.idea.devkit.kotlin.inspections.missingApi.project
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.application.runWriteAction
import com.intellij.openapi.components.BaseState
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleType
import com.intellij.openapi.projectRoots.ProjectJdkTable
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.projectRoots.SdkModificator
import com.intellij.openapi.roots.ContentEntry
import com.intellij.openapi.roots.LanguageLevelModuleExtension
import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.pom.java.LanguageLevel
import com.intellij.testFramework.IdeaTestUtil
import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.testFramework.PsiTestUtil
import com.intellij.util.PathUtil
import org.jetbrains.idea.devkit.module.PluginModuleType
import org.jetbrains.idea.devkit.projectRoots.IdeaJdk
import org.jetbrains.idea.devkit.projectRoots.Sandbox
import java.io.File
/**
* Descriptor of an IDEA plugin project with configured IDEA JDK.
*/
class PluginProjectWithIdeaJdkDescriptor : LightProjectDescriptor() {
companion object {
private const val IDEA_SDK_NAME = "IDEA plugin SDK"
fun disposeIdeaJdk() {
val ideaSdk = ProjectJdkTable.getInstance().findJdk(IDEA_SDK_NAME) ?: return
runWriteAction {
ProjectJdkTable.getInstance().removeJdk(ideaSdk)
}
}
}
override fun getModuleType(): ModuleType<*> = PluginModuleType.getInstance()
override fun getSdk(): Sdk =
runWriteAction {
val jdkTable = ProjectJdkTable.getInstance()
val sdkType = IdeaJdk.getInstance()
val ideaSdk = jdkTable.createSdk(IDEA_SDK_NAME, sdkType)
val sdkModificator = ideaSdk.sdkModificator
sdkModificator.setupInternalJdk(ideaSdk, IdeaTestUtil.getMockJdk18())
sdkModificator.addIdeaJarContainingClassToClassPath(Editor::class.java)
sdkModificator.addIdeaJarContainingClassToClassPath(BaseState::class.java)
sdkModificator.commitChanges()
jdkTable.addJdk(ideaSdk)
ideaSdk
}
override fun configureModule(module: Module, model: ModifiableRootModel, contentEntry: ContentEntry) {
super.configureModule(module, model, contentEntry)
val moduleExtension = model.getModuleExtension(LanguageLevelModuleExtension::class.java)
moduleExtension.languageLevel = LanguageLevel.HIGHEST
val kotlinStdlibJar = File(PathUtil.getJarPathForClass(Function::class.java))
PsiTestUtil.addLibrary(model, "kotlin-stdlib", kotlinStdlibJar.parent, kotlinStdlibJar.name)
}
private fun SdkModificator.setupInternalJdk(ideaSdk: Sdk, javaJdk: Sdk) {
for (javaRoot in javaJdk.rootProvider.getFiles(OrderRootType.CLASSES)) {
addRoot(javaRoot, OrderRootType.CLASSES)
}
val sandboxHome = FileUtil.join(FileUtil.getTempDirectory(), "plugins-sandbox")
sdkAdditionalData = Sandbox(sandboxHome, javaJdk, ideaSdk)
versionString = javaJdk.versionString
}
private fun SdkModificator.addIdeaJarContainingClassToClassPath(clazz: Class<*>) {
val jarFile = File(FileUtil.toSystemIndependentName(PathManager.getJarPathForClass(clazz)!!))
val virtualFile = VfsUtil.findFileByIoFile(jarFile, true)
addRoot(virtualFile!!, OrderRootType.CLASSES)
}
}
@@ -1,89 +0,0 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.idea.devkit.kotlin.inspections.missingApi.project
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.application.runReadAction
import com.intellij.openapi.application.runWriteAction
import com.intellij.openapi.components.BaseState
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleType
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.ContentEntry
import com.intellij.openapi.roots.LanguageLevelModuleExtension
import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.pom.java.LanguageLevel
import com.intellij.testFramework.IdeaTestUtil
import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.testFramework.PsiTestUtil
import com.intellij.util.PathUtil
import org.jetbrains.idea.devkit.module.PluginModuleType
import java.io.File
/**
* Descriptor of an IDEA plugin project with configured IDEA library (not JDK).
*/
class PluginProjectWithIdeaLibraryDescriptor : LightProjectDescriptor() {
companion object {
private const val IDEA_LIBRARY_NAME = "IDEA library"
fun disposeIdeaLibrary(project: Project) {
val libraryTable = LibraryTablesRegistrar.getInstance().getLibraryTable(project)
val library = runReadAction {
libraryTable.getLibraryByName(IDEA_LIBRARY_NAME)
} ?: return
runWriteAction {
libraryTable.removeLibrary(library)
}
}
}
override fun getModuleType(): ModuleType<*> = PluginModuleType.getInstance()
override fun configureModule(module: Module, model: ModifiableRootModel, contentEntry: ContentEntry) {
super.configureModule(module, model, contentEntry)
val moduleExtension = model.getModuleExtension(LanguageLevelModuleExtension::class.java)
moduleExtension.languageLevel = LanguageLevel.HIGHEST
val library = createIdeaLibrary(module)
model.addLibraryEntry(library)
val kotlinStdlibJar = File(PathUtil.getJarPathForClass(Function::class.java))
PsiTestUtil.addLibrary(model, "kotlin-stdlib", kotlinStdlibJar.parent, kotlinStdlibJar.name)
}
private fun createIdeaLibrary(module: Module): Library {
val libraryTable = LibraryTablesRegistrar.getInstance().getLibraryTable(module.project)
val library = runWriteAction {
libraryTable.createLibrary(IDEA_LIBRARY_NAME)
}
runWriteAction {
val modifiableModel = library.modifiableModel
modifiableModel.addIdeaJarContainingClassToClassPath(Editor::class.java)
modifiableModel.addIdeaJarContainingClassToClassPath(BaseState::class.java)
modifiableModel.commit()
}
return library
}
override fun getSdk(): Sdk = IdeaTestUtil.getMockJdk18()
private fun Library.ModifiableModel.addIdeaJarContainingClassToClassPath(clazz: Class<*>) {
val jarFile = File(FileUtil.toSystemIndependentName(PathManager.getJarPathForClass(clazz)!!))
val virtualFile = VfsUtil.findFileByIoFile(jarFile, true)
addRoot(virtualFile!!, OrderRootType.CLASSES)
}
}