Здравствуйте, kaa_t, Вы писали:
_>Написал такой макрос. Все работает если в методах нет return или yield.
_>Как узнать что в методе используется ключевое слово yield?
Можно найти yield в коде метода с помощью класса Nemerle.Compiler.ExprWalker:
foreach(m is MethodBuilder in typeBuilder.GetMethods())
{
mutable hasYield = false;
def walker = ExprWalker();
def walk(info : ExprWalkInfo) : void
{
when (info.Node is PExpr.MacroCall(name=Name(Id="yield")))
{
hasYield = true;
info.Stop();
}
}
walker.Walk(m.Body, walk);
when (hasYield)
Message.Hint(m.Location, $"The method '$(m.Name)' call 'yield' macro.");
}
_>Как побороть ошибку error : goto (block return?) is not allowed inside expressions
Эта ошибка означает, что где-то есть нелокальный выход из функции или выражения. Например, если написать break внутри локальной функции находящейся в цикле, то может появиться такое сообщение. Или если написать return внутри выражения.
Часто это бывает связано с некорректной генерацией кода.
В приведенном фрагменте вроде ничего такого нет. Но в нем есть применение каких-то макросов. Возможно ошибка в них.
Вот в этом нет смысла:
_>_> <[
_> {
_> mutable result;
_> try { $(name:usesite) = true; result = $(m.Body) } finally { $(name:usesite) = false; }
_> result;
_> }
_> ]>
_>
блок try и так возвращает значение. Можно выбросить if и всегда возвращать первый вариант кода.