From 5efc28ae188d5bdb4a2c3c458144434be2e677eb Mon Sep 17 00:00:00 2001 From: FalsePattern Date: Wed, 16 Apr 2025 00:31:25 +0200 Subject: [PATCH] chore: cache suggestion paths --- .../downloader/LocalToolchainDownloader.kt | 4 +-- .../local/LocalZigToolchainProvider.kt | 30 ++++++++----------- .../zigbrains/shared/downloader/Downloader.kt | 4 +-- .../shared/downloader/LocalSelector.kt | 14 +++++++++ .../lsp/zls/downloader/ZLSDownloader.kt | 4 +-- .../zigbrains/lsp/zls/ui/ZLSDriver.kt | 26 ++++++---------- 6 files changed, 41 insertions(+), 41 deletions(-) diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/downloader/LocalToolchainDownloader.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/downloader/LocalToolchainDownloader.kt index 3cb24106..6a64b47f 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/downloader/LocalToolchainDownloader.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/downloader/LocalToolchainDownloader.kt @@ -24,15 +24,15 @@ package com.falsepattern.zigbrains.project.toolchain.downloader import com.falsepattern.zigbrains.ZigBrainsBundle import com.falsepattern.zigbrains.project.toolchain.local.LocalZigToolchain -import com.falsepattern.zigbrains.project.toolchain.local.getSuggestedLocalToolchainPath +import com.falsepattern.zigbrains.project.toolchain.local.suggestedLocalToolchainPath import com.falsepattern.zigbrains.shared.downloader.Downloader import java.awt.Component class LocalToolchainDownloader(component: Component) : Downloader(component) { override val windowTitle get() = ZigBrainsBundle.message("settings.toolchain.downloader.title") override val versionInfoFetchTitle get() = ZigBrainsBundle.message("settings.toolchain.downloader.progress.fetch") + override val suggestedPath get() = suggestedLocalToolchainPath override fun downloadProgressTitle(version: ZigVersionInfo) = ZigBrainsBundle.message("settings.toolchain.downloader.progress.install", version.version.rawVersion) override fun localSelector() = LocalToolchainSelector(component) override suspend fun downloadVersionList() = ZigVersionInfo.downloadVersionList() - override fun getSuggestedPath() = getSuggestedLocalToolchainPath() } \ No newline at end of file diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/local/LocalZigToolchainProvider.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/local/LocalZigToolchainProvider.kt index dee209ee..c0d951e6 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/local/LocalZigToolchainProvider.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/local/LocalZigToolchainProvider.kt @@ -28,18 +28,18 @@ import com.falsepattern.zigbrains.project.settings.ZigProjectConfigurationProvid import com.falsepattern.zigbrains.project.toolchain.base.ZigToolchain import com.falsepattern.zigbrains.project.toolchain.base.ZigToolchainConfigurable import com.falsepattern.zigbrains.project.toolchain.base.ZigToolchainProvider +import com.falsepattern.zigbrains.shared.downloader.homePath +import com.falsepattern.zigbrains.shared.downloader.xdgDataHome import com.falsepattern.zigbrains.shared.ui.renderPathNameComponent import com.intellij.openapi.project.Project import com.intellij.openapi.util.UserDataHolder import com.intellij.openapi.util.io.toNioPathOrNull import com.intellij.ui.SimpleColoredComponent -import com.intellij.util.system.OS import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.* import java.nio.file.Files import java.nio.file.Path import java.util.* -import kotlin.io.path.isDirectory import kotlin.io.path.pathString class LocalZigToolchainProvider: ZigToolchainProvider { @@ -93,7 +93,7 @@ class LocalZigToolchainProvider: ZigToolchainProvider { Env.empty } val pathToolchains = env.findAllExecutablesOnPATH("zig").mapNotNull { it.parent } - val wellKnown = getWellKnown().asFlow().flatMapConcat { dir -> + val wellKnown = wellKnown.asFlow().flatMapConcat { dir -> runCatching { Files.newDirectoryStream(dir).use { stream -> stream.toList().filterNotNull().asFlow() @@ -112,8 +112,8 @@ class LocalZigToolchainProvider: ZigToolchainProvider { } } -fun getSuggestedLocalToolchainPath(): Path? { - return getWellKnown().getOrNull(0) +val suggestedLocalToolchainPath: Path? by lazy { + wellKnown.getOrNull(0) } /** @@ -130,18 +130,12 @@ fun getSuggestedLocalToolchainPath(): Path? { * * and HOME is the user home path */ -private fun getWellKnown(): List { - val home = System.getProperty("user.home")?.toNioPathOrNull() ?: return emptyList() - val xdgDataHome = when(OS.CURRENT) { - OS.macOS -> home.resolve("Library") - OS.Windows -> System.getenv("LOCALAPPDATA")?.toNioPathOrNull() - else -> System.getenv("XDG_DATA_HOME")?.toNioPathOrNull() ?: home.resolve(Path.of(".local", "share")) - } +private val wellKnown: List by lazy { val res = ArrayList() - if (xdgDataHome != null && xdgDataHome.isDirectory()) { - res.add(xdgDataHome.resolve("zig")) - res.add(xdgDataHome.resolve("zigup")) + xdgDataHome?.let { + res.add(it.resolve("zig")) + res.add(it.resolve("zigup")) } - res.add(home.resolve(".zig")) - return res -} \ No newline at end of file + homePath?.let { res.add(it.resolve(".zig")) } + res +} diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/shared/downloader/Downloader.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/shared/downloader/Downloader.kt index 881f2ba5..914131d6 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/shared/downloader/Downloader.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/shared/downloader/Downloader.kt @@ -76,10 +76,10 @@ abstract class Downloader(val component: Component) { protected abstract val windowTitle: String protected abstract val versionInfoFetchTitle: @NlsContexts.ProgressTitle String + protected abstract val suggestedPath: Path? protected abstract fun downloadProgressTitle(version: V): @NlsContexts.ProgressTitle String protected abstract fun localSelector(): LocalSelector protected abstract suspend fun downloadVersionList(): List - protected abstract fun getSuggestedPath(): Path? @RequiresEdt private fun selectVersion(info: List, selector: LocalSelector): Pair? { @@ -131,7 +131,7 @@ abstract class Downloader(val component: Component) { }) var archiveSizeCell: Cell<*>? = null fun detect(item: V) { - outputPath.text = getSuggestedPath()?.resolve(item.version.rawVersion)?.pathString ?: "" + outputPath.text = suggestedPath?.resolve(item.version.rawVersion)?.pathString ?: "" val size = item.dist.size val sizeMb = size / (1024f * 1024f) archiveSizeCell?.comment?.text = ZigBrainsBundle.message("settings.shared.downloader.archive-size.text", "%.2fMB".format(sizeMb)) diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/shared/downloader/LocalSelector.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/shared/downloader/LocalSelector.kt index 0517f4e3..fc6e97b2 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/shared/downloader/LocalSelector.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/shared/downloader/LocalSelector.kt @@ -41,11 +41,13 @@ import com.intellij.ui.components.textFieldWithBrowseButton import com.intellij.ui.dsl.builder.AlignX import com.intellij.ui.dsl.builder.panel import com.intellij.util.concurrency.annotations.RequiresEdt +import com.intellij.util.system.OS import java.awt.Component import java.nio.file.Path import java.util.concurrent.atomic.AtomicBoolean import javax.swing.Icon import javax.swing.event.DocumentEvent +import kotlin.io.path.isDirectory import kotlin.io.path.pathString abstract class LocalSelector(val component: Component) { @@ -135,4 +137,16 @@ abstract class LocalSelector(val component: Component) { val errorIcon: Icon, val errorText: String, ) +} + +val homePath: Path? by lazy { + System.getProperty("user.home")?.toNioPathOrNull()?.takeIf { it.isDirectory() } +} + +val xdgDataHome: Path? by lazy { + when(OS.CURRENT) { + OS.macOS -> homePath?.resolve("Library") + OS.Windows -> System.getenv("LOCALAPPDATA")?.toNioPathOrNull() + else -> System.getenv("XDG_DATA_HOME")?.toNioPathOrNull() ?: homePath?.resolve(Path.of(".local", "share")) + }?.takeIf { it.isDirectory() } } \ No newline at end of file diff --git a/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/zls/downloader/ZLSDownloader.kt b/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/zls/downloader/ZLSDownloader.kt index b03fed30..18d33632 100644 --- a/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/zls/downloader/ZLSDownloader.kt +++ b/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/zls/downloader/ZLSDownloader.kt @@ -24,7 +24,7 @@ package com.falsepattern.zigbrains.lsp.zls.downloader import com.falsepattern.zigbrains.lsp.ZLSBundle import com.falsepattern.zigbrains.lsp.zls.ZLSVersion -import com.falsepattern.zigbrains.lsp.zls.ui.getSuggestedZLSPath +import com.falsepattern.zigbrains.lsp.zls.ui.suggestedZLSPath import com.falsepattern.zigbrains.project.settings.ZigProjectConfigurationProvider import com.falsepattern.zigbrains.project.settings.ZigProjectConfigurationProvider.IUserDataBridge import com.falsepattern.zigbrains.project.toolchain.base.ZigToolchainConfigurable @@ -34,6 +34,7 @@ import java.awt.Component class ZLSDownloader(component: Component, private val data: IUserDataBridge?) : Downloader(component) { override val windowTitle get() = ZLSBundle.message("settings.downloader.title") override val versionInfoFetchTitle get() = ZLSBundle.message("settings.downloader.progress.fetch") + override val suggestedPath get() = suggestedZLSPath override fun downloadProgressTitle(version: ZLSVersionInfo) = ZLSBundle.message("settings.downloader.progress.install", version.version.rawVersion) override fun localSelector() = ZLSLocalSelector(component) override suspend fun downloadVersionList(): List { @@ -41,5 +42,4 @@ class ZLSDownloader(component: Component, private val data: IUserDataBridge?) : val project = data?.getUserData(ZigProjectConfigurationProvider.PROJECT_KEY) return ZLSVersionInfo.downloadVersionInfoFor(toolchain, project) } - override fun getSuggestedPath() = getSuggestedZLSPath() } \ No newline at end of file diff --git a/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/zls/ui/ZLSDriver.kt b/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/zls/ui/ZLSDriver.kt index 5ab316f7..9e792f0e 100644 --- a/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/zls/ui/ZLSDriver.kt +++ b/lsp/src/main/kotlin/com/falsepattern/zigbrains/lsp/zls/ui/ZLSDriver.kt @@ -33,14 +33,14 @@ import com.falsepattern.zigbrains.lsp.zls.zlsInstallations import com.falsepattern.zigbrains.project.settings.ZigProjectConfigurationProvider import com.falsepattern.zigbrains.project.toolchain.base.ZigToolchainConfigurable.Companion.TOOLCHAIN_KEY import com.falsepattern.zigbrains.shared.UUIDMapSerializable +import com.falsepattern.zigbrains.shared.downloader.homePath +import com.falsepattern.zigbrains.shared.downloader.xdgDataHome import com.falsepattern.zigbrains.shared.ui.* import com.falsepattern.zigbrains.shared.ui.ListElem.One.Actual import com.falsepattern.zigbrains.shared.withUniqueName import com.intellij.openapi.project.Project import com.intellij.openapi.ui.NamedConfigurable import com.intellij.openapi.util.SystemInfo -import com.intellij.openapi.util.io.toNioPathOrNull -import com.intellij.util.system.OS import com.intellij.util.text.SemVer import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow @@ -146,7 +146,7 @@ private fun suggestZLSVersions(project: Project? = null, data: ZigProjectConfigu emitIfCompatible(path, toolchainVersion) } val exe = if (SystemInfo.isWindows) "zls.exe" else "zls" - getWellKnownZLS().forEach { wellKnown -> + wellKnownZLS.forEach { wellKnown -> runCatching { Files.newDirectoryStream(wellKnown).use { stream -> stream.asSequence().filterNotNull().forEach { dir -> @@ -192,8 +192,8 @@ private fun numericVersionEquals(a: SemVer, b: SemVer): Boolean { } -fun getSuggestedZLSPath(): Path? { - return getWellKnownZLS().getOrNull(0) +val suggestedZLSPath: Path? by lazy { + wellKnownZLS.getOrNull(0) } /** @@ -209,17 +209,9 @@ fun getSuggestedZLSPath(): Path? { * * and HOME is the user home path */ -private fun getWellKnownZLS(): List { - val home = System.getProperty("user.home")?.toNioPathOrNull() ?: return emptyList() - val xdgDataHome = when(OS.CURRENT) { - OS.macOS -> home.resolve("Library") - OS.Windows -> System.getenv("LOCALAPPDATA")?.toNioPathOrNull() - else -> System.getenv("XDG_DATA_HOME")?.toNioPathOrNull() ?: home.resolve(Path.of(".local", "share")) - } +private val wellKnownZLS: List by lazy { val res = ArrayList() - if (xdgDataHome != null && xdgDataHome.isDirectory()) { - res.add(xdgDataHome.resolve("zls")) - } - res.add(home.resolve(".zls")) - return res + xdgDataHome?.let { res.add(it.resolve("zls")) } + homePath?.let { res.add(it.resolve(".zls")) } + res } \ No newline at end of file