Change AddKotlinLibQuickFix to support adding multiple jars

This commit is contained in:
Dmitry Jemerov
2017-04-11 14:43:53 +02:00
parent aee32e6204
commit 546040fafd
3 changed files with 27 additions and 26 deletions
@@ -46,6 +46,8 @@ public class PathUtil {
public static final String KOTLIN_TEST_JS_JAR = "kotlin-test-js.jar";
public static final String KOTLIN_JAVA_STDLIB_SRC_JAR = "kotlin-stdlib-sources.jar";
public static final String KOTLIN_JAVA_STDLIB_SRC_JAR_OLD = "kotlin-runtime-sources.jar";
public static final String KOTLIN_REFLECT_SRC_JAR = "kotlin-reflect-sources.jar";
public static final String KOTLIN_TEST_SRC_JAR = "kotlin-test-sources.jar";
public static final String KOTLIN_COMPILER_JAR = "kotlin-compiler.jar";
public static final Pattern KOTLIN_RUNTIME_JAR_PATTERN = Pattern.compile("kotlin-(stdlib|runtime)(-\\d[\\d.]+(-.+)?)?\\.jar");
@@ -19,14 +19,11 @@ package org.jetbrains.kotlin.idea.inspections
import com.intellij.codeInsight.daemon.impl.quickfix.OrderEntryFix
import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.extensions.Extensions
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ExternalLibraryDescriptor
import com.intellij.openapi.roots.JavaProjectModelModificationService
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainerFactory
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VfsUtilCore
@@ -36,7 +33,6 @@ import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.KotlinPluginUtil
import org.jetbrains.kotlin.idea.configuration.KotlinJavaModuleConfigurator
import org.jetbrains.kotlin.idea.configuration.KotlinProjectConfigurator
import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator
import org.jetbrains.kotlin.idea.configuration.createConfigureKotlinNotificationCollector
import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction
@@ -49,10 +45,11 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtImportDirective
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import java.io.File
class AddReflectionQuickFix(element: KtElement) : AddKotlinLibQuickFix(element, LibraryJarDescriptor.REFLECT_JAR) {
class AddReflectionQuickFix(element: KtElement)
: AddKotlinLibQuickFix(element, listOf(LibraryJarDescriptor.REFLECT_JAR,
LibraryJarDescriptor.REFLECT_SRC_JAR)) {
override fun getText() = KotlinBundle.message("add.reflection.to.classpath")
override fun getFamilyName() = text
@@ -64,7 +61,9 @@ class AddReflectionQuickFix(element: KtElement) : AddKotlinLibQuickFix(element,
}
}
class AddTestLibQuickFix(element: KtElement) : AddKotlinLibQuickFix(element, LibraryJarDescriptor.TEST_JAR) {
class AddTestLibQuickFix(element: KtElement)
: AddKotlinLibQuickFix(element, listOf(LibraryJarDescriptor.TEST_JAR,
LibraryJarDescriptor.TEST_SRC_JAR)) {
override fun getText() = KotlinBundle.message("add.test.to.classpath")
override fun getFamilyName() = text
@@ -114,13 +113,10 @@ class AddTestLibQuickFix(element: KtElement) : AddKotlinLibQuickFix(element, Lib
}
}
abstract class AddKotlinLibQuickFix(element: KtElement, val libraryJarDescriptor: LibraryJarDescriptor) : KotlinQuickFixAction<KtElement>(element) {
abstract class AddKotlinLibQuickFix(element: KtElement,
val libraryJarDescriptors: List<LibraryJarDescriptor>) : KotlinQuickFixAction<KtElement>(element) {
protected abstract fun getLibraryDescriptor(module: Module): MavenExternalLibraryDescriptor
fun libraryPath(): String = libraryJarDescriptor.jarName
fun getLibFile(): File = libraryJarDescriptor.getPathInPlugin()
fun hasLibJarInLibrary(library: Library): Boolean = libraryJarDescriptor.findExistingJar(library) != null
class MavenExternalLibraryDescriptor(groupId: String, artifactId: String, version: String) :
ExternalLibraryDescriptor(groupId, artifactId, version, version) {
override fun getLibraryClassesRoots(): List<String> = emptyList()
@@ -145,29 +141,30 @@ abstract class AddKotlinLibQuickFix(element: KtElement, val libraryJarDescriptor
}
}
val libFile = getLibFile()
if (!libFile.exists()) return
val configurator = Extensions.getExtensions(KotlinProjectConfigurator.EP_NAME)
.firstIsInstanceOrNull<KotlinJavaModuleConfigurator>() ?: return
val configurator = KotlinJavaModuleConfigurator.instance
val collector = createConfigureKotlinNotificationCollector(project)
for (library in findAllUsedLibraries(project).keySet()) {
val runtimeJar = LibraryJarDescriptor.RUNTIME_JAR.findExistingJar(library) ?: continue
if (hasLibJarInLibrary(library)) continue
val model = library.modifiableModel
val libFilesDir = VfsUtilCore.virtualToIoFile(runtimeJar).parent
val libIoFile = File(libFilesDir, libraryPath())
if (libIoFile.exists()) {
model.addRoot(VfsUtil.getUrlForLibraryRoot(libIoFile), OrderRootType.CLASSES)
}
else {
val copied = configurator.copyFileToDir(libFile, libFilesDir, collector)!!
model.addRoot(VfsUtil.getUrlForLibraryRoot(copied), OrderRootType.CLASSES)
for (libraryJarDescriptor in libraryJarDescriptors) {
if (libraryJarDescriptor.findExistingJar(library) != null) continue
val libFile = libraryJarDescriptor.getPathInPlugin()
if (!libFile.exists()) continue
val libIoFile = File(libFilesDir, libraryJarDescriptor.jarName)
if (libIoFile.exists()) {
model.addRoot(VfsUtil.getUrlForLibraryRoot(libIoFile), libraryJarDescriptor.orderRootType)
}
else {
val copied = configurator.copyFileToDir(libFile, libFilesDir, collector)!!
model.addRoot(VfsUtil.getUrlForLibraryRoot(copied), libraryJarDescriptor.orderRootType)
}
}
model.commit()
@@ -188,6 +188,8 @@ enum class LibraryJarDescriptor(val jarName: String,
LibraryUtils.getJarFile(library.getFiles(orderRootType).toList(), PathUtil.KOTLIN_JAVA_STDLIB_SRC_JAR_OLD)
}
},
REFLECT_SRC_JAR(PathUtil.KOTLIN_REFLECT_SRC_JAR, OrderRootType.SOURCES, false),
TEST_SRC_JAR(PathUtil.KOTLIN_TEST_SRC_JAR, OrderRootType.SOURCES, false),
JS_STDLIB_JAR(PathUtil.JS_LIB_JAR_NAME, OrderRootType.CLASSES, true, KotlinPaths::getJsStdLibJarPath),
JS_STDLIB_SRC_JAR(PathUtil.JS_LIB_SRC_JAR_NAME, OrderRootType.SOURCES, false, KotlinPaths::getJsStdLibSrcJarPath);