2017-02-03 4 views
3

У меня есть классы, которые никогда не упоминаются напрямую в другом коде, но доступны только с помощью Type.resolveClass. Я хочу, чтобы они были скомпилированы и включены в приложение, но я не могу понять, как это сделать. Я думал, что @:keep (или @:keepSub) подходит именно для этого, но он не работает так, как я ожидал. Это то, что я делаю:Haxe: как удалить неиспользованный класс

Main.hx:

package; 
//import Foo; //uncomment this line to make it work 
class Main { 
    static function main() trace(Type.resolveClass('Foo')); 
} 

Foo.hx:

package; 
@:keep class Foo {} 

Но это следы null (я тестировал JS и Flash) Даже если я компилирую с -dce no он по-прежнему следы null.

Не уверен, что это проблема компилятора или я не понимаю, как это работает.

ответ

7

Это не проблема компилятора, это правильное поведение. Если модуль никогда не импортируется, он никогда не включается в компиляцию для начала. Компилятор никогда не увидит @:keep.

Общим решением для этого является использование --macro include('package') (см. Compiler.include()), что заставляет все модули в package компилироваться.

Обратите внимание, что импорт подстановочных знаков (import package.*;) не будет работать, так как wildcard imports ленивы.

5

@:keep и @:keepSub только классы. В вашем случае Foo никогда не включался в компиляцию, поэтому компилятору нечего делать.

Вы можете перечислить несколько точек входа для вашего приложения в свой hxml (или в команду haxe ...), чтобы включить некоторые классы: haxe -cp src -main MainFoo Foo --interp найдет Foo. (Больше на --interp здесь: http://old.haxe.org/doc/compiler#macro-options)

Вы можете также включить пакет и все его классы с --macro include('my.package'), но в вашем примере ваши классы находятся на корневой пакет, и я не знаю, если вы можете включить этот.

Дополнительная информация по теме: http://api.haxe.org/haxe/macro/Compiler.html#include

Смежные вопросы