Предположим, компонент Bluetooth хочет записать в этот блок текст метода:
public void ondevdiscoveryend1() {
// Тело метода - то, что выводят компоненты по событию
}
if(linked(onDeviceDiscoveryEnd))
block.select(BLK_METHODS)
println('public void ',ondevdiscoveryend,'() {')
block.inclvl()
event(onDeviceDiscoveryEnd)
block.declvl()
println('}')
end
public void ondevdiscoveryend1() {
с расчетом на то, что следующие компоненты по событию event(onDeviceDiscoveryEnd) выведут свой код после этого текста, затем компонент Bluetooth завершит метод закрывающей скобкой '}'. Но: другие компоненты тоже вызывают события и тоже хотят разместить свои методы в BLK_METHODS. И когда они начинают печатать в BLK_METHODS, код с объявлением ихних методов попадает внутрь метода ondevdiscoveryend1(), а не над или под него.
Решается эта проблема таким образом: компоненты выводят в общие блоки только завершенный код методов. Для этого объявляется временный приватный блок (tmp = block.reggen()), делается текущим (block.select(tmp)). Поскольку этот блок никому неизвестный, компонент Bluetooth может распоряжаться им как угодно. И в этот блок уже выводится первая часть метода. Затем вызывается событие. Компоненты пишут свой код либо в данный блок (для них - просто текущий), либо в общие блоки (соблюдая тот же принцип). По завершении события компонент Bluetooth выводит закрывающую скобку в этот блок, а затем целиком его копирует в BLK_METHODS (MoveBlockTo(BLK_METHODS)). Таким образом, в BLK_METHODS оказывается правильно сформированное тело метода, не нарушенное другими компонентами. Функция MoveBlockTo() объявлена в general.hws, копирует текущий блок в указаный блок, затем удаляет текущий блок (чтобы он не выводился кодогенератором автоматически в конечный код).