From 13978482e93f6bba54e5a278b0ff68c294161501 Mon Sep 17 00:00:00 2001 From: Tatsunori Uchino Date: Sun, 27 Aug 2023 11:57:56 +0900 Subject: [PATCH] Add support for Kotlin installed by Scoop --- .../kt/classpath/BackupClassPathResolver.kt | 3 ++- .../kotlin/org/javacs/kt/util/OSContext.kt | 27 +++++++++++++++++++ .../kotlin/org/javacs/kt/util/UnixContext.kt | 9 +++++++ .../org/javacs/kt/util/WindowsContext.kt | 20 ++++++++++++++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 shared/src/main/kotlin/org/javacs/kt/util/OSContext.kt create mode 100644 shared/src/main/kotlin/org/javacs/kt/util/UnixContext.kt create mode 100644 shared/src/main/kotlin/org/javacs/kt/util/WindowsContext.kt diff --git a/shared/src/main/kotlin/org/javacs/kt/classpath/BackupClassPathResolver.kt b/shared/src/main/kotlin/org/javacs/kt/classpath/BackupClassPathResolver.kt index c8b6d6b4..5fd43a0b 100644 --- a/shared/src/main/kotlin/org/javacs/kt/classpath/BackupClassPathResolver.kt +++ b/shared/src/main/kotlin/org/javacs/kt/classpath/BackupClassPathResolver.kt @@ -8,6 +8,7 @@ import java.util.function.BiPredicate import org.javacs.kt.util.tryResolving import org.javacs.kt.util.findCommandOnPath import org.javacs.kt.LOG +import org.javacs.kt.util.OSContext import java.nio.file.Paths /** Backup classpath that find Kotlin in the user's Maven/Gradle home or kotlinc's libraries folder. */ @@ -78,7 +79,7 @@ private fun findKotlinCliCompilerLibrary(name: String): Path? = // alternative library locations like for snap // (can probably just use elvis operator and multiple similar expressions for other install directories) private fun findAlternativeLibraryLocation(name: String): Path? = - Paths.get("/snap/kotlin/current/lib/${name}.jar").existsOrNull() + OSContext.CURRENT_OS.candidateAlternativeLibraryLocations(name).firstNotNullOfOrNull { Paths.get(it).existsOrNull() } private fun Path.existsOrNull() = if (Files.exists(this)) this else null diff --git a/shared/src/main/kotlin/org/javacs/kt/util/OSContext.kt b/shared/src/main/kotlin/org/javacs/kt/util/OSContext.kt new file mode 100644 index 00000000..a54b7e5a --- /dev/null +++ b/shared/src/main/kotlin/org/javacs/kt/util/OSContext.kt @@ -0,0 +1,27 @@ +package org.javacs.kt.util + +/** + * Tasks that depends on user's OS + */ +interface OSContext { + /** + * Suggests the candidate locations of the given JAR + * + * @param name the name of the JAR + * @return the candidate full paths to the JAR + */ + fun candidateAlternativeLibraryLocations(name: String): Array + + companion object { + /** + * Gets the instance for the current OS + */ + val CURRENT_OS by lazy { + val osName = System.getProperty("os.name")!!.lowercase() + when { + osName.contains("windows") -> WindowsContext() + else -> UnixContext() + } + } + } +} diff --git a/shared/src/main/kotlin/org/javacs/kt/util/UnixContext.kt b/shared/src/main/kotlin/org/javacs/kt/util/UnixContext.kt new file mode 100644 index 00000000..47981b41 --- /dev/null +++ b/shared/src/main/kotlin/org/javacs/kt/util/UnixContext.kt @@ -0,0 +1,9 @@ +package org.javacs.kt.util + +/** + * Tasks for other than Windows + */ +class UnixContext : OSContext { + override fun candidateAlternativeLibraryLocations(name: String): Array = // Snap (Linux) + arrayOf("/snap/kotlin/current/lib/${name}.jar") +} diff --git a/shared/src/main/kotlin/org/javacs/kt/util/WindowsContext.kt b/shared/src/main/kotlin/org/javacs/kt/util/WindowsContext.kt new file mode 100644 index 00000000..069ec5df --- /dev/null +++ b/shared/src/main/kotlin/org/javacs/kt/util/WindowsContext.kt @@ -0,0 +1,20 @@ +package org.javacs.kt.util + +/** + * Tasks only for Windows + */ +class WindowsContext : OSContext { + override fun candidateAlternativeLibraryLocations(name: String): Array = // Scoop (https://scoop.sh) + CANDIDATE_PATHS.map { + "$it$name.jar" + }.toTypedArray() + companion object { + /** + * Absolute path to the user's profile folder (home directory) + */ + private val USERPROFILE = System.getenv("USERPROFILE") + private val CANDIDATE_PATHS = arrayOf( + "${USERPROFILE}\\scoop\\apps\\kotlin\\current\\lib\\", + ) + } +}