diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/KFiles.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/KFiles.kt index f90017ad..5e8aa629 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/KFiles.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/KFiles.kt @@ -265,7 +265,7 @@ class KFiles { fun copy(from: InputStream, to: OutputStream) { var read = from.read() - while (from.available() > 0 && read != -1) { + while (read != -1) { to.write(read) read = from.read() } diff --git a/src/main/kotlin/com/beust/kobalt/app/IdeaFilesTemplate.kt b/src/main/kotlin/com/beust/kobalt/app/IdeaFilesTemplate.kt index 3ffcde1d..884b1188 100644 --- a/src/main/kotlin/com/beust/kobalt/app/IdeaFilesTemplate.kt +++ b/src/main/kotlin/com/beust/kobalt/app/IdeaFilesTemplate.kt @@ -26,13 +26,14 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { companion object { val IDEA_DIR = File(".idea").apply { mkdirs() } + val KOTLIN_JAVA_RUNTIME = "KotlinJavaRuntime" } override fun generateTemplate(args: Args, classLoader: ClassLoader) { val dependencyData = Kobalt.INJECTOR.getInstance(DependencyData::class.java) val data = dependencyData.dependenciesDataFor(Constants.BUILD_FILE_PATH, args) val outputDir = File(".")// KFiles.makeDir(".")//KFiles.makeDir(homeDir("t/idea")) - generateLibraries(data, outputDir) + generateLibraries(classLoader, data, outputDir) generateModulesXml(data, outputDir) generateImlFiles(classLoader, data, outputDir) generateMiscXml(classLoader, outputDir) @@ -42,7 +43,6 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { KFiles.joinDir(ITemplateContributor.DIRECTORY_NAME, templateName, fileName) private fun writeTemplate(classLoader: ClassLoader, outputDir: File, fileName: String) { - log(2, "Opening template " + templatePath(fileName)) val ins = classLoader.getResource(templatePath(fileName)).openConnection().inputStream val outputFile = File(KFiles.joinDir(outputDir.absolutePath, fileName)) outputFile.parentFile.mkdir() @@ -82,10 +82,10 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { fun sourceDir(dir: String, isTest: Boolean) = " " - project.sourceDirs.forEach { sourceDir -> + project.sourceDirs.filter { File(it).exists() }.forEach { sourceDir -> add(sourceDir(sourceDir, false)) } - project.testDirs.forEach { sourceDir -> + project.testDirs.filter { File(it).exists() }.forEach { sourceDir -> add(sourceDir(sourceDir, true)) } @@ -102,6 +102,13 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { (project.name + TEST_SUFFIX).let { add(" ") } + val isKotlin = true + if (isKotlin) { + add(" ") + add(" ") + } // // Dependent projects @@ -148,18 +155,19 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { private val COMPILE_SUFFIX = " (Compile)" private val TEST_SUFFIX = " (Test)" - private fun generateLibraries(data: DependencyData.GetDependenciesData, outputDir: File) { + private fun generateLibraries(classLoader: ClassLoader, data: DependencyData.GetDependenciesData, outputDir: File) { data.projects.forEach { - generateLibrary(it.name, it.compileDependencies, COMPILE_SUFFIX, outputDir) - generateLibrary(it.name, it.testDependencies, TEST_SUFFIX, outputDir) + generateLibrary(classLoader, it.name, it.compileDependencies, COMPILE_SUFFIX, outputDir) + generateLibrary(classLoader, it.name, it.testDependencies, TEST_SUFFIX, outputDir) } val kobaltDd = DependencyData.DependencyData("kobalt", "compile", KFiles.joinDir(KFiles.distributionsDir, Kobalt.version, "kobalt", "wrapper", "kobalt-${Kobalt.version}.jar")) - generateLibrary("kobalt.jar", listOf(kobaltDd), "", outputDir) + generateLibrary(classLoader, "kobalt.jar", listOf(kobaltDd), "", outputDir) } - private fun generateLibrary(name: String, compileDependencies: List, + private fun generateLibrary(classLoader: ClassLoader, name: String, + compileDependencies: List, suffix: String, outputDir: File) { val libraryName = name + suffix val librariesOutputDir = KFiles.joinAndMakeDir(IDEA_DIR.path, outputDir.path, "libraries") @@ -175,6 +183,10 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { .replace(".", "_") writeFile(this, File(librariesOutputDir, fileName + ".xml")) } + + if (compileDependencies.any { it.id.contains("kotlin") }) { + generateKotlinJavaRuntime(classLoader, outputDir) + } } private fun generateList(libraries: List, tag: String) : List { @@ -185,12 +197,12 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { result.add(" <$tag>") libraries.forEach { val path = - if (it.path.contains(".kobalt")) { - val ind = it.path.indexOf(".kobalt") - "\$USER_HOME$/" + it.path.substring(ind) - } else { - it.path - } + if (it.path.contains(".kobalt")) { + val ind = it.path.indexOf(".kobalt") + "\$USER_HOME$/" + it.path.substring(ind) + } else { + it.path + } result.add(" ") } @@ -200,6 +212,17 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { } } + private fun generateKotlinJavaRuntime(classLoader: ClassLoader, outputDir: File) { + writeTemplate(classLoader, + File(KFiles.joinDir(outputDir.path, IDEA_DIR.path, "libraries")), "KotlinJavaRuntime.xml") + with(File(outputDir.path, "lib")) { + mkdirs() + listOf("reflect", "runtime-sources", "runtime").forEach { + writeTemplate(classLoader, File(outputDir, path), "kotlin-$it.jar") + } + } + } + private fun writeFile(lines: List, file: File) { file.writeText(lines.joinToString("\n")) log(2, "Created ${file.absolutePath}")