TASTy 검사
TASTy 검사 (TASTy Inspection)
TASTy 파일에는 클래스의 완전한 타입이 부여된 트리(typed tree)가 담겨 있어요. 소스 코드의 위치 정보와 문서까지 포함돼 있죠. 그래서 코드에서 의미 정보(semantic information)를 분석하거나 뽑아내는 도구를 만들 때 아주 적합해요.
libraryDependencies += "org.scala-lang" %% "scala3-tasty-inspector" % scalaVersion.value
본문
TASTy 파일을 직접 다룰 때의 번거로움을 피하기 위해 Inspector를 제공해요. 이 도구는 TASTy 파일의 내용을 불러와서 TASTy reflect API를 통해 접근할 수 있게 해 주죠. 그리고 TASTy를 시각적으로 살펴볼 수 있는 TASTyViz라는 시각화 도구도 소개할게요. 디버깅을 하거나 TASTy에 대한 이해를 점검할 때 유용하답니다.
TASTyViz
TASTyViz는 TASTy 파일을 시각적으로 검사하는 도구예요. 이 글을 쓰는 시점 기준으로 아직 개발 초기 단계라서 빠진 기능이나 다소 불편한 사용자 경험을 기대할 수 있어요. 그래도 디버깅할 때는 꽤 쓸모가 있죠. 여기에서 확인할 수 있어요.
Inspector
Inspector는 TASTy에 API로 접근할 수 있게 해 주는 도구예요.
sbt 빌드에 의존성을 다음과 같이 추가하면 돼요:
libraryDependencies += "org.scala-lang" %% "scala3-tasty-inspector" % scalaVersion.value
TASTy 파일의 트리를 검사하려면 소비자(consumer)를 아래처럼 정의하면 돼요:
import scala.quoted.*
import scala.tasty.inspector.*
class MyInspector extends Inspector:
def inspect(using Quotes)(tastys: List[Tasty[quotes.type]]): Unit =
import quotes.reflect.*
for tasty <- tastys do
val tree = tasty.ast
// Do something with the tree
그리고 이 소비자를 아래 코드로 인스턴스화하면 foo/Bar.tasty 파일의 트리를 얻을 수 있어요:
object Test:
def main(args: Array[String]): Unit =
val tastyFiles = List("foo/Bar.tasty")
TastyInspector.inspectTastyFiles(tastyFiles)(new MyInspector)
여기서 주의할 점이 하나 있어요. 컴파일 이후에 main을 실행하려면(아래 예시에서는 Test라는 객체에 정의돼 있죠) 컴파일러를 런타임에서 사용할 수 있게 해 줘야 해요:
scalac -d out Test.scala
scala -with-compiler -classpath out Test
템플릿 프로젝트
sbt 버전 1.1.5 이상을 쓰고 있다면 다음처럼 하면 돼요:
sbt new scala/scala3-tasty-inspector.g8