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

replpp.UsingDirectives.scala Maven / Gradle / Ivy

package replpp

import scala.collection.mutable

object UsingDirectives {
  val Prefix = "//> using"
  val LibDirective = s"$Prefix lib "
  val FileDirective = s"$Prefix file "

  def findImportedFilesRecursively(file: os.Path): Seq[os.Path] = {
    def findImportedFilesRecursively0(file: os.Path, visited: Set[os.Path]): Seq[os.Path] = {
      val rootDir: os.Path =
        if (os.isDir(file)) file
        else os.Path(file.toNIO.getParent)

      val importedFiles = findImportedFiles(os.read.lines(file), rootDir)
      val recursivelyImportedFiles = importedFiles.filterNot(visited.contains).flatMap { file =>
        findImportedFilesRecursively0(file, visited + file)
      }
      importedFiles ++ recursivelyImportedFiles
    }

    findImportedFilesRecursively0(file, visited = Set.empty)
  }

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

  def findDeclaredDependencies(source: String): IterableOnce[String] =
    scanFor(LibDirective, source.linesIterator)

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

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy