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

replpp.UsingDirectives.scala Maven / Gradle / Ivy

The newest version!
package replpp

import java.nio.file.{Files, Path}
import scala.collection.mutable

object UsingDirectives {
  private val Prefix    = "//> using"
  val LibDirective      = s"$Prefix dep "
  val FileDirective     = s"$Prefix file "
  val ResolverDirective = s"$Prefix resolver"
  val ClasspathDirective = s"$Prefix classpath"

  def findImportedFilesRecursively(path: Path, visited: Set[Path] = Set.empty): Seq[Path] = {
    val rootDir: Path =
      if (Files.isDirectory(path)) path
      else path.toAbsolutePath.getParent

    val importedFiles = findImportedFiles(util.linesFromFile(path), rootDir)
    val recursivelyImportedFiles = importedFiles.filterNot(visited.contains).flatMap { file =>
      findImportedFilesRecursively(file, visited + file)
    }
    (importedFiles ++ recursivelyImportedFiles).distinct
  }

  def findImportedFiles(lines: IterableOnce[String], rootPath: Path): Seq[Path] =
    scanFor(FileDirective, lines).iterator.map(resolveFile(rootPath, _)).toSeq

  def findDeclaredDependencies(lines: IterableOnce[String]): Seq[String] =
    scanFor(LibDirective, lines)

  def findResolvers(lines: IterableOnce[String]): Seq[String] =
    scanFor(ResolverDirective, lines)

  def findClasspathEntriesInLines(sourceLines: IterableOnce[String], relativeTo: Path): Seq[Path] = {
    for {
      classpathEntry <- scanFor(ClasspathDirective, sourceLines)
      pathRelativeToDeclaringFile = relativeTo.resolve(classpathEntry)
    } yield pathRelativeToDeclaringFile
  }

  def findClasspathEntriesInFiles(files: IterableOnce[Path]): Seq[Path] = {
    files.iterator.flatMap { file =>
      val dir = file.getParent
      findClasspathEntriesInLines(util.linesFromFile(file), dir)
    }.toSeq
  }

  private def scanFor(directive: String, lines: IterableOnce[String]): Seq[String] = {
    lines
      .iterator
      .map(_.trim)
      .filter(_.startsWith(directive))
      .map(_.drop(directive.length).trim)
      .toSeq
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy