Существует ли возможность получиться имя файла и н...
# russian
l
Существует ли возможность получиться имя файла и номер строки?) Для целей логирования. Для jvm/js/common. Как FILE в том же php. Я правда, почти уверен что после компиляции это теряется, но вдруг есть хитрый способ? Хочется сделать логгер крутым, без необходимости создания переменной. Может можно читать со стактрейса?
c
Решения я не дам. Но для JS сам делаю так: сделал объект логирования, а функции
info
,
warning
и т.п. сделал inline. А уже внутри этих функций я вывожу лог. В итоге в консоле сам браузер указывает на нужное место вывода лога. Мне в целом помогает такой вариант. Было бы конечно здорово, если был бы некий предпроцессор, в котором можно как-то дополнительно обрабатывать какие-то вещи. То есть, например скомпилиные в jvm байт-код классы можно подредактировать с помощью библиотеки ASM. Вот было бы здорово если бы на каком-то этапе компиляции можно было бы вмешаться. например. объявляем некую переменную, например
__FILE__
. И используем ее в нужном нам месте. Далее в предпроцессоре
__FILE__
заменяем на имя файла. В итоге в JS уже попадает нужное нам.
l
@snijsure с каким фреймворком на клиенте используете котлин? vue?
l
А как запоминаются номера строк для вывода в стактрейс уже скомпилированного приложения?
w
Посмотри как реализован Timber. Там используется методика которая тебе нужна
l
@whalemare это надстройка над Log андроида, если я все правильно понял. Сам тимбер не вычисляет файл и строку
@lex вы наверно не тому адресовали вопрос. Вероятно имели ввиду @caffeine. Насколько мне известно, он не использует фреймворки на фронте
l
Да, промахнулся
l
Вообще, мне кажется, что получить файл и строку кроссплатформенно получится только написав плагин к компилятору.
Но, я понятия не имею как это сделать и groovy (как и gradle) для меня выглядят как магическое нечто с совершенно непонятным синтаксисом
l
@lewik номера строк сохраняются в метаинформации на уровне байткода jvm, оттуда они попадают в стектрейс. В js отображаются номера строк в загруженом в браузер скрипте
l
@lex но хочется номера строк именно файла котлина. И с inline, как я понимаю такое уже не прокатывает
l
На счет плагина, то только для js, для jvm и так все ок. Для js кстати еще не факт что компилятор поддерживает плагины, надо спрашивать у кого то из команды jetbrains
l
@lex разве инлайны в jvm строки не сбивают ?
l
Собъют, но я не представляю кейса логгировать внутри инлайна
c
inline применительно к логированию в рамках JVM не имеет смысла т.к. в JVM можно получить stacktrace. В JS такая фишка не прокатит. По поводу плагина, на сколько мне известно, в будущем в JB хотели сделать общедоступную возможность писать плагины для компилятора. Эдакий постпроцессор AST. Но пока эта возможность закрыта, т.к. для написания плагинов используется приватное API. Вообще плагины как таковые есть: https://kotlinlang.org/docs/reference/compiler-plugins.html
https://habr.com/company/redmadrobot/blog/351516/ я так понимаю, что BE IR - будет той частью, где плагин может что-то менять