хотел улучшить существующую макро аннотацию:
// метод-пустышка, чтобы было удобно работать в IDEA
def gen[A](desc: String, short: Char = '\u0000'): ScallopOption[A] = ???
@scallop
val someOption = gen[Int](desc = "Some option description", short = 'd')
@scallop аннотация матчится и извлекает desc short, тайп-параметр, имя переменной и генерит код, чтобы создать scallop опцию.
Вся эта машинерия нужна для того, чтобы снизить количество бойлерплейта и еще некую попутную машинерию.
Я хотел добавить еще один параметр: validate: A => Boolean в gen, но проблема в том, что я не могу нормализовать в единый вид вызов gen при разборе AST, так как gen можно вызывать разными способами:
gen[Int](short = 'a', desc = "blah")
gen[Int]("blah")
gen[Int]("blah", 'a')
gen[Int]("blah", short = 'a')
с 2-мя параметрами парсинг AST еще не выглядит сложным, но при добавлении 3-го все начинает превращаться в кашу, так как слишком много вариантов вызова gen.
Насколько я понял мне бы помог c.typecheck(), но оказалось, что он хреново работает с макро аннотациями и лучше использовать его в макро-функциях: https://github.com/scalamacros/paradise/issues/67
Ох, че-ж вся разметка так поехала
какое конкретно дерево
Обсуждают сегодня