Как победить условную компиляцию в FDT

57 views
Skip to first unread message

Ivan Dembicki

unread,
Nov 15, 2009, 3:14:56 PM11/15/09
to ruFlash
Hello ruFlash,


Как победить условную компиляцию в FDT:

Run -> Run Configurations...
Выбираем проект, переходим на закладку Compiler Arguments и добавляем
-define=CONFIG::Debug,false

Но если попытаться использовать вот такую конструкцию:

[code]
CONFIG::Debug {
trace("Config::Debug = true");
}
[/code]

то FDT начинает жутко ругаться на синтаксис - а это раздражает.
Мы понимаем, что парсер лох и его можно обмануть, так что дадим гаду
что он хочет:
Создаем в руте проекта namespace с именем CONFIG.as:

[code]
package {
public namespace CONFIG;
}
[/code]

Cоздадим класс ConfigValues и объявим переменную:
[code]
package {
public class ConfigValues {
CONFIG static const Debug:Boolean = false;
}
}
[/code]

Теперь, мы можем использовать вот так:
[code]
var debug : Boolean = false;
ConfigValues.CONFIG::Debug
{
debug = true;
trace("Config::Debug = true");
}
if (!debug) {
trace("Config::Debug = false");
}
[/code]

- я добавил тест, чтобы убедиться, что всё работает как надо.
Остается только предупреждение, что отсутствует точка с запятой. Это
не так страшно, как грозные ошибки, которые выдавались ранее, но если
сильно раздражает, отключите нафиг эту ошибку в настройках FDT.
Как неожиданный плюс имеем нормальный автокомплит.


--
iv
http://www.bezier.ru
http://bezier.googlecode.com

Ivan Dembicki

unread,
Nov 15, 2009, 3:17:52 PM11/15/09
to ruFlash
Hello ruFlash,

да, если у кого-нибудь будут мысли как улучшить - вэлкам.
И я это не тестировал жестко. Проверьте сами перед использованием.

Ivan Dembicki

unread,
Nov 15, 2009, 3:24:46 PM11/15/09
to ruFlash
Hello ruFlash,

еще пара пояснений: значение переменной Debug в классе ConfigValues не
оказывает влияния на условную компиляцию. Имеет значение только
переменная, которую вы передаете в аргументах компилятора.
ConfigValues - не больше, чем фейк.

Flop Serg

unread,
Nov 15, 2009, 3:50:13 PM11/15/09
to ruflash
и нейм спэйс - тоже фэйк ))

давно я это пытслся победить и таки победил
примерно так же неймспэйсом и переменой в нем

но потом постотрел на эти конструкции и забил
условная компиляция и вот такого рода код
как-то не по-мне - что-то ненравится...

уж лучше конфиги и ант - красотень

Yuri Zhloba

unread,
Nov 15, 2009, 5:51:13 PM11/15/09
to ruf...@googlegroups.com
Насчет FDT -- да, проблема известная. Но в Intellij IDEA такой проблемы нет, парсер без проблем хавает конструкции условной компиляции. Так что если кто задумывался об использовании IDEA, то вот вам еще один аргумент за.

А условная компиляция бывает нужна, и не только для отключения трейсов.

Dima Pilipenko

unread,
Nov 15, 2009, 11:53:05 PM11/15/09
to ruf...@googlegroups.com
А условная компиляция бывает нужна, и не только для отключения трейсов.
а для чего еще?

Ivan Dembicki

unread,
Nov 16, 2009, 12:11:19 AM11/16/09
to ruf...@googlegroups.com
Hello Dima,

> а для чего еще?

- применений может быть масса, в том числе версионность продуктов
можно как-то поддерживать.

Nox Noctis

unread,
Nov 16, 2009, 2:03:26 AM11/16/09
to ruf...@googlegroups.com
> а для чего еще?

Для сборки отличающихся друг от друга версий одного проекта.
Самый очевидный пример -- дебаговая сборка (мясом наружу, куча
отладочных фенечек прямо на экране конечного пользователя) или релизная
чистенькая.

Кстати, переменные пред-компиляции можно использовать и в обычных
выражениях, не только для того, чтобы компилировать или не компилировать
блок кода. Например:

if (CONFIG::DEBUG) {
...
} else {
...
}

public static const BUILD:String = BUILD::ID;

Ну, и в любых других.

--
Michael Antipin
______________________________________________________________________
fe...@noregret.org | http://skazkastudio.ru | http://noregret.org

Nox Noctis

unread,
Nov 26, 2009, 6:43:40 AM11/26/09
to ruFlash
Совсем забыл об одной штуке, которую давно прочитал в FDTшной джире.
Она решает проблему с ошибками на инструкциях условной компиляции в
FDT.

Тогда (в версии 3.5.0.1021) прием не работал и я выкинул его из
головы.
Сейчас, в версии 3.5.0.1040, прием работает исправно.
По основному адресу до сих пор лежит версия 3.2.0.1029
http://fdt.powerflasher.com/update/
Чтобы скачать свежее, используйте адрес
http://fdt.powerflasher.com/update_beta/

Проблемы с парсером в FDT можно обрамлять комментариями:
/*FDT_IGNORE*/
код, который FDT парсит криво
/*FDT_IGNORE*/

Тогда парсер будет игнорировать обрамленный блок.

Пример:
/*FDT_IGNORE*/
build::debug {
/*FDT_IGNORE*/
logTarget = new VKLogTarget();
logTarget.includeLevel = true;
logTarget.includeTime = true;
logTarget.setStage(wrapperStage, this);
Log.addTarget(logTarget);
/*FDT_IGNORE*/
}
/*FDT_IGNORE*/

Тем самым я устранил проблему с условной компиляцией (напомню, авторы
FDT прямым текстом говорят, что маловероятно появление поодержки
условной компиляции в ближайшем будущем).

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

Например, если вы напишете:
/*FDT_IGNORE*/
var callback:Function;
/*FDT_IGNORE*/
callback();

То ошибка, естественно будет: парсер не узнает о том, что есть
переменная callback.

Но, на данный момент, такой выкрутас нужен только для условной
компиляции (и редких проблем с сильно замороченным E4X). Так что
пользоваться вполне можно.

dmitry zhelnin

unread,
Nov 26, 2009, 7:56:03 AM11/26/09
to ruf...@googlegroups.com
о спасибо, пригодилось. жаль только что открывающий и закрывающий тэги не различаются, и подсветки игнора нету


Проблемы с парсером в FDT можно обрамлять комментариями:
/*FDT_IGNORE*/
   код, который FDT парсит криво
/*FDT_IGNORE*/




--
dmitry zhelnin
Reply all
Reply to author
Forward
0 new messages