![JAR search and dependency download from the Maven repository](/logo.png)
dc10.scala.version.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of dc10-scala_native0.5_3 Show documentation
Show all versions of dc10-scala_native0.5_3 Show documentation
A definitional compiler for generating Scala code.
package dc10.scala
import dc10.Renderer
import dc10.scala.Statement.TraitDef.{`trait`, `trait[_]`, `trait[_[_]]`, `trait[_[_], _]`}
import dc10.scala.Symbol.{CaseClass, Extension, Object, Package, Term}
object version:
given `3.3.4`: Renderer[Statement, Error, "scala-3.3.4"] =
new Renderer[Statement, Error, "scala-3.3.4"]:
override def render(input: List[Statement]): String =
input.map(stmt => stmt match
case d@Statement.`case class`(_, _) => renderIndent(d.indent) ++ renderCaseClass(d.caseclass)
case [email protected](_, _) => renderIndent(d.indent) ++ renderExtension(d.extension)
case d@Statement.`object`(_, _) => renderIndent(d.indent) ++ renderObject(d.obj)
case d@Statement.`package`(_, _) => renderIndent(d.indent) ++ renderPackage(d.pkg)
case [email protected].`trait`(_, _) => renderIndent(d.indent) ++ renderTraitDef(d)
case [email protected].`trait[_]`(_, _, _) => renderIndent(d.indent) ++ renderTraitDef(d)
case [email protected].`trait[_[_]]`(_, _, _) => renderIndent(d.indent) ++ renderTraitDef(d)
case [email protected].`trait[_[_], _]`(_, _, _, _) => renderIndent(d.indent) ++ renderTraitDef(d)
case [email protected].`Alias`(_, _) => renderIndent(d.indent) ++ renderTypeDef(d)
case [email protected].`Alias[_]=>>`(_, _) => renderIndent(d.indent) ++ renderTypeDef(d)
case [email protected].`Alias[_]`(_, _, _) => renderIndent(d.indent) ++ renderTypeDef(d)
case [email protected].`Alias[_[_]]`(_, _, _) => renderIndent(d.indent) ++ renderTypeDef(d)
case [email protected].`Alias[_[_], _]`(_, _, _, _) => renderIndent(d.indent) ++ renderTypeDef(d)
case [email protected].`Match`(_, _, _) => renderIndent(d.indent) ++ renderTypeDef(d)
case [email protected].`def`(_, _, _, _, _) => renderIndent(d.indent) ++ renderValueDef(d)
case [email protected].`def[_]`(_, _, _, _) => renderIndent(d.indent) ++ renderValueDef(d)
case [email protected].`def[_[_]]`(_, _, _, _) => renderIndent(d.indent) ++ renderValueDef(d)
case [email protected].`def[_[_], _]`(_, _, _, _, _) => renderIndent(d.indent) ++ renderValueDef(d)
case [email protected](_, _) => renderIndent(d.indent) ++ renderFieldDef(d, input)
case [email protected](_, _, _) => renderIndent(d.indent) ++ renderValueDef(d)
case [email protected].`val`(_, _, _) => renderIndent(d.indent) ++ renderValueDef(d)
case [email protected].`Type`(t) => renderType(t)
case [email protected].`Type[_]`(t) => renderType(t)
case [email protected].`Type[_[_]]`(t) => renderType(t)
case [email protected].`Type[_, _]`(t) => renderType(t)
case [email protected].`Type[_[_], _]`(t) => renderType(t)
case [email protected].`Value`(v) => renderValue(v)
).mkString("\n")
override def renderErrors(errors: List[Error]): String =
errors.map(_.toString()).toList.mkString("\n")
override def version: "scala-3.3.4" =
"scala-3.3.4"
private def renderIndent(i: Int): String =
" ".repeat(i)
private def renderCaseClass[T](cls: CaseClass[T]) =
s"case class ${cls.nme}(${
if cls.fields.length <= 1
then render(cls.fields)
else "\n" ++ render(cls.fields) ++ "\n"
})"
private def renderExtension(ext: Extension) =
s"extension (${render(List(ext.field)).mkString})\n ${render(ext.body)}\n"
private def renderFieldDef[T](d: Statement.ValueDef.Fld[T], input: List[Statement]): String =
if input.length <= 1
then renderValueDef(d)
else renderIndent(d.indent + 1) ++ renderValueDef(d) ++ ","
private def renderObject[T](obj: Object[T]): String =
obj.parent.fold(s"object ${obj.nme}:\n\n${render(obj.body)}")(p =>
s"object ${obj.nme} extends ${renderType(p)}:\n\n${render(obj.body)}"
)
private def renderPackage(pkg: Package): String =
pkg match
case Package.Basic(nme, pkgdef) => s"package ${nme}\n\n${renderPackage(pkgdef.pkg)}"
case Package.Empty(ms) => render(ms)
private def renderType[T](tpe: Term.TypeLevel): String =
tpe match
case Term.TypeLevel.App.`App[_]`(tfun, targ) => s"${renderType(tfun)}[${renderType(targ)}]"
case Term.TypeLevel.App.`App[_[_], _]`(tfun, farg, aarg) => s"${renderType(tfun)}[${renderType(farg)}, ${renderType(aarg)}]"
case Term.TypeLevel.App.`App[_, _]`(tfun, ta, tb) => s"${renderType(tfun)}[${renderType(ta)}, ${renderType(tb)}]"
case Term.TypeLevel.App.`App[_, _, _]`(tfun, ta1, ta2, tb) => s"${renderType(ta1)} ${renderType(tfun)} ${renderType(tb)}"
case Term.TypeLevel.App.Infix(tfun, ta, tb) => s"${renderType(ta)} ${renderType(tfun)} ${renderType(tb)}"
case Term.TypeLevel.App.Infix2(tfun, ta, tb, tc) => s"(${renderType(ta)}, ${renderType(tb)}) ${renderType(tfun)} ${renderType(tc)}"
case Term.TypeLevel.Lam.Lam(ta, tb) => s"[${renderType(ta)}] =>> ${renderType(tb)}"
case Term.TypeLevel.Var.`UserDefinedType`(s, i) => s
case Term.TypeLevel.Var.`UserDefinedType[_]`(s, i) => s
case Term.TypeLevel.Var.`UserDefinedType[_[_]]`(s, i) => s
case Term.TypeLevel.Var.`UserDefinedType[_, _]`(s, i) => s
case Term.TypeLevel.Var.`UserDefinedType[_, _, _]`(s, i) => s
case Term.TypeLevel.Var.`UserDefinedType[_[_], _]`(s, i) => s
private def renderTraitDef[T](traitDef: Statement.TraitDef): String =
traitDef match
case d@`trait`(indent, t) =>
s"""trait ${d.`trait`.nme}:
|${d.`trait`.body.map(s => " " + render(List(s))).mkString("\n")}""".stripMargin
case d@`trait[_]`(indent, tparam, t) =>
s"""trait ${d.`trait`.nme}[${renderType(d.tparam)}]:
|${d.`trait`.body.map(s => " " + render(List(s))).mkString("\n")}""".stripMargin
case d@`trait[_[_]]`(indent, tparam, t) =>
s"""trait ${d.`trait`.nme}[${renderType(d.tparam)}[_]]:
|${d.`trait`.body.map(s => " " + render(List(s))).mkString("\n")}""".stripMargin
case d@`trait[_[_], _]`(indent, tparamF, tparamA, t) =>
s"""trait ${d.`trait`.nme}[${renderType(d.tparamF)}[_], ${renderType(d.tparamA)}]:
|${d.`trait`.body.map(s => " " + render(List(s))).mkString("\n")}""".stripMargin
private def renderTypeDef(typeDef: Statement.TypeDef): String =
typeDef match
case [email protected].`Alias`(i, t) => t.impl.fold(s"type ${renderType(t)}")(i => s"type ${renderType(d.tpe)} = ${renderType(i)}")
case [email protected].`Alias[_]=>>`(i, t) => t.impl.fold(s"type ${renderType(t)}")(i => s"type ${renderType(t)} = ${renderType(i)}")
case [email protected].`Alias[_]`(i, a, t) => t.impl.fold(s"type ${renderType(t)}[${renderType(a)}]")(i => s"type ${renderType(t)}[${renderType(a)}] = ${renderType(i)}")
case [email protected].`Alias[_[_]]`(i, a, t) => t.impl.fold(s"type ${renderType(t)}[${renderType(a)}[_]]")(i => s"type ${renderType(t)}[${renderType(a)}[_]] = ${renderType(i)}")
case [email protected].`Alias[_[_], _]`(_, f, a, t) => t.impl.fold(s"type ${renderType(t)}[${renderType(f)}[_], ${renderType(a)}]")(i => s"type ${renderType(t)}[${renderType(f)}[_], ${renderType(a)}] = ${renderType(i)}")
case [email protected](i, t, l) =>
s"""|type ${renderType(d.tpe)} = ${renderType(d.tpe.aarg)} match
|${d.rhs.map(app => renderIndent(d.indent + 1) ++ "case " ++ renderType(app)).toList.mkString("\n")}""".stripMargin
private def renderValue(value: Term.ValueLevel): String =
value match
case Term.ValueLevel.App.App1(f, a, t) => s"${renderValue(f)}(${renderValue(a)})"
case Term.ValueLevel.App.App2(f, a, b, t) => s"${renderValue(f)}(${renderValue(a)}, ${renderValue(b)})"
case Term.ValueLevel.App.AppPure(f, a, t) => s"${renderValue(f)}(${renderValue(a)})"
case Term.ValueLevel.App.AppVargs(f, t, as*) => s"${renderValue(f)}(${as.map(a => renderValue(a)).mkString(", ")})"
case Term.ValueLevel.App.Dot0(f, a, t) => s"${renderValue(a)}.${renderValue(f)}"
case Term.ValueLevel.App.Dot1(f, a, b, t) => s"${renderValue(a)}.${renderValue(f)}(${renderValue(b)})"
case Term.ValueLevel.App.Dotless(f, a, b, t) => s"${renderValue(a)} ${renderValue(f)} ${renderValue(b)}"
case Term.ValueLevel.App.ForComp(l, v, t) => s"\n for\n${render(l.map(s => s.addIndent))}\n yield ${renderValue(v)}"
case Term.ValueLevel.Lam.Lam1(a, b, t) => s"${renderValue(a)} => ${renderValue(b)}"
case Term.ValueLevel.Lam.Lam2(a1, a2, b, t) => s"(${renderValue(a1)}, ${renderValue(a2)}) => ${renderValue(b)}"
case Term.ValueLevel.Var.BooleanLiteral(tpe, b) => s"$b"
case Term.ValueLevel.Var.IntLiteral(tpe, i) => s"$i"
case Term.ValueLevel.Var.StringLiteral(tpe, s) => s"\"$s\""
case Term.ValueLevel.Var.UnitLiteral(tpe, u) => s"$u"
case Term.ValueLevel.Var.`UserDefinedValue`(s, t, i) => s
case Term.ValueLevel.Var.`UserDefinedValue[_]`(s, _, _) => s
private def renderValueDef(valueDef: Statement.ValueDef): String =
valueDef match
case [email protected].`def`(i, ret, arg, tpe, value) =>
d.impl.fold(
s"def ${renderValue(d.value)}${d.arg.fold("")(a => s"(${renderValue(a)}: ${renderType(a.tpe)})")}: ${renderType(d.tpe)}"
)(
i => s"def ${renderValue(d.value)}${d.arg.fold("")(a => s"(${renderValue(a)}: ${renderType(a.tpe)})")}: ${renderType(d.tpe)} = ${renderValue(i)}"
)
case [email protected].`def[_]`(i, tparam, ret, value) =>
d.impl.fold(
s"def ${renderValue(d.value)}[${renderType(tparam)}]: ${renderType(d.value.tpe)}"
)(
i => s"def ${renderValue(d.value)}[${renderType(tparam)}]: ${renderType(d.value.tpe)} = ${renderValue(i)}"
)
case [email protected].`def[_[_]]`(i, tparam, ret, value) =>
d.impl.fold(
s"def ${renderValue(d.value)}[${renderType(tparam)}[_]]: ${renderType(d.value.tpe)}"
)(
i => s"def ${renderValue(d.value)}[${renderType(tparam)}[_]]: ${renderType(d.value.tpe)} = ${renderValue(i)}"
)
case [email protected].`def[_[_], _]`(i, tparamf, tparama, ret, value) =>
d.impl.fold(
s"def ${renderValue(d.value)}[${renderType(tparamf)}[_], ${renderType(tparama)}]: ${renderType(d.value.tpe)}"
)(
i => s"def ${renderValue(d.value)}[${renderType(tparamf)}[_], ${renderType(tparama)}]: ${renderType(d.value.tpe)} = ${renderValue(i)}"
)
case [email protected](_, _) =>
d.value.impl.fold(
s"${d.value.nme}: ${renderType(d.value.tpe)}"
)(
i => s"${d.value.nme}: ${renderType(d.value.tpe)} = ${renderValue(i)}"
)
case [email protected](_, _, _) =>
s" ${d.value.nme} <- ${renderValue(d.impl)}"
case [email protected].`val`(_, _, _) =>
d.value.impl.fold(
s"val ${d.value.nme}: ${renderType(d.value.tpe)}"
)(
i => s"val ${d.value.nme}: ${renderType(d.value.tpe)} = ${renderValue(i)}"
)
© 2015 - 2025 Weber Informatics LLC | Privacy Policy