Проблема оказалась неожиданной.
Код мы пишем в элементе QTextDocument. Каждая строчка - это QTextBlock. Я в момент парсинга запоминаю в элементе ссылку на блоки, в которых объявлены классы/переменные/функции.
Для юзерских файлов нет проблем, т.к. документ открыт и все блоки "живы".
Но вот для парсинга модулей манки процедура та же, но после выхода из парсинга документ удаляется, соответственно и ссылки на его блоки становятся кривыми.
У меня такая проверка была:
if( block.isValid() ) {
//тут переходим к нужной строчке в файле, если файла нет - открываем
int line = block.blockNumber(); //вот тут вылетала прога!
}
Я полагал, что проверка блока на валидность меня спасёт. Ан-нет.
В итоге начал переходить просто по ранее запомненному (на этапе парсинга) номеру блока, и всё пашет.
Ещё:
Переделал систему выбора элементов в codetree и sourcelist.
Завёл две хэшмапы для хранения ссылок на элементы анализатора кода.
Нужность их подкрепляется тем, что есть перегрузка методов, а значит одинаковые названия методов могут быть в разных классах. Но это тоже пофиг. Не пофиг стало после того, как я сделал опцию "Показывать родительские элементы" для списка sourcelist. Теперь 1 экземпляр из анализатора может попадать в несколько классов. Я в самом экземпляре хранил ссылку на пункт в codetree для мгновенного доступа к элементу при щелчке, но теперь ссылка затирается последней, т.е. в базовом классе ссылка будет на тот что его унаследовал.
Сделал по простому, строю полный "путь" для пункта в codetree и для самого элемента анализатора codeitem.
пример полного пути:
test.monkey$A$my_method:Void()
имя_файла$имя_класса$имя_члена_класса
Теперь можно однозначно получать ссылки на элементы, с любой вложенностью.
В данный момент доделываю определение типов переменных при "неявном назначении" через :=.
Примеры:
'
Local s1:String = "s1"
Local s2 := s1 's2 становится типом String, после точки выдаются все методы для строк
'
Local lst := new List<String> 'lst становится типом List<String>, после точки выдаются все методы для списка
Скоро релиз.