Fix compatibility with IDEA after unlinking external api from java
#KT-31952 Fixed
This commit is contained in:
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.idea.configuration
|
||||
|
||||
import com.intellij.openapi.externalSystem.model.DataNode
|
||||
import com.intellij.openapi.externalSystem.model.project.ProjectData
|
||||
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider
|
||||
import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjectDataService
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.io.FileUtil
|
||||
import com.intellij.packaging.artifacts.ModifiableArtifactModel
|
||||
import com.intellij.packaging.impl.artifacts.JarArtifactType
|
||||
import com.intellij.packaging.impl.elements.ProductionModuleOutputPackagingElement
|
||||
import org.jetbrains.kotlin.idea.util.createPointer
|
||||
|
||||
class KotlinTargetDataService : AbstractProjectDataService<KotlinTargetData, Void>() {
|
||||
override fun getTargetDataKey() = KotlinTargetData.KEY
|
||||
|
||||
override fun importData(
|
||||
toImport: MutableCollection<DataNode<KotlinTargetData>>,
|
||||
projectData: ProjectData?,
|
||||
project: Project,
|
||||
modelsProvider: IdeModifiableModelsProvider
|
||||
) {
|
||||
for (nodeToImport in toImport) {
|
||||
val targetData = nodeToImport.data
|
||||
val archiveFile = targetData.archiveFile ?: continue
|
||||
|
||||
//TODO(auskov) should be replaced with direct invocation of the method after migration to new API in IDEA 192
|
||||
val artifactModel = try {
|
||||
val oldMethod = modelsProvider.javaClass.getMethod("getModifiableArtifactModel")
|
||||
oldMethod.invoke(modelsProvider) as ModifiableArtifactModel
|
||||
} catch (_: Exception) {
|
||||
val newMethod = modelsProvider.javaClass.getMethod("getModifiableModel", Class::class.java)
|
||||
val packagingModifiableModel = newMethod.invoke(
|
||||
modelsProvider,
|
||||
Class.forName("com.intellij.openapi.externalSystem.project.PackagingModifiableModel")
|
||||
)
|
||||
packagingModifiableModel.javaClass
|
||||
.getMethod("getModifiableArtifactModel")
|
||||
.invoke(packagingModifiableModel) as ModifiableArtifactModel
|
||||
}
|
||||
|
||||
val artifactName = FileUtil.getNameWithoutExtension(archiveFile)
|
||||
artifactModel.findArtifact(artifactName)?.let { artifactModel.removeArtifact(it) }
|
||||
artifactModel.addArtifact(artifactName, JarArtifactType.getInstance()).also {
|
||||
it.outputPath = archiveFile.parent
|
||||
for (moduleId in targetData.moduleIds) {
|
||||
val compilationModuleDataNode = nodeToImport.parent?.findChildModuleById(moduleId) ?: continue
|
||||
val compilationData = compilationModuleDataNode.data
|
||||
val kotlinSourceSet = compilationModuleDataNode.kotlinSourceSet ?: continue
|
||||
if (kotlinSourceSet.isTestModule) continue
|
||||
val moduleToPackage = modelsProvider.findIdeModule(compilationData) ?: continue
|
||||
it.rootElement.addOrFindChild(ProductionModuleOutputPackagingElement(project, moduleToPackage.createPointer()))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user