From 546040fafd4576af490dc3610fb8b793909b69fe Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 11 Apr 2017 14:43:53 +0200 Subject: [PATCH] Change AddKotlinLibQuickFix to support adding multiple jars --- .../org/jetbrains/kotlin/utils/PathUtil.java | 2 + .../idea/inspections/AddKotlinLibQuickFix.kt | 49 +++++++++---------- .../idea/versions/KotlinRuntimeLibraryUtil.kt | 2 + 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/PathUtil.java b/compiler/util/src/org/jetbrains/kotlin/utils/PathUtil.java index 67e8e2e9604..31de8e900a9 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/PathUtil.java +++ b/compiler/util/src/org/jetbrains/kotlin/utils/PathUtil.java @@ -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"); diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/AddKotlinLibQuickFix.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/AddKotlinLibQuickFix.kt index 3d3cb9bf000..4865fb64161 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/AddKotlinLibQuickFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/AddKotlinLibQuickFix.kt @@ -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(element) { +abstract class AddKotlinLibQuickFix(element: KtElement, + val libraryJarDescriptors: List) : KotlinQuickFixAction(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 = 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() ?: 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() diff --git a/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.kt b/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.kt index cb0ee02dac1..f6919be23a6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.kt @@ -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);