Change AddKotlinLibQuickFix to support adding multiple jars
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user