Тема: Jentos.Code
Показать сообщение отдельно
Старый 11.06.2014, 06:44   #28
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,374
Написано 489 полезных сообщений
(для 882 пользователей)
Ответ: Jentos IDE

Проблема оказалась неожиданной.
Код мы пишем в элементе 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>, после точки выдаются все методы для списка
Скоро релиз.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Жека за это полезное сообщение:
LLI.T.A.L.K.E.R. (12.06.2014), pax (21.06.2014), Randomize (19.06.2014)