Здравствуйте, STDray, Вы писали:
STD>Можно ли узнать из макроса уровня выражения список файлов в проекте? STD>Войдут ли в этот список файлы, имеющие расширение отличное от ".n" ?
О каком проекте идет речь ? VS ?
В итоге ведь компилятор просто запускается в командной строке с передачей всех файлов.
Здравствуйте, STDray, Вы писали:
STD>Можно ли узнать из макроса уровня выражения список файлов в проекте?
Можно проанализировать опции компиляции находящиеся в Manager-е. Для получения списка сборок можно использовать ReferencedAssemblies.
STD>Войдут ли в этот список файлы, имеющие расширение отличное от ".n" ?
Да. Компилятор поддерживает языковые плагины. Те же .cs-файлы вполне могут присутствовать. .n2 — тоже, какое-то время, будет немерловым плагином.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Да. Компилятор поддерживает языковые плагины. Те же .cs-файлы вполне могут присутствовать. .n2 — тоже, какое-то время, будет немерловым плагином.
Уточню. Попадут только файлы помеченные как компилируемые и попадут на вход плагину который определяется по расширению. Об остальных файлах компилятор просто не узнает, как и о самом проекте.
Здравствуйте, Ziaw, Вы писали:
Z>Уточню. Попадут только файлы помеченные как компилируемые и попадут на вход плагину который определяется по расширению. Об остальных файлах компилятор просто не узнает, как и о самом проекте.
Все так. Кроме того, что немерлу передаются не только .n, файлы, но и все остальные для которого не найдено плагина. Так что если нет плагина, то ошибки парсинга пойдут от немерлового компилятор. Что не комильфо, на мой взгляд, но как есть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Да. Компилятор поддерживает языковые плагины. Те же .cs-файлы вполне могут присутствовать. .n2 — тоже, какое-то время, будет немерловым плагином.
Я натупил, забыл, что компилятору все эти файлы проекта по сути до лампочки.
Я пишу шаблонизатор вроде разора. Хочу сделать генерацию класса по макросу вида view("/Views/Home/Index.azaza", myModel), меня интересуют два момента, как мне узнать каталог проекта, чтобы относительно него достроить путь, и есть ли возможность воспользоваться интеграцией для вывода ошибок в файле шаблона?
public ToClass(name : Name, modelType : PExpr) : TypeBuilder {
Macros.DefineCTX(typer);
def body = compileAst(ast);
def ns = Manager.CoreEnv.EnterIntoNamespace(["Views"]);
def viewTy = ns.Define(<[ decl:
[Record] public class $name {
public Model : $modelType;
public RenderView() : string {
def $sb = StringBuilder();
$body;
$sb.ToString();
}
}
]>);
viewTy.Compile();
viewTy
}
только вот Define разваливается
assertion failed in file ncc\hierarchy\TypeBuilder.n, line 145: env is null for Views.Yoba
at Nemerle.Compiler.TypeBuilder..ctor(TypesManager manager, TypeBuilder par, TopDeclaration td, Node ns_node)
at Nemerle.Compiler.NamespaceTree.AddType(TypeBuilder par, Node parent_node, TopDeclaration newdecl)
at Nemerle.Compiler.GlobalEnv.Define(ClassMember td, Boolean do_fixup)
at Nemerle.Compiler.GlobalEnv.Define(ClassMember td)
at Tina.Macros.Azazor.Compiler.ToClass(Name name, PExpr modelType) in C:\Projects\tina\Tina.Macros\Azazor\Compiler.n:line 43
at Tina.Macros.Azazor.TinaViewImpl.TransformToClass(Typer typer, PExpr view, PExpr model) in C:\Projects\tina\Tina.Macros\Azazor\View.n:line 88
at Tina.Macros.Azazor.TinaViewMacro.Run(Typer _N__1, list`1 parms) in C:\Projects\tina\Tina.Macros\Azazor\View.n:line 20
at Nemerle.Compiler.MacroRegistry.expand_one_macro(Typer ctx, PExpr expr)
_NN>А где этот Views.Yoba определяется ?
В приведенном выше коде я и создаю этот класс, наверное где-то там ошибка. До этого я только разбираю шаблон и выполняю какую-то подготовительную работу
Здравствуйте, STDray, Вы писали:
STD>Я пишу шаблонизатор вроде разора.
А оно надо? Лучше StringTemplate до ума довести. Все что в нем надо сделать — это реализовать качественную поддержку вариантных типов.
STD>...как мне узнать каталог проекта,
При компиляции через MSBuild/VS стандартного проекта путь к проекту засовывается в какую-то опцию компилятора. Название не помню, но под отладчиком его сразу можно будет узнать. До опций проекта можно добраться из свойства Manager (которое есть почти где угодно).
STD>...и есть ли возможность воспользоваться интеграцией для вывода ошибок в файле шаблона?
Если локейшоны в сообщении будут указывать на твои файлы, то студия сама будет тыкать пользователя в них. Немерловый копилятор тоже особо не проверяет на какой файл ссылка в ошбибках и ворнингах указывает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
А, вообще, тебе нужно просто плагин к компилятору сделать. Погляди как сделан плагин для поддержки C#. Он лежит в ncc.parser.csharp.dll.
В двух словах тебе нужно создать сборку в которой будет класс реализующий IParser и добавить атрибут RegisterParser уровня сборки в первом параметре которого описать полное имя класса, а во втором расширение с которым будет ассоциироваться парсер. Для C# это выглядит так:
Здравствуйте, STDray, Вы писали:
_NN>>А где этот Views.Yoba определяется ? STD>В приведенном выше коде я и создаю этот класс, наверное где-то там ошибка. До этого я только разбираю шаблон и выполняю какую-то подготовительную работу
Эх, а нельзя привести минимальный код чтобы можно было скомпилировать и проверить ?
Кстати, почему