Вверх ↑
Ответов: 4630
Рейтинг: 749
#1: 2017-06-21 12:25:14 ЛС | профиль | цитата
Смотри, в чём проблема. Есть общий блок, типа BLK_METHODS (BLK_LOC_VAR аналогично, но по его назначению с ним такое не возникает). В этот общий блок текст могут печатать различные компоненты.
Предположим, компонент Bluetooth хочет записать в этот блок текст метода:
public void ondevdiscoveryend1() {
  // Тело метода - то, что выводят компоненты по событию
}
Как это было сделано раньше:
if(linked(onDeviceDiscoveryEnd))
  block.select(BLK_METHODS)
println('public void ',ondevdiscoveryend,'() {')
block.inclvl()
event(onDeviceDiscoveryEnd)
block.declvl()
println('}')
end
Так вот, на момент вызова события event(onDeviceDiscoveryEnd), в блоке BLK_METHODS был впечатан текст:
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, копирует текущий блок в указаный блок, затем удаляет текущий блок (чтобы он не выводился кодогенератором автоматически в конечный код).
карма: 26

0
Редактировалось 6 раз(а), последний 2017-06-21 12:37:02