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, visited: Set[os.Path] = Set.empty): 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 =>
      findImportedFilesRecursively(file, visited + file)
    }
    (importedFiles ++ recursivelyImportedFiles).distinct
  }

  def findImportedFiles(lines: IterableOnce[String], rootPath: os.Path): Seq[os.Path] =
    scanFor(FileDirective, lines).iterator.map(resolveFile(rootPath, _)).toSeq
    
  def findImportedFilesRecursively(lines: IterableOnce[String], rootPath: os.Path): Seq[os.Path] = {
    val results = Seq.newBuilder[os.Path]
    val visited = mutable.Set.empty[os.Path]

    findImportedFiles(lines, rootPath).foreach { file =>
      results += file
      visited += file

      val recursiveFiles = findImportedFilesRecursively(file, visited.toSet)
      results ++= recursiveFiles
      visited ++= recursiveFiles
    }

    results.result().distinct
  }

  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