
scala.build.input.Element.scala Maven / Gradle / Ivy
package scala.build.input
import scala.build.preprocessing.ScopePath
import scala.util.matching.Regex
sealed abstract class Element extends Product with Serializable
sealed trait SingleElement extends Element
sealed trait AnyScript extends Element
sealed abstract class OnDisk extends Element {
def path: os.Path
}
sealed abstract class Virtual extends SingleElement {
def content: Array[Byte]
def source: String
def subPath: os.SubPath = {
val idx = source.lastIndexOf('/')
os.sub / source.drop(idx + 1)
}
def scopePath: ScopePath =
ScopePath(Left(source), subPath)
}
object Virtual {
val urlPathWithQueryParamsRegex = "https?://.*/([^/^?]+)(/?.*)?$".r
def apply(path: String, content: Array[Byte]): Virtual = {
val filename = path match {
case urlPathWithQueryParamsRegex(name, _) => name
case _ => path.split("/").last
}
val wrapperPath = os.sub / filename
if filename.endsWith(".scala") then VirtualScalaFile(content, path)
else if filename.endsWith(".java") then VirtualJavaFile(content, path)
else if filename.endsWith(".sc") then VirtualScript(content, path, wrapperPath)
else if filename.endsWith(".md") then VirtualMarkdownFile(content, path, wrapperPath)
else VirtualData(content, path)
}
}
sealed abstract class VirtualSourceFile extends Virtual {
def isStdin: Boolean = source.startsWith("")
def isSnippet: Boolean = source.startsWith("")
protected def generatedSourceFileName(fileSuffix: String): String =
if (isStdin) s"stdin$fileSuffix"
else if (isSnippet) s"${source.stripPrefix("-")}$fileSuffix"
else s"virtual$fileSuffix"
}
sealed trait SingleFile extends OnDisk with SingleElement
sealed trait SourceFile extends SingleFile {
def subPath: os.SubPath
}
sealed trait Compiled extends Element
sealed trait AnyScalaFile extends Compiled
sealed trait AnyJavaFile extends Compiled
sealed trait AnyMarkdownFile extends Compiled
sealed trait ScalaFile extends AnyScalaFile {
def base: os.Path
def subPath: os.SubPath
def path: os.Path = base / subPath
}
final case class Script(base: os.Path, subPath: os.SubPath, inputArg: Option[String])
extends OnDisk with SourceFile with AnyScalaFile with AnyScript {
lazy val path: os.Path = base / subPath
}
final case class SourceScalaFile(base: os.Path, subPath: os.SubPath)
extends OnDisk with SourceFile with ScalaFile
final case class ProjectScalaFile(base: os.Path, subPath: os.SubPath)
extends OnDisk with SourceFile with ScalaFile
final case class JavaFile(base: os.Path, subPath: os.SubPath)
extends OnDisk with SourceFile with AnyJavaFile {
lazy val path: os.Path = base / subPath
}
final case class JarFile(base: os.Path, subPath: os.SubPath)
extends OnDisk with SourceFile {
lazy val path: os.Path = base / subPath
}
final case class CFile(base: os.Path, subPath: os.SubPath)
extends OnDisk with SourceFile with Compiled {
lazy val path: os.Path = base / subPath
}
final case class MarkdownFile(base: os.Path, subPath: os.SubPath)
extends OnDisk with SourceFile with AnyMarkdownFile {
lazy val path: os.Path = base / subPath
}
final case class Directory(path: os.Path) extends OnDisk with Compiled
final case class ResourceDirectory(path: os.Path) extends OnDisk
final case class VirtualScript(content: Array[Byte], source: String, wrapperPath: os.SubPath)
extends VirtualSourceFile with AnyScalaFile with AnyScript
object VirtualScript {
val VirtualScriptNameRegex: Regex = "(^stdin$|^snippet\\d*$)".r
}
final case class VirtualScalaFile(content: Array[Byte], source: String)
extends VirtualSourceFile with AnyScalaFile {
def generatedSourceFileName: String = generatedSourceFileName(".scala")
}
final case class VirtualJavaFile(content: Array[Byte], source: String)
extends VirtualSourceFile with AnyJavaFile {
def generatedSourceFileName: String = generatedSourceFileName(".java")
}
final case class VirtualMarkdownFile(
content: Array[Byte],
override val source: String,
wrapperPath: os.SubPath
) extends VirtualSourceFile with AnyMarkdownFile
final case class VirtualData(content: Array[Byte], source: String)
extends Virtual
© 2015 - 2025 Weber Informatics LLC | Privacy Policy