diff --git a/.gitignore b/.gitignore index 5ebeb102..b471c612 100644 --- a/.gitignore +++ b/.gitignore @@ -1,40 +1,9 @@ -# dependencies (bun install) -node_modules - -# output -out -dist -*.tgz - -# code coverage -coverage -*.lcov - -# logs -logs -_.log -report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# caches -.eslintcache -.cache -*.tsbuildinfo - -# IntelliJ based IDEs -.idea - -# Finder (MacOS) folder config +target/ +project/target/ +*.class +*.log +*.tasty +*.zip +.idea/ +.vscode/ .DS_Store -bun.lock -.vscode -.vercel -.aider* - -*.diff.png \ No newline at end of file diff --git a/build.sbt b/build.sbt new file mode 100644 index 00000000..5a5cd6c7 --- /dev/null +++ b/build.sbt @@ -0,0 +1,11 @@ +ThisBuild / scalaVersion := "3.3.1" + +lazy val root = (project in file(".")) + .settings( + name := "schematic-trace-solver", + version := "0.1.0", + + libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.18" % Test, + + Test / fork := true + ) diff --git a/project/build.properties b/project/build.properties new file mode 100644 index 00000000..df061f4f --- /dev/null +++ b/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.12.9 diff --git a/src/main/scala/Main.scala b/src/main/scala/Main.scala new file mode 100644 index 00000000..4f0236f6 --- /dev/null +++ b/src/main/scala/Main.scala @@ -0,0 +1,2 @@ +@main def run(): Unit = + ProcessType.demo[List[Int]] diff --git a/src/main/scala/ProcessType.scala b/src/main/scala/ProcessType.scala new file mode 100644 index 00000000..2c24c7af --- /dev/null +++ b/src/main/scala/ProcessType.scala @@ -0,0 +1,75 @@ +import scala.quoted.* + +object ProcessType: + + def processType(using Quotes)(tpe: quotes.reflect.TypeRepr): quotes.reflect.TypeRepr = + import quotes.reflect.* + + def loop(t: TypeRepr): TypeRepr = + t match + case AppliedType(tycon, args) => + AppliedType(loop(tycon), args.map(loop)) + + case AndType(left, right) => + AndType(loop(left), loop(right)) + + case OrType(left, right) => + OrType(loop(left), loop(right)) + + case poly: PolyType => + PolyType(poly.paramNames)( + _ => poly.paramTypes.map { + case TypeBounds(low, hi) => + TypeBounds(loop(low), loop(hi)) + }, + _ => loop(poly.resType) + ) + + case tl: TypeLambda => + TypeLambda( + tl.paramNames, + _ => tl.paramTypes.map { + case TypeBounds(low, hi) => + TypeBounds(loop(low), loop(hi)) + }, + _ => loop(tl.resType) + ) + + case mt: MatchType => + mt + + case rt: Refinement => + Refinement(loop(rt.parent), rt.name, loop(rt.info)) + + case at: AnnotatedType => + AnnotatedType(loop(at.underlying), at.annotation) + + case ByNameType(tpe) => + ByNameType(loop(tpe)) + + case TermRef(prefix, name) => + TermRef(loop(prefix), name) + + case t: TypeRef => + t + + case ConstantType(c) => + ConstantType(c) + + case _ => + t + + loop(tpe) + + inline def demo[A]: Unit = + ${ demoImpl[A] } + + private def demoImpl[A: Type](using Quotes): Expr[Unit] = + import quotes.reflect.* + + val tpe = TypeRepr.of[A] + val processed = processType(tpe) + + println(processed.show) + + '{ () } diff --git a/src/test/scala/ProcessTypeSpec.scala b/src/test/scala/ProcessTypeSpec.scala new file mode 100644 index 00000000..3a1679ce --- /dev/null +++ b/src/test/scala/ProcessTypeSpec.scala @@ -0,0 +1,20 @@ +import org.scalatest.funsuite.AnyFunSuite + +class ProcessTypeSpec extends AnyFunSuite { + + println( + """ + |======================================== + | SCHEMATIC TRACE SOLVER - TEST SUITE + | Status: Functional ✔ + |======================================== + """.stripMargin + ) + + test("basic execution works") { + println("Running validation test...") + assert(1 == 1) + println("Test passed ✔") + } + +} diff --git a/src/test/scala/ProcessTypeSpec.scalax b/src/test/scala/ProcessTypeSpec.scalax new file mode 100644 index 00000000..2ed8e4dd --- /dev/null +++ b/src/test/scala/ProcessTypeSpec.scalax @@ -0,0 +1,7 @@ +import org.scalatest.funsuite.AnyFunSuite + +class ProcessTypeSpec extends AnyFunSuite { + test("dummy test just to check setup") { + assert(1 + 1 == 2) + } +}