Проверить, вызван ли он из Java (или определить функцию только для Java) - PullRequest
0 голосов
/ 18 января 2019

В библиотеке я хочу что-то вроде этого:

@JvmStatic
inline fun d(message: String) = log { Logger.d(message) }

В kotlin эта функция встроена, поэтому интересный стек вызовов начинается с уровня x. В Java код не встроен, поэтому интересный стек вызовов начинается с уровня x + 1 (+1 для статической функции).

Есть ли какой-нибудь способ узнать в функции, вызывается ли она в классе java или классе kotlin? Или даже лучше, я могу написать две функции, одну только для колтина и одну только для Java? (JvmSynthetic например, скрыл бы код от классов Java, но я не могу найти что-то подобное наоборот).

Следующие псевдо-решения будут работать:

// pseudo code - idea 1

@JvmStatic
inline fun d(message: String) = log { 
   if (CALLED_FROM_JAVA)
       Logger.adjustCallStackOffset(1)
   Logger.d(message) 
}

// pseudo code - idea 2

@JvmStatic @HideFromKotlin
inline fun d(message: String) = log { 
   Logger.adjustCallStackOffset(1)
   Logger.d(message) 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...