Forwarded from gavr_sas
Думаю как реализовать подсказку переменных.
Сейчас она реализована так, есть карта экспрешонов файл -> номера строк -> сеты экспрешонов+скоупов
пользователь запрашивает автодополнение после этой строки
1) в карте строки с таким экспрешоном нет
2) ищем ближайший наверх
3) показываем скоуп который к нем был привязан
Все это супер криво работает по очевидным причинам
Вторая идея была строить еще одну карту из дерева ренжей скоупов автодополнения, типа
Идея сейчас такая, если експрешон на этой строке не нашелся то
1) добавляем прямо в сурс файла спец-символ
2) запускаем фронтенд компиля по файлу, и как токо ресолвер встречает спец-символ то он выбрасывает эксепшон вместе с текущим скоупом
Таким образом можно получать самые точные автодополнения переменных скоупа в мире,
но делать контрол флоу на эксепшонах плоха(
но таааак удобно именно в этом случае, я не могу просто сделать return ведь все в рекурсивном обходе дерева
теоретически можно было бы сделать чтобы ресолв() возвращала бул, и тру в этом буле означало бы продолжение, но это тоже супер запарно
Сейчас она реализована так, есть карта экспрешонов файл -> номера строк -> сеты экспрешонов+скоупов
x = 5пользователь запрашивает автодополнение после этой строки
1) в карте строки с таким экспрешоном нет
2) ищем ближайший наверх
3) показываем скоуп который к нем был привязан
Все это супер криво работает по очевидным причинам
Вторая идея была строить еще одну карту из дерева ренжей скоупов автодополнения, типа
[x = 1 [ y = 2 ] ] = 1-15 привязано к (x), 8-12 к (x,y) вроде неплоха, и мы так путешествуев вглубь каким нибудь умным около бинарным поиском, но оно затратно по памяти и чето както леньИдея сейчас такая, если експрешон на этой строке не нашелся то
1) добавляем прямо в сурс файла спец-символ
2) запускаем фронтенд компиля по файлу, и как токо ресолвер встречает спец-символ то он выбрасывает эксепшон вместе с текущим скоупом
Таким образом можно получать самые точные автодополнения переменных скоупа в мире,
но делать контрол флоу на эксепшонах плоха(
но таааак удобно именно в этом случае, я не могу просто сделать return ведь все в рекурсивном обходе дерева
теоретически можно было бы сделать чтобы ресолв() возвращала бул, и тру в этом буле означало бы продолжение, но это тоже супер запарно
🤯1
У вас есть возможность вернуться на 10 лет назад с тремя абсолютно любыми репозиториями к которым у вас есть/был свободный доступ
Какие репозитории вы выберите?
Какие репозитории вы выберите?