Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 8 additions & 39 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -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
11 changes: 11 additions & 0 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -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
)
1 change: 1 addition & 0 deletions project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version=1.12.9
2 changes: 2 additions & 0 deletions src/main/scala/Main.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@main def run(): Unit =
ProcessType.demo[List[Int]]
75 changes: 75 additions & 0 deletions src/main/scala/ProcessType.scala
Original file line number Diff line number Diff line change
@@ -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)

'{ () }
20 changes: 20 additions & 0 deletions src/test/scala/ProcessTypeSpec.scala
Original file line number Diff line number Diff line change
@@ -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 ✔")
}

}
7 changes: 7 additions & 0 deletions src/test/scala/ProcessTypeSpec.scalax
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import org.scalatest.funsuite.AnyFunSuite

class ProcessTypeSpec extends AnyFunSuite {
test("dummy test just to check setup") {
assert(1 + 1 == 2)
}
}
Loading