Генерация Scala кодирует деревья от плагина компилятора Scala

Существует немногие ресурсы в сети, которые поучительны в записи плагинов компилятора Scala, что соответствие шаблона против кода, но они не помогают в генерировании кода (создающий деревья символа). Где я должен начать выяснять, как сделать это? (Если бы существует более легкий путь, чем вручную создать деревья символа, мне было бы интересно также.)

Например, я хотел бы, пишут плагин, который заменяет некоторый код простым AST для этого выражения, где переменные (извлеченный из исходного кода программы) могли иметь любой тип:

"" + hello + ", " + world + "!"

Я понимаю, что это может быть хитро из-за упаковки и toString, например, если hello был объект и world если бы интервал были, то это должно действительно быть чем-то как:

"".+(hello.toString().+(", ".+(new Integer(world).toString().+("!"))))

7
задан ThinkingStiff 24 July 2012 в 20:51
поделиться

2 ответа

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))
  }
}
3
ответ дан 7 December 2019 в 10:01
поделиться

вы можете найти что-то в этом проекте: http://github.com/scala-incubator/autoproxy-plugin

2
ответ дан 7 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: