Мы начали с Владом переписку по почте с обсуждением различных вопросов, но Влад предложил вынести обсуждение на форум, чтобы если будут интересные ответы, которые могли бы быть полезны другим. Начали обсуждение с вопроса о Peg, парсере для текстового языка диаграмм состояний, а также проблем генерации исходников в макросах. Сейчас продолжаю задавать вопросы Владу, ребятам создававшим Nemerle.Peg и CSharpParser, и всему сообществу. На обсуждение вопрос о генерации исходника из дерева.
Есть встроенный генератор для отладочных нужд, типа TypeBuilder.DefineWithSource, но он не поддерживает вложенные типы, верхние объявления, которые должны добавляться в TypeBuilder методами DefineNested, но исходника никак не сделать для отладки, за отсутствием метода с приставкой WithSource. Код методов худо бедно генерится PrettyPrint ом.
Поэтому было бы неплохо доделать полноценную генерацию для верхних типов TopDeclaration, вложенных и всего остального, чтобы можно было делать качественные отладочные исходники. А также приятный плюс впридачу к парсингу C# и использованию в проектах Nemerle, конвертить C# в исходник Nemerle, благо большая часть уже готова, то есть PrettyPrint.
За все это я решил взяться, и уже начал работать, потому что потребность назрела, и возник ряд насущных вопросов в связи с этим.
1) При использовании конвертера CSharpToNemerle который получает в результате Ast Nemerle, ему на вход в конструкторе требуется ManagerClass, откуда его взять? Если мы в обычной программе, а не в макросе, Создать самому? Он инициализирует некоторые структуры только при вызове Run, как его инициализировать до этого, чтобы полноценно распарсить C# и получить Ast Nemerle для последующей обработки?
2) Куда все это положить, я начал делать у себя в своей папке, думаю сделать метод PrintBody в TopDeclaration как в методе ClassMember, сам TopDeclaration сделать partial и вынести код печати в отдельный исходник, которому как в ClassMember передается LocatableTextWriter, и он сам себя должен распечатать в него. То есть объединить генерацию исходника Nemerle из C# с генерацией обычного отладочного кода Nemerle, чтобы не делать двойную работу. Может кто придумает вариант с местоположением лучше.
3) Исходник в parsetree ncc будет наверное называться TreePrint.n, или PrintTree.n есть у кого варианты лучше?
4) Ничего если я сделаю открытыми типы LocatableTextWriter и LocatingTextWriter в Nemerle.Compiler чтобы работать из внешнего кода с ними, из своей библиотеки, чтобы тестить код без перекомпиляции всего Nemerle?
5) Также для этого нужен открытым метод ClassMember.PrintBody можно ли его открыть, или это даст брешь в архитектуре компилятора?
6) Встает проблема с генерацией namespace, парсер CSharpToNemerle в результате дает ParseResult в котором есть список TopDeclaration, понятно что каждый из них находиться в своем namespace может в одном а может и в разных. Тут надо как то придумать как создавать пространства имен, как в исходном тексте C#, если есть Location можно как то отсортировать по ним сами пространства, а потом вложить их друг в друга как они должны быть и в них раскрывать TopDeclaration, может кто предложит вариант лучше?
Прошу простить если кого смутит большое навороченное сообщение, с разными частными деталями, я задавал вопрос Владу по почте, но он настоял чтобы вынести на форум, что получилось то получилось. Сам же Влад да не презрит сие начертание.