From f4de2c81f2c122037bf1779bfc1ab79423d7a5c7 Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Fri, 20 Nov 2020 18:43:39 -0500 Subject: [PATCH] Add support for getting classpath from kscript kts It acts pretty much like Maven, using most of the same resolution logic, but reads the targets from the script file with a prefix of "//DEPS ". --- .../kt/classpath/DefaultClassPathResolver.kt | 1 + .../kt/classpath/KScriptClassPathResolver.kt | 39 +++++++++++++++++++ .../kt/classpath/MavenClassPathResolver.kt | 2 +- 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 shared/src/main/kotlin/org/javacs/kt/classpath/KScriptClassPathResolver.kt diff --git a/shared/src/main/kotlin/org/javacs/kt/classpath/DefaultClassPathResolver.kt b/shared/src/main/kotlin/org/javacs/kt/classpath/DefaultClassPathResolver.kt index 9f4f40a9c..3040c9cc0 100644 --- a/shared/src/main/kotlin/org/javacs/kt/classpath/DefaultClassPathResolver.kt +++ b/shared/src/main/kotlin/org/javacs/kt/classpath/DefaultClassPathResolver.kt @@ -59,4 +59,5 @@ private fun ignoredPathPatterns(path: Path): List = private fun asClassPathProvider(path: Path): ClassPathResolver? = MavenClassPathResolver.maybeCreate(path) ?: GradleClassPathResolver.maybeCreate(path) + ?: KScriptClassPathResolver.maybeCreate(path) ?: ShellClassPathResolver.maybeCreate(path) diff --git a/shared/src/main/kotlin/org/javacs/kt/classpath/KScriptClassPathResolver.kt b/shared/src/main/kotlin/org/javacs/kt/classpath/KScriptClassPathResolver.kt new file mode 100644 index 000000000..dab9363b5 --- /dev/null +++ b/shared/src/main/kotlin/org/javacs/kt/classpath/KScriptClassPathResolver.kt @@ -0,0 +1,39 @@ +package org.javacs.kt.classpath + +import org.javacs.kt.LOG +import java.nio.file.Path + +/** Resolver for reading maven dependencies */ +internal class KScriptClassPathResolver private constructor(private val script: Path) : ClassPathResolver { + override val resolverType: String = "KScript" + override val classpath: Set get() { + val artifacts = readKScriptDependencyList(script) + + when { + artifacts.isEmpty() -> LOG.warn("No artifacts found in {}", script) + artifacts.size < 5 -> LOG.info("Found {} in {}", artifacts, script) + else -> LOG.info("Found {} artifacts in {}", artifacts.size, script) + } + + return artifacts.mapNotNull { findMavenArtifact(it, false) }.toSet() + } + + companion object { + /** Create a maven resolver if a file is a pom. */ + fun maybeCreate(file: Path): KScriptClassPathResolver? = + file.takeIf { + it.toString().endsWith("kts") && + it.toFile().bufferedReader().use { b -> b.readLine().contains("kscript") } + }?.let { KScriptClassPathResolver(file) } + } +} + +private val artifactPattern = "^//DEPS .*".toRegex() + +private fun readKScriptDependencyList(script: Path): Set = + script.toFile() + .readLines() + .filter { artifactPattern.matches(it) } + .flatMap { it.substring("//DEPS ".length).split(",") } + .map { parseMavenArtifact(it) } + .toSet() diff --git a/shared/src/main/kotlin/org/javacs/kt/classpath/MavenClassPathResolver.kt b/shared/src/main/kotlin/org/javacs/kt/classpath/MavenClassPathResolver.kt index bd4705ae5..2d39789ac 100644 --- a/shared/src/main/kotlin/org/javacs/kt/classpath/MavenClassPathResolver.kt +++ b/shared/src/main/kotlin/org/javacs/kt/classpath/MavenClassPathResolver.kt @@ -40,7 +40,7 @@ private fun readMavenDependencyList(mavenOutput: Path): Set = .map { parseMavenArtifact(it) } .toSet() -private fun findMavenArtifact(a: Artifact, source: Boolean): Path? { +internal fun findMavenArtifact(a: Artifact, source: Boolean): Path? { val result = mavenHome.resolve("repository") .resolve(a.group.replace('.', File.separatorChar)) .resolve(a.artifact)