All Downloads are FREE. Search and download functionalities are using the official Maven repository.

metabrowse.server.Sourcepath.scala Maven / Gradle / Ivy

package metabrowse.server

import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths

/**
  * A sourcepath contains `*.{class,java,scala}` files of a project.
  *
  * @param classpath the regular JVM classpath of this project, containing
  *                  `*.class` files that can be used to compile the project.
  *                  Must match the `-classpath` argument passed to the Scala
  *                  compiler.
  * @param sources the accompanying sources.jar files for this project that
  *                are published under the "sources" classifier.
  */
case class Sourcepath(classpath: List[Path], sources: List[Path])

object Sourcepath {

  /** Use coursier to fetch the classpath and sources of an artifact.
    *
    * @param artifact the artifact name, for example
    *                 - org.scala-lang:scala-library:2.12.7
    *                 - org.scalameta:scalameta_2.12:4.0.0
    */
  def apply(artifacts: List[String]): Sourcepath = {
    Sourcepath(
      classpath = coursierFetch(artifacts),
      sources = jdkSources().toList ++
        coursierFetch(artifacts ++ List("--classifier", "sources"))
    )
  }
  def apply(artifact: String): Sourcepath = {
    Sourcepath(List(artifact))
  }

  /** The sources of the JDK, for example `java/lang/String.java` */
  def jdkSources(): Option[Path] = {
    for {
      javaHome <- sys.props.get("java.home")
      srcZip = Paths.get(javaHome).getParent.resolve("src.zip")
      if Files.isRegularFile(srcZip)
    } yield srcZip
  }

  private[metabrowse] def coursierFetchCompilerPlugin(
      artifact: String
  ): Path = {
    coursierFetch(List("--intransitive", artifact)).headOption.getOrElse {
      sys.error(artifact)
    }
  }
  private[metabrowse] def coursierFetch(extra: List[String]): List[Path] = {
    sys.process
      .Process(List("coursier", "fetch") ++ extra)
      .!!
      .trim
      .linesIterator
      .map(jar => Paths.get(jar))
      .toList
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy