Получить список файлов в проекте
От: STDray http://stdray.livejournal.com
Дата: 27.09.13 16:22
Оценка:
Можно ли узнать из макроса уровня выражения список файлов в проекте?
Войдут ли в этот список файлы, имеющие расширение отличное от ".n" ?
Re: Получить список файлов в проекте
От: _NN_ www.nemerleweb.com
Дата: 27.09.13 18:32
Оценка:
Здравствуйте, STDray, Вы писали:

STD>Можно ли узнать из макроса уровня выражения список файлов в проекте?

STD>Войдут ли в этот список файлы, имеющие расширение отличное от ".n" ?

О каком проекте идет речь ? VS ?
В итоге ведь компилятор просто запускается в командной строке с передачей всех файлов.

Файлы есть в Manager.Options.Sources .
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Получить список файлов в проекте
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.09.13 20:52
Оценка:
Здравствуйте, STDray, Вы писали:

STD>Можно ли узнать из макроса уровня выражения список файлов в проекте?


Можно проанализировать опции компиляции находящиеся в Manager-е. Для получения списка сборок можно использовать ReferencedAssemblies.

STD>Войдут ли в этот список файлы, имеющие расширение отличное от ".n" ?


Да. Компилятор поддерживает языковые плагины. Те же .cs-файлы вполне могут присутствовать. .n2 — тоже, какое-то время, будет немерловым плагином.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Получить список файлов в проекте
От: Ziaw Россия  
Дата: 30.09.13 07:07
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Да. Компилятор поддерживает языковые плагины. Те же .cs-файлы вполне могут присутствовать. .n2 — тоже, какое-то время, будет немерловым плагином.


Уточню. Попадут только файлы помеченные как компилируемые и попадут на вход плагину который определяется по расширению. Об остальных файлах компилятор просто не узнает, как и о самом проекте.
Re[3]: Получить список файлов в проекте
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.10.13 12:03
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Уточню. Попадут только файлы помеченные как компилируемые и попадут на вход плагину который определяется по расширению. Об остальных файлах компилятор просто не узнает, как и о самом проекте.


Все так. Кроме того, что немерлу передаются не только .n, файлы, но и все остальные для которого не найдено плагина. Так что если нет плагина, то ошибки парсинга пойдут от немерлового компилятор. Что не комильфо, на мой взгляд, но как есть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Получить список файлов в проекте
От: STDray http://stdray.livejournal.com
Дата: 03.10.13 17:22
Оценка:
VD>Да. Компилятор поддерживает языковые плагины. Те же .cs-файлы вполне могут присутствовать. .n2 — тоже, какое-то время, будет немерловым плагином.

Я натупил, забыл, что компилятору все эти файлы проекта по сути до лампочки.
Я пишу шаблонизатор вроде разора. Хочу сделать генерацию класса по макросу вида view("/Views/Home/Index.azaza", myModel), меня интересуют два момента, как мне узнать каталог проекта, чтобы относительно него достроить путь, и есть ли возможность воспользоваться интеграцией для вывода ошибок в файле шаблона?
Re[3]: Ошибка создания типа
От: STDray http://stdray.livejournal.com
Дата: 03.10.13 18:58
Оценка:
Как-то сделал, есть код компиляции в класс

        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)


Что я делаю не так?
Re[4]: Ошибка создания типа
От: _NN_ www.nemerleweb.com
Дата: 03.10.13 20:34
Оценка:
Здравствуйте, STDray, Вы писали:

STD>только вот Define разваливается

STD>
STD>assertion failed in file ncc\hierarchy\TypeBuilder.n, line 145: env is null for Views.Yoba
STD>


STD>Что я делаю не так?


А где этот Views.Yoba определяется ?

Подозреваю его добавляем в этот же TypeBuilder.
А у нас уже вызвался Compile:

...
viewTy.Compile();
viewTy


Тут либо не вызывать, и снаружи кто-то вызовет, либо частичный класс создавать.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Ошибка создания типа
От: STDray http://stdray.livejournal.com
Дата: 03.10.13 21:08
Оценка:
_NN>А где этот Views.Yoba определяется ?
В приведенном выше коде я и создаю этот класс, наверное где-то там ошибка. До этого я только разбираю шаблон и выполняю какую-то подготовительную работу

            def compiler = Compiler(typer, ast.Value);
            def modelClassName = "Yoba" |> Name;
            def modelTyName = modelTy.Type.Hint.Value.TypeInfo.FullName |> Name;
            _ = compiler.ToClass(modelClassName, <[$(modelTyName : name)]>);
            <[ $(modelClassName : name)($model).RenderView() ]>

Код функции ToClass приведен выше.

_NN>Подозреваю его добавляем в этот же TypeBuilder.

_NN>А у нас уже вызвался Compile:

Разваливается до вызова Compile, на методе Define

            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();
                    }
                } 
            ]>);

который и возвращает мне TypeBilder.
Re[3]: Получить список файлов в проекте
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.10.13 12:27
Оценка:
Здравствуйте, STDray, Вы писали:

STD>Я пишу шаблонизатор вроде разора.


А оно надо? Лучше StringTemplate до ума довести. Все что в нем надо сделать — это реализовать качественную поддержку вариантных типов.

STD>...как мне узнать каталог проекта,


При компиляции через MSBuild/VS стандартного проекта путь к проекту засовывается в какую-то опцию компилятора. Название не помню, но под отладчиком его сразу можно будет узнать. До опций проекта можно добраться из свойства Manager (которое есть почти где угодно).

STD>...и есть ли возможность воспользоваться интеграцией для вывода ошибок в файле шаблона?


Если локейшоны в сообщении будут указывать на твои файлы, то студия сама будет тыкать пользователя в них. Немерловый копилятор тоже особо не проверяет на какой файл ссылка в ошбибках и ворнингах указывает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Получить список файлов в проекте
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.10.13 12:29
Оценка:
Здравствуйте, STDray, Вы писали:...

А, вообще, тебе нужно просто плагин к компилятору сделать. Погляди как сделан плагин для поддержки C#. Он лежит в ncc.parser.csharp.dll.

В двух словах тебе нужно создать сборку в которой будет класс реализующий IParser и добавить атрибут RegisterParser уровня сборки в первом параметре которого описать полное имя класса, а во втором расширение с которым будет ассоциироваться парсер. Для C# это выглядит так:
[assembly: RegisterParser("CSharpToNemerle.CSharpParser", ".cs")]

Сам IParser очень простой:
public interface IParser
{
  Parse(source : ISource) : ParseResult;
}

В ParseResult нужно просто вернуть список TopDeclaration-ов (описывающий немерловые типы).

Если грамотно намапить локейшоны, то будет и отладка по исходникам, а сообщения в нужных местах.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Ошибка создания типа
От: _NN_ www.nemerleweb.com
Дата: 04.10.13 16:37
Оценка:
Здравствуйте, STDray, Вы писали:

_NN>>А где этот Views.Yoba определяется ?

STD>В приведенном выше коде я и создаю этот класс, наверное где-то там ошибка. До этого я только разбираю шаблон и выполняю какую-то подготовительную работу

Эх, а нельзя привести минимальный код чтобы можно было скомпилировать и проверить ?
Кстати, почему

def modelClassName = "Yoba" |> Name;

Зачем Name ?
Лучше воспользоваться usesite:

class $(name : usesite) { .. }
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: Ошибка создания типа
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.10.13 23:53
Оценка:
Здравствуйте, STDray, Вы писали:

Вот так:
STD>
STD>            def modelTyName = modelTy.Type.Hint.Value.TypeInfo.FullName |> Name;
STD>

точно делать нельзя. Да и не нужно. Для типов есть сплайс $(... : typed).

Name руками тоже создавать нет смысла. Цветов все равно не будет. Используй сплайсы global, usesite или dyn (в крайнем случае).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.