Это частично возможно. Почему частично? Невозможно нормально обработать try-expression (он же знак вопроса) и макросы, которые держат в себе return. В остальном это возможно, но у меня ушло на это 164 строчки кода, а я всё ещё не уверен, что обработал все случаи (неявный возврат может придти из любого блока, находящегося в любом другом блоке; а я не уверен, что моей фантазии хватило на все случаи). Я не нашёл способа сделать это готовой функцией и парсил почти "в лоб руками", используя syn. Если кому интересно, решение кроется в рекурсивной обработке всех syn::Block и всех syn::Expr + syn::Local в нём.
Я не буду прикладывать свой код здесь, так как он, вероятно, не обрабатывает все случаи и работает в худшем случаи за O(2*N) по скорости, но если реализация совсем не идёт в голову, пишите в комментарии этого ответа.