Существует немногие ресурсы в сети, которые поучительны в записи плагинов компилятора Scala, что соответствие шаблона против кода, но они не помогают в генерировании кода (создающий деревья символа). Где я должен начать выяснять, как сделать это? (Если бы существует более легкий путь, чем вручную создать деревья символа, мне было бы интересно также.)
Например, я хотел бы, пишут плагин, который заменяет некоторый код простым AST для этого выражения, где переменные (извлеченный из исходного кода программы) могли иметь любой тип:
"" + hello + ", " + world + "!"
Я понимаю, что это может быть хитро из-за упаковки и toString
, например, если hello
был объект и world
если бы интервал были, то это должно действительно быть чем-то как:
"".+(hello.toString().+(", ".+(new Integer(world).toString().+("!"))))
CS193P класс Стэнфорда на iPhone имел проект под названием HelloPoly, который может быть именно тем, что вы хотите - см. домашнюю страницу класса для спецификации, а затем посмотреть видео о том, как он был реализован (и google решения от людей, которые сделали задание).
-121--1881284-Кажется, что интеграционные тесты представляют собой единичные тесты более высокого уровня, поскольку они по-прежнему связываются с одним или несколькими классами. Попробуйте выбрать класс, который зависит от всех других (транзитивно) из группы, и связать тест с таким классом.
Если у вас есть истинные интеграционные тесты, то связь с конкретными классами имеет малую ценность. Затем тесты классифицируются по предметным областям (доменам) приложений и типам функциональности. Например, домены - это заказы, отгрузки, счета-фактуры, права и т.д., а типы функций - транзакционные, веб, сообщения, пакетные и т.д. Их перестановки дадут вам хороший первый раздел о том, как организовать интеграционные тесты.
-121--2733313- При создании дерева перед этапом компилятора стирания
можно ввести hello
и world
с помощью Any
и вызвать на них toString
.
~: cat test.scala
object test {
def f(hello: Any, world: Any) = "" + hello + ", " + world + "!"
f("1", "2")
f(1, 1)
}
~: scalac -Xprint:typer test.scala
[[syntax trees at end of typer]]// Scala source: test.scala
package <empty> {
final object test extends java.lang.Object with ScalaObject {
def this(): object test = {
test.super.this();
()
};
def f(hello: Any, world: Any): java.lang.String = "".+(hello).+(", ").+(world).+("!");
test.this.f("1", "2");
test.this.f(1, 1)
}
}
~: scalac -Xprint:erasure test.scala
[[syntax trees at end of erasure]]// Scala source: test.scala
package <empty> {
final class test extends java.lang.Object with ScalaObject {
def this(): object test = {
test.super.this();
()
};
def f(hello: java.lang.Object, world: java.lang.Object): java.lang.String = "".+(hello).+(", ").+(world).+("!");
test.this.f("1", "2");
test.this.f(scala.Int.box(1), scala.Int.box(1))
}
}
вы можете найти что-то в этом проекте: http://github.com/scala-incubator/autoproxy-plugin