Комментарии 11
А AST нельзя обходить с помощью Visitor или Listener?
Остался только небольшой вопрос — как это все вызывается в реальном мире? Видел в коде костыли типа предложенного в официальном мануале:
//go:generate go tool yacc -o gopher.go -p parser gopher.y
но там не очень понятна связь генератора с тем местом, где а) он будет вызываться, б) где генерируемое будет использоваться.
Идея хороша, только выглядит чуть менее прозрачно, чем можно было бы.
Смысл того, что делается — автоматическая генерация конструктора. И весьма костыльно выглядит рождение коллекции объектов одного типа по методу у рандомного объекта этого типа.
То есть вместо Colors{}.List()
более понятно для незнакомого с кодом человека генерировать обычную функцию ListOfAllColors()
Хотя, дело вкуса, наверное.
А если при добавлении константы забыть вызвать генератор? Чем это лучше, чем забыть обновить вручную написанную функцию? Или генерация автоматически происходит?
Всегда писать go generate && go build, с учетом того, что в 99% запусков ничего перегенерировать не надо? Разработчики будут забивать, ввиду бессмысленности, что таки чревато.
Гошная кодогенерация разве поощряется на уровне сборки/ci? Вроде же все пишут что надо сгенерированное коммитить в vcs.
Возможно в дальнейшем автозапуск go generate добавят например на уровне плагинов, например idea при коммите в vcs предварительно автоматически умеет запускать go fmt.
Кодогенерация в языке Go