Size: a a a

Kotlin Community

2020 June 05

VS

Vladimir Sitnikov in Kotlin Community
Ayrat Hudaygulov
совсем микро репро:
fun bar(): Int = 1

fun foo(): Unit {
   bar()
}


как сделать это варнингом? пусть даже в линтере Идеи. Идея это пропускает, она умеет только варнинги на неиспользованные значения кидать, но не на результаты функций
javax.annotation.CheckReturnValue
источник

VP

Vladimir Petrakovich in Kotlin Community
Ayrat Hudaygulov
совсем микро репро:
fun bar(): Int = 1

fun foo(): Unit {
   bar()
}


как сделать это варнингом? пусть даже в линтере Идеи. Идея это пропускает, она умеет только варнинги на неиспользованные значения кидать, но не на результаты функций
Проблема в том, что никто не знает, есть ли у функции сайд-эффект, ради которого она и вызывалась. Если ругаться на всё, будет очень много ложных срабатываний.
В идее вроде есть инспекция, которая умеет ругаться на такое для некоторых стандартных функций и для помещенных заданной аннотацией. Но возможно это только для джавы.
источник

AH

Ayrat Hudaygulov in Kotlin Community
Vladimir Sitnikov
javax.annotation.CheckReturnValue
Спасибо, щас попробую
источник

AH

Ayrat Hudaygulov in Kotlin Community
Vladimir Petrakovich
Проблема в том, что никто не знает, есть ли у функции сайд-эффект, ради которого она и вызывалась. Если ругаться на всё, будет очень много ложных срабатываний.
В идее вроде есть инспекция, которая умеет ругаться на такое для некоторых стандартных функций и для помещенных заданной аннотацией. Но возможно это только для джавы.
Ну я-то знаю! Обмажу свои функции дополнительной аннотацией… ну хотя бы так
источник

VP

Vladimir Petrakovich in Kotlin Community
Ayrat Hudaygulov
Ну я-то знаю! Обмажу свои функции дополнительной аннотацией… ну хотя бы так
Надо поискать. А что у вас за баг, к которому приводит неиспользование возвращаемого значения? Обычно такое стреляет только со всякими Deferred.
источник

AH

Ayrat Hudaygulov in Kotlin Community
Vladimir Petrakovich
Надо поискать. А что у вас за баг, к которому приводит неиспользование возвращаемого значения? Обычно такое стреляет только со всякими Deferred.
источник

AH

Ayrat Hudaygulov in Kotlin Community
это ktor
источник

VP

Vladimir Petrakovich in Kotlin Community
Ну если бы ответ был выделен в отдельную переменную, а не возвращался в трёх местах, было бы сложнее так ошибиться 🙂
источник

AH

Ayrat Hudaygulov in Kotlin Community
Vladimir Petrakovich
Ну если бы ответ был выделен в отдельную переменную, а не возвращался в трёх местах, было бы сложнее так ошибиться 🙂
Ну если бы компилятор мне дал по шапке за неиспользуемое значение if выражения я бы сразу всё понял)
источник

VP

Vladimir Petrakovich in Kotlin Community
Ayrat Hudaygulov
Ну если бы компилятор мне дал по шапке за неиспользуемое значение if выражения я бы сразу всё понял)
К сожалению, компилятор не может знать, нужно ли оно вам. А вот ktor позволяет не возвратить ничего)
источник

AH

Ayrat Hudaygulov in Kotlin Community
Vladimir Petrakovich
К сожалению, компилятор не может знать, нужно ли оно вам. А вот ktor позволяет не возвратить ничего)
поэтому я и искал, может это флагом включается..
источник

VP

Vladimir Petrakovich in Kotlin Community
Мне кажется, источник ошибки скорее в том, что обработчик запроса не обязан возвращать ответ
источник

AH

Ayrat Hudaygulov in Kotlin Community
неявный каст в Unit мне не нужен, я бы предпочёл явный
источник

VP

Vladimir Petrakovich in Kotlin Community
Похоже, что для котлина такой инспекции нет. Видимо, остаются только сторонние линтеры. Впрочем, они обычно гибче.
источник

VP

Vladimir Petrakovich in Kotlin Community
Ayrat Hudaygulov
неявный каст в Unit мне не нужен, я бы предпочёл явный
Мне кажется, слишком часто возвращаемое значение игнорируется, чтобы его не делать.
Взять хотя бы методы у коллекций - add/remove/put.
источник

AH

Ayrat Hudaygulov in Kotlin Community
Vladimir Petrakovich
Мне кажется, слишком часто возвращаемое значение игнорируется, чтобы его не делать.
Взять хотя бы методы у коллекций - add/remove/put.
таки да, но варнинг особенно яростно нужен для каста возвращаемого значения (последнего выражения в скоупе). Вот там неявный каст из T в Unit стреляет в ногу

fun foo(): Unit {
 map.put(…)
 map.put(…)
 map.put(…)
 map.put(…)
 map
}


вот тут ок для промежуточных экспрешнов не иметь такого варнинга но для возвращаемого точно стоит
источник

VP

Vladimir Petrakovich in Kotlin Community
Ayrat Hudaygulov
таки да, но варнинг особенно яростно нужен для каста возвращаемого значения (последнего выражения в скоупе). Вот там неявный каст из T в Unit стреляет в ногу

fun foo(): Unit {
 map.put(…)
 map.put(…)
 map.put(…)
 map.put(…)
 map
}


вот тут ок для промежуточных экспрешнов не иметь такого варнинга но для возвращаемого точно стоит
Ну а если последним выражением будет put(), то привет false-positive
источник

AH

Ayrat Hudaygulov in Kotlin Community
Vladimir Petrakovich
Ну а если последним выражением будет put(), то привет false-positive
ну написать в конце
map.put(…).ignore()

fun <T> T.ignore(): Unit = { .. //cast to unit explicitly }
источник

AH

Ayrat Hudaygulov in Kotlin Community
если такой варнинг и будет, он наверное будет за флагом
источник

VP

Vladimir Petrakovich in Kotlin Community
Вам бы наверное Rust понравился)
источник