Здравствуйте.
Студия кидает эксепшен в случае добавления символа
$ после списка аргументов метода (выделено жирным в коде). После этого любое действие в файле вызывает этот эксепшен (наскольо я помню, где-то в районе лексера что-то отваливается)
[Nemerle.MacroUsage (Nemerle.MacroPhase.BeforeInheritance, Nemerle.MacroTargets.Class)]
macro SomeMacro (t : TypeBuilder, someMethod)
{
def method = t.GetParsedMembers().Filter(fun(x){
| <[ decl: .. $_ this( .. $_ )$_ ]> => true
| _ => false
});
match (method)
{
| head :: _ => t.Define(<[ decl: public funct () : void { WriteLine("to be") } ]>)
| _ => t.Define(<[ decl: public funct () : void { WriteLine("or not to be") } ]>)
}
}
Вывод ошибки слишком объемен, поэтому приводить здесь не буду. Использую VS2005, интеграция собрана из исходников. Точно такая-же ошибка вылетает и при использовании инсталятора "весенне-летней" давности, поэтому текущая версия интеграции/компилятора, я думаю, роли не играет.
P.S. Если можно, сразу вопрос, почему подобный код не ищет ничего, кроме конструкторов? Т.е. если заменить | <[ decl: .. $_ this( .. $_ )$_ ]> => true на | <[ decl: .. $_ some_method( .. $_ )$_ ]> => true , то даже при наличии в классе метода some_method, на консоль все равно выведется "or not to be" (т.е. метод не нашелся).
дайте слепому показать вам дорогу.
(Р. Бредбери "Смерть — дело одинокое")