Генератор исходника Nemerle из C# - первая версия
От: CodingUnit Россия  
Дата: 29.06.11 13:08
Оценка: 91 (7)
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, CodingUnit, Вы писали:


CU>>Да я с Владом согласен, TopDeclaration там и интерфейсы, альясы, делегаты, помимо больших классов, поэтому их каждый в свой файл как то не красиво. Вариант с обработкой NamespaceNode из CSharpParser мне кажется более похож на реальность. Хотя это годится для конвертера из C#, для обычной печати надо придумывать другой способ, наверное надо обрабатывать NamespaceNode в которых находятся TopDeclaration и сортировать их по позициям, тогда должны быть точно известны позиции Location, они известны при парсинге, но если добавляется член в макросе, то его надо грамотно подключить к текущему пространству.


VD>"Обычная" печать одна для чего нужна? Я так понимаю только для отладки. А для отладки совершенно по фигу где лижит тип. Можно каждый тип сувать в отдельный файл. А алиасы печатать для отладки просто нет смысла.


VD>+1 Если только, конечно, пользователь сам не хочет разложить все поп полочкам. А это можно некой настройкой сделать.


Залил код проекта в каталог Snippets\csharp-parser\CSharpToNemerleSource просьба всем тестировать и смотреть.
Конечно много еще недоделок и замечаний, которые надеюсь общими усилиями со временем устраним.
Что сделано:

1) Утилита конвертирования из C# в Nemerle файлы, парсится все как есть С# парсером, выводится в файл, по печати есть замечания (ниже)
2) Печать дерева (list[TopDeclaration]) в файл:
а) печать всех элементов TopDeclaration и ClassMember включая аттрибуты, генерики, ограничения, авто-свойства, ручные события, может что и упустил, со временем думаю все дополним, жду замечаний.

б) большая часть печати взята из ClassMember и дополнена, поэтому после тестинга и согласия сообщества, можно переводить код из сниппетов в компилятор для печати отладочных исходников через ClassMember.PrintBody и TopDeclaration

г) простенькое форматирование, отступы, using печатаются по информации в ManagerClass для соотв. файла, namespace печатается одно на группу объявлений в файле

д) Можно существующие исходники N парсить и печатать для тестирования движка

что еще не поддерживается:
а) печать отладки хотя потенциально может быть, но еще не тестировалась, все надо переводить из сниппетов в компилятор при согласии сообщества
б) печать макросов хромает, по крайней мере сейчас, плохо печатается тело макроса — цитата, тут надо смотреть PrettyPrint
в) #define, xml комментарии и остальные директивы препроцессора пока не печатаются, думаю скоро заполним пробел

Поэтому можете юзать, хотя не полно но частично уже ее можно использовать, PrettyPrint кое где изгаживает тела методов, его я пока не касался, но думаю и его можно подкорректировать со временем. Кто хочет может править, и вносить изменения не меняющие идеологии, проект открыт. А также замечания и баг-репорты.

Далее хочу написать замечания о реализации, здесь чисто технические детали:

1) Есть ли в Nemerle неявные операторы приведения типа, как в С#: static implicit operator double()
для текущего класса, как их печатать в Nemerle, нигде не могу найти синтаксис? Тоже и про explicit?

2) Макросы сейчас печатаются с ошибкой Error в квази-цитате, есть пример в сниппетах, там это показано в каталоге Converted сконверченные файлы Sample.n. Вопрос вот в чем, что надо сделать чтобы они печатались правильно, тут конечно все дело в PrettyPrint
но где смотреть, у него есть параметр Typer который в него можно подать от него зависит внутренне раскрытие макросов в PrettyPrint. может его надо туда надо правильно подать, но откуда взять Typer в таком режиме компиляции, когда мы отдельно от макроса в ManagerClass есть ComponentFactory его можно оттуда создать, или получить его другим образом? В чем может быть еще дело?

3) В дереве есть странные возможности типа параметры типов в enum и макросах (Typarms) существуют ли такие в природе языка и как их печатать?

4) Откуда взять информацию о пространстве имени типа (в котором находится тип), оно есть как я вижу в TopDeclaration.FullName, и его можно получить удалив имя самого класса из строки, может есть какие то более прямые способы?

5) Как получить информацию о using в файле, сейчас удалось получить ее из referenced_namespace_nodes класса NamespaceTree для этого пришлось открыть через extension метод, далее их надо фильтровать по информации Location. может есть другие прямые способы?

6) Сейчас часть утилиты сделана на русском, часть на аглицком, как лучше сделать чтобы комрады за границей могли пользоваться утилитой, есть вариант сделать отдельно на английском, можно переключать язык, можно делать только на английском надеясь что наши разберутся, как поступить?

7) PrettyPrint нуждается в коренной промывке мозгов, могу ли я этим заняться? может быть после этого несколько изменится печать отладочных исходников на данный момент.

Прошу всех ребят, кто может дать комментарии на сии волнующие вопросы писать ответы. Кто хочет может подключаться и исправлять код.
В DeclPrinter.n и DeclPrinterInit.n находится сам движок печати, который является кандидатом на замену текущей печати отладки.

ЗЫ: TopDeclarationPrettyPrint не стал обзывать поскольку там в большинстве не только TopDeclaration печататается, но и ClassMember члены.

29.06.11 18:43: Ветка выделена из темы Генератор исходника Nemerle из дерева и из C#
Автор: CodingUnit
Дата: 22.06.11
— VladD2
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.