Compare commits

...

2 Commits

Author SHA1 Message Date
Nikita Bobko
5ed93a36d1 Get rid of usages of internal LibraryImpl class
KT-39327
2020-06-10 17:54:11 +03:00
Alex Plate
8bb9168b2c Use ModuleOrderEntry instead of ModuleOrderEntryImpl
`isProductionOnTestDependency` function was moved from implementation to
interface. The fix is important for the new IJ project model.

KT-39327
2020-06-10 17:06:02 +03:00
7 changed files with 14 additions and 37 deletions

View File

@@ -11,7 +11,6 @@ import com.intellij.openapi.module.impl.scopes.LibraryScopeBase
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.*
import com.intellij.openapi.roots.impl.ModuleOrderEntryImpl
import com.intellij.openapi.roots.impl.libraries.LibraryEx
import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.util.ModificationTracker
@@ -92,7 +91,7 @@ private fun orderEntryToModuleInfo(project: Project, orderEntry: OrderEntry, for
}
is ModuleOrderEntry -> {
val module = orderEntry.module ?: return emptyList()
if (forProduction && orderEntry is ModuleOrderEntryImpl && orderEntry.isProductionOnTestDependency) {
if (forProduction && orderEntry.isProductionOnTestDependency) {
listOfNotNull(module.testSourceInfo())
} else {
module.toInfos()
@@ -131,7 +130,7 @@ private fun OrderEntry.acceptAsDependency(forProduction: Boolean): Boolean {
return this !is ExportableOrderEntry
|| !forProduction
// this is needed for Maven/Gradle projects with "production-on-test" dependency
|| this is ModuleOrderEntryImpl && isProductionOnTestDependency
|| this is ModuleOrderEntry && isProductionOnTestDependency
|| scope.isForProductionCompile
}

View File

@@ -15,7 +15,6 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.LibraryOrderEntry
import com.intellij.openapi.roots.ModuleOrderEntry
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.impl.ModuleOrderEntryImpl
import com.intellij.openapi.vfs.VfsUtil
import org.jetbrains.kotlin.idea.configuration.KotlinTargetData
import org.jetbrains.kotlin.idea.configuration.kotlinSourceSet
@@ -48,7 +47,7 @@ class KotlinJavaMPPSourceSetDataService : AbstractProjectDataService<GradleSourc
val moduleEntries = rootModel.orderEntries.filterIsInstance<ModuleOrderEntry>()
moduleEntries.filter { isTestModuleById(it.moduleName, toImport) }.forEach { moduleOrderEntry ->
(moduleOrderEntry as? ModuleOrderEntryImpl)?.isProductionOnTestDependency = true
moduleOrderEntry.isProductionOnTestDependency = true
}
val libraryEntries = rootModel.orderEntries.filterIsInstance<LibraryOrderEntry>()
libraryEntries.forEach { libraryEntry ->

View File

@@ -30,9 +30,7 @@ import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.impl.libraries.LibraryEx
import com.intellij.openapi.roots.impl.libraries.LibraryImpl
import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.roots.libraries.PersistentLibraryKind
import com.intellij.openapi.util.Key
import com.intellij.util.PathUtil
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
@@ -186,10 +184,11 @@ class KotlinGradleLibraryDataService : AbstractProjectDataService<LibraryData, V
val modifiableModel = modelsProvider.getModifiableLibraryModel(ideLibrary) as LibraryEx.ModifiableModelEx
if (anyNonJvmModules || ideLibrary.looksAsNonJvmLibrary()) {
detectLibraryKind(modifiableModel.getFiles(OrderRootType.CLASSES))?.let { modifiableModel.kind = it }
} else if (ideLibrary is LibraryImpl
&& (ideLibrary.kind === JSLibraryKind || ideLibrary.kind === NativeLibraryKind || ideLibrary.kind === CommonLibraryKind)
} else if (
ideLibrary is LibraryEx &&
(ideLibrary.kind === JSLibraryKind || ideLibrary.kind === NativeLibraryKind || ideLibrary.kind === CommonLibraryKind)
) {
resetLibraryKind(modifiableModel)
modifiableModel.kind = null
}
}
}
@@ -203,23 +202,6 @@ class KotlinGradleLibraryDataService : AbstractProjectDataService<LibraryData, V
return getFiles(OrderRootType.CLASSES).firstOrNull()?.extension == KLIB_FILE_EXTENSION
}
private fun resetLibraryKind(modifiableModel: LibraryEx.ModifiableModelEx) {
try {
val cls = LibraryImpl::class.java
// Don't use name-based lookup because field names are scrambled in IDEA Ultimate
for (field in cls.declaredFields) {
if (field.type == PersistentLibraryKind::class.java) {
field.isAccessible = true
field.set(modifiableModel, null)
return
}
}
LOG.info("Could not find field of type PersistentLibraryKind in LibraryImpl.class")
} catch (e: Exception) {
LOG.info("Failed to reset library kind", e)
}
}
companion object {
val LOG = Logger.getInstance(KotlinGradleLibraryDataService::class.java)

View File

@@ -5,11 +5,10 @@
package org.jetbrains.kotlin.idea
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.DependencyScope
import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.openapi.roots.impl.ModuleOrderEntryImpl
import com.intellij.openapi.diagnostic.Logger
/**
* Returns the dependency scope which has flags specific to the both provided scopes
@@ -57,7 +56,7 @@ fun addModuleDependencyIfNeeded(
dependOnTest: Boolean
) {
val existingEntry = rootModel.findModuleOrderEntry(dependeeModule)
val existingDependOnTest = (existingEntry as? ModuleOrderEntryImpl)?.isProductionOnTestDependency ?: false
val existingDependOnTest = existingEntry?.isProductionOnTestDependency ?: false
val requiredScope = getScopeContainingBoth(if (testScope) DependencyScope.TEST else DependencyScope.COMPILE, existingEntry?.scope)
if (existingEntry != null) {
@@ -72,6 +71,6 @@ fun addModuleDependencyIfNeeded(
}
rootModel.addModuleOrderEntry(dependeeModule).also {
it.scope = requiredScope
(it as? ModuleOrderEntryImpl)?.isProductionOnTestDependency = dependOnTest || existingDependOnTest
it.isProductionOnTestDependency = dependOnTest || existingDependOnTest
}
}

View File

@@ -18,8 +18,8 @@ package org.jetbrains.kotlin.gradle
import com.intellij.openapi.roots.DependencyScope
import com.intellij.openapi.roots.LibraryOrderEntry
import com.intellij.openapi.roots.ModuleOrderEntry
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.impl.ModuleOrderEntryImpl
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.util.PathUtil
import junit.framework.TestCase
@@ -43,7 +43,7 @@ class MultiplatformProjectImportingTest : MultiplePluginVersionGradleImportingTe
val depOrderEntry = getModule(moduleName)
.rootManager
.orderEntries
.filterIsInstance<ModuleOrderEntryImpl>()
.filterIsInstance<ModuleOrderEntry>()
.first { it.moduleName == depModuleName }
assert(depOrderEntry.isProductionOnTestDependency == expected)
}

View File

@@ -10,7 +10,6 @@ import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.rootManager
import com.intellij.openapi.roots.*
import com.intellij.openapi.roots.impl.ModuleOrderEntryImpl
import com.intellij.openapi.util.io.FileUtil
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
import org.jetbrains.jps.util.JpsPathUtil
@@ -319,7 +318,7 @@ class ModuleInfo(
private fun checkProductionOnTest(library: ExportableOrderEntry, productionOnTest: Boolean?) {
if (productionOnTest == null) return
val actualFlag = (library as? ModuleOrderEntryImpl)?.isProductionOnTestDependency
val actualFlag = (library as? ModuleOrderEntry)?.isProductionOnTestDependency
if (actualFlag == null) {
projectInfo.messageCollector.report(
"Module '${module.name}': Dependency '${library.presentableName}' has no productionOnTest property"

View File

@@ -14,7 +14,6 @@ import com.intellij.openapi.roots.impl.ContentEntryImpl
import com.intellij.openapi.roots.impl.SourceFolderImpl
import com.intellij.openapi.roots.impl.libraries.ApplicationLibraryTable
import com.intellij.openapi.roots.impl.libraries.LibraryEx
import com.intellij.openapi.roots.impl.libraries.LibraryImpl
import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.roots.libraries.LibraryKind
import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar
@@ -107,7 +106,7 @@ class KotlinNonJvmSourceRootConverterProvider : ConverterProvider("kotlin-non-jv
class ConverterImpl(private val context: ConversionContext) : ProjectConverter() {
private val projectLibrariesByName by lazy {
context.projectLibrariesSettings.projectLibraries.groupBy { it.getAttributeValue(LibraryImpl.LIBRARY_NAME_ATTR) }
context.projectLibrariesSettings.projectLibraries.groupBy { it.getAttributeValue(NAME_ATTRIBUTE) }
}
private fun findGlobalLibrary(name: String) = ApplicationLibraryTable.getApplicationTable().getLibraryByName(name)