// Ammonite REPL import $ivy.`org.scalameta::scalameta:4.2.3`, scala.meta._ val program = """object Main extends App { print("Hello!") }""" val tree = program.parse[Source].get println(tree.syntax) println( "object Main {".parse[Source] ) val path = java.nio.file.Paths.get("example.scala") val bytes = java.nio.file.Files.readAllBytes(path) val text = new String(bytes, "UTF-8") val input = Input.VirtualFile(path.toString, text) val exampleTree = input.parse[Source].get print(exampleTree.syntax) println( Input.VirtualFile("example.scala", "object Main {").parse[Source] ) println("a + b".parse[Stat].get.structure) println("a + b".parse[Source]) println("A with B".parse[Type].get.structure) println("A with B".parse[Stat]) val buildSbt = """ val core = project val cli = project.dependsOn(core) """ println(buildSbt.parse[Source]) println(dialects.Sbt1(buildSbt).parse[Source].get.stats) println( dialects.Sbt1( Input.VirtualFile("build.sbt", buildSbt) ).parse[Source].get.stats ) println(buildSbt.parse[Stat]) println( dialects.Sbt1("package library; object Main").parse[Source] ) println(Term.Apply(Term.Name("function"), List(Term.Name("argument")))) println("function(argument)".parse[Stat].get.structure) println(q"function(argument)".structure) println( q""" object Example extends App { println(42) } """.structure ) println(q"function ( argument ) // comment") val left = q"Left()" val right = q"Right()" println(q"$left + $right") val arguments = List(q"arg1", q"arg2") println(q"function(..$arguments)") val arguments2 = List(q"arg3", q"arg4") val allArguments = List(arguments, arguments2) println(q"function(...$allArguments)") val typeArguments = List.empty[Type] q"function[..$typeArguments]()" println( (if (typeArguments.isEmpty) q"function()" else q"function[..$typeArguments]()").structure ) "function(arg1, arg2)".parse[Term].get match { case Term.Apply(function, List(arg1, arg2)) => println("1 " + function) println("2 " + arg1) println("3 " + arg2) } Term.Apply( Term.Name("function"), List(Term.Name("arg1"), Term.Name("arg2")) ) match { case q"$function(..$args)" => println("1 " + function) println("2 " + args) } "function(arg1, arg2)(arg3, arg4)".parse[Term].get match { case q"$function(...$args)" => println("1 " + function) println("2 " + args) } q"final val x = 2" match { case q"val x = 2" => // boom! } q"final val x = 2" match { case q"$_ val x = 2" => println("OK") } "true".parse[Term].get == q"true" q"true" == q"true" { val treeReference = q"true" treeReference == treeReference } q"true" match { case q"true" => println("YAY!") } q"true".structure == q"true".structure import scala.meta.contrib._ q"true".isEqual(q"true") q"val x = 2".traverse { case node => println(s"${node.productPrefix}: $node") } q"val x = 2".collect { case node => node.productPrefix -> node.toString } val traverser = new Traverser { override def apply(tree: Tree): Unit = tree match { case Pat.Var(name) => println(s"stop: $name") case node => println(s"${node.productPrefix}: $node") super.apply(node) } } traverser(q"val x = 2") println( q"val x = 2".transform { case q"2" => q"42" } ) q"a + b".transform { case name @ Term.Name("b") => q"function($name)" }.toString // [error] java.lang.StackOverflowError // at scala.meta.transversers.Api$XtensionCollectionLikeUI$transformer$2$.apply(Api.scala:10) // at scala.meta.transversers.Transformer.apply(Transformer.scala:4) val transformer = new Transformer { override def apply(tree: Tree): Tree = tree match { case name @ Term.Name("b") => q"function($name)" case node => super.apply(node) } } println( transformer(q"a + b") )