Поиск ошибок с помощью модуля reflection

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

Итак, для начала немного теории. Транслятор Monkey устроен таким образом, что включает в финальную сборку только используемый в проекте код. Из этого следует, что далеко не весь код будет транслирован, а следовательно и проверен при сборке.

Давайте рассмотрим простой пример:

Function Main()
    (New Man()).SayHello()
End Function

Class Man

    Method SayHello()
        Print "Hello!"
    End Method

    Method SayBye()
        Print "Bye!"
    End Method

End Class

После сборки для целевой платформы Flash, мы получим следующий код (опуская внутренний код Mnokey):

class bb_simple_Man extends Object{
    public function g_Man_new():bb_simple_Man{
        return this;
    }
    public function m_SayHello():int{
        print("Hello!");
        return 0;
    }
}
internal function bbMain():int{
    ((new bb_simple_Man).g_Man_new()).m_SayHello();
    return 0;
}

Как можно заметить, при трансляции мы потеряли наш метод SayBye, он просто отсутствует в as3-версии файла. Это чревато тем, что при сборке довольно большого проекта, мы запросто можем пропустить опечатки и прочие синтаксические ошибки, а транслятор Monkey нам не сообщит об этом.

Вы можете легко проверить это, заменив Print на Prnt в методе SayBye. Транслятор не сообщит нам ничего, хотя в коде присутствует явная ошибка. Эта проблема особенно актуальна, для разработчиков модулей, так как не всегда есть возможность проверить досконально все функции в проекте.

Так вот, чтобы избежать подобных ошибок, достаточно подключить к проекту модуль reflection. Это заставит транслятор Monkey пройтись по всему коду, а значит собрать и проверить его.

Давайте проверим и соберем этот код:

Import reflection

Function Main()
    (New Man()).SayHello()
End Function

Class Man

    Method SayHello()
        Print "Hello!"
    End Method

    Method SayBye()
        Print "Bye!"
    End Method

End Class

При попытке собрать проект, мы получим ошибку и сможем легко ее исправить. В последствии, когда все ошибки в вашем проекте будут исправлены, вы можете отключить модуль reflection, тем самым уменьшив объем финальной сборки проекта.

На этом все. Пока!