
Alexander
02.01.2018
22:54:51
защита состоит в том чтобы не писать res as T как возвращаемое значение(очень корявый костыль, почти как `!!`), а корректно определить систему типов в которой решить может generic быть null или нет

Mi
02.01.2018
22:56:27
может кто напомнить чатик по котлин-андроиду?

Sergey
02.01.2018
22:57:49
@kotlin_mobile

Mi
02.01.2018
23:00:13
хотя, может вопрос не полностью по андроиду, хочется создать проект gradle, где будет модуль с общей логикой, андроид и веб-сервер как подпроекты, если у кого-нибудь есть какие-нибуть гайды или примеры проектов, буду признателен

Google

Kirill
02.01.2018
23:00:57

Евгений
02.01.2018
23:03:41
в примере показывается то что, когда тип nullable то нет смысла беспокоится о том что вернет getSmth внутри getSmth.. т.к null будет для класса наследника корретным значением. уже не знаю как обьяснить. я думаю тут объективным критерием должен быть законченный сценарий, при котором компилятор предупреждает NPE в рантайме. я пока не могу придумать такой сценарий

Mi
02.01.2018
23:04:17

Kirill
02.01.2018
23:07:36

Mi
02.01.2018
23:08:11
ну, тут всегда есть компромис между скоростью и качеством

Kirill
02.01.2018
23:09:11
ну можешь сюда посмотреть:
https://blog.jetbrains.com/idea/2016/10/intellij-idea-2016-3-eap-gradle-composite-builds-and-android-studio-2-2/
https://blog.jetbrains.com/idea/2017/03/webinar-recording-composite-builds-with-gradle/

Alexander
02.01.2018
23:15:37

Евгений
02.01.2018
23:16:51
раз реального сценария нет, значит это ложное срабатывание - бага

Alexander
02.01.2018
23:17:28
так как нет же?

Евгений
02.01.2018
23:17:38
покажешь?

Alexander
02.01.2018
23:18:00
вот здесь же

Евгений
02.01.2018
23:18:20
такого чтобы изза добавления as T в рантайме случился реальный NPE

Google

Евгений
02.01.2018
23:18:30
изза этого добавления

Alexander
02.01.2018
23:20:32
fun main(args: Array<String>) {
var a = Abv()
var c: String = a.getSmth()
println(a.getSmth())
}
abstract class SomeClass<T> {
private var metadata: T? = null
fun getSmth(): T {
var res = metadata
if (res == null) {
res = transform()
metadata = res
}
return res as T
}
abstract fun transform(): T
}
class Abv : SomeClass<String?>() {
override fun transform(): String? {
return null
}
}

Евгений
02.01.2018
23:21:17
ошибка в строке: String = a.getSmth()

Alexander
02.01.2018
23:21:25
Error:(12, 20) Type mismatch: inferred type is String? but String was expected

Евгений
02.01.2018
23:21:36
но это не NPE :)
я про NullPointerException

Alexander
02.01.2018
23:23:06
да, действительно, плохой пример. под конец дня ещё и сюда придумывать сложно) дай подумать
не, сегодня уже не придумаю, пора уходить с работы)) может быть NPE и нет, но выглядит всё равно плохо

Евгений
02.01.2018
23:48:18
надеюсь это интересная работа, а не заставляют до 2 ночи сидеть))

Kirill
02.01.2018
23:49:10
предположу, что часовой пояс около NYС

Alexander
02.01.2018
23:49:46
Есть одна мысль, приду домой проверю

Kira
03.01.2018
12:42:33
Вообще Сергей Крюков очень круто рассказал про Kotlin, Groovy и Gradle
https://www.youtube.com/watch?v=TobSxJVOyzU
Спасибо, будет полезно.
Кстати обнаружил что идея умеет генерить проекты с Kotlin-DSL, что приятно.. но вспомнил в чем была у меня когда-то неприятность. У нас доступ к зависимостям только через локальный артифактори, так что такие генерилки не работают, а в Kotlin-DSL не обнаружил возможности устанавливать репы из которых плагины качать.
Так же только что проверил: создал проект с Kotlin-DSL, собирается, норм, но всё так же подсвечивалось красным, пришлось переоткрыть и после переиндексации наконец подсветка заработала.
Попробую вечером protobuf снова завести на нём.

swh
03.01.2018
12:48:05
Звучит неплохо

Boris
03.01.2018
14:57:38
появилась у меня такая вот прикладная задачка, есть у меня совершенно неудобочитаемый код, как его превратить в читаемую корутину?
https://gist.github.com/fogone/4970627a8c788ec5787f20a43a2a317f
есть какие-то еще более изящные способы?
мда, ща гист сделаю

Sergey
03.01.2018
15:04:01
repositoryService.getOrgRepositories(organization)
.map(::findRepositoryPrsAsync)
.flatMap { it.await() }
и я б возвращаемые типы явные убрал
а там обязательно нужны CompletableFuture?

Roman
03.01.2018
15:44:52

Google

Roman
03.01.2018
15:46:24
Не нужно плодить в проекте Async функции. Конвертация suspend > async тривиальная операция.
Сначала оба запроса надо сконвертить из CompletableFuture в suspend функцию, я это там снизу приписал, но можно и без вспомогательных функций, а просто использовать await прям в цепочке.
async(Unconfined) - запустит асинхронную задачу не привязанную к какому-либо диспетчеру.

Sergey
03.01.2018
15:50:36
.map { it.await() }
.flatten()
flatMap же)

Roman
03.01.2018
15:52:31
ага, можно им.

Sergey
03.01.2018
16:26:45
@leukinrs ты уже полностью на корутины переехал? или пока только балуешься?

Roman
03.01.2018
16:42:19
Полностью. На андроиде очень здорово они работают.
Раньше юзал свою либу типа CompletableFuture, тож на котлине, но корутины в разы удобнее.

Javokhir
03.01.2018
19:46:48
Hi everyone!! Can u share Kotlin in Action( ebook ) if u have please

Boris
03.01.2018
19:48:52
Yw

Kira
03.01.2018
19:49:31
Что-то я влез в Gradle Kotlin-DSL снова и чувствую что зря..
Когда плагины пишут на груви в итоге нетипизированное зло принимающее везде на входы голые Closure.
Кто-нибудь плагин protobuf настраивал? Я запарился уже)

Javokhir
03.01.2018
19:50:16
But I searched free?

Boris
03.01.2018
19:54:10
Я так плагин для артифактири напедалил

Kira
03.01.2018
19:56:04
closureOf() твоё всё
delegateClosureOf пользую, но когда билд запускается, но не работает - сложно сказать что не так)
java плагин хоть говорил что хочет
В коде повсюду такое:
ProtobufConfigurator protobuf(Closure configureClosure)
Пытаюсь развить у себя экстрасенсорные способности)

Kirill
03.01.2018
20:15:07
Мне помогло чтение кода плагина, когда я свой писал

Google

Kira
03.01.2018
20:16:31
Активно читаю его, но не могу понять как он работает, думаю это из-за адской ненависти к динамическим языкам..

Kirill
03.01.2018
20:18:48
Понатыкать println, собрать из модифицированных исходников, подключить из mavenLocal ?:)

Boris
03.01.2018
20:19:04

Жабра
03.01.2018
20:21:21

Kira
03.01.2018
20:22:13

Admin
ERROR: S client not available

Boris
03.01.2018
20:23:05
Так эта, тип без Closure надо писать

Kira
03.01.2018
20:24:01
Вот только что писал для java плагина, компилятор ругался и говорил что хочет, а здесь тишина

Sergey
03.01.2018
20:30:49

Boris
03.01.2018
20:36:33

Kira
03.01.2018
20:38:06

Boris
03.01.2018
20:38:50
Посмотри как сделана сборка самого котлиндсл

Kira
03.01.2018
20:47:16

Boris
03.01.2018
20:47:59
Нет, build.gradle.kts
https://github.com/gradle/kotlin-dsl/blob/master/build.gradle.kts
Смотри артифактори

Kira
03.01.2018
21:00:01
Смотри артифактори
Посмотрел, вроде то что я уже делал, компилятор не ругается чтобы я ему ни писал)
Этот плагин еще и в жаба-плагин залазит

Boris
03.01.2018
21:01:42
Там пример того как вызывать динамически

Google

Boris
03.01.2018
21:02:16
Что вызвать надо смотреть или в документации или в срцах

Kira
03.01.2018
21:06:59
Буду дальше вглядываться в эти таски и материть гугл)

Boris
03.01.2018
21:09:29
Так ты смотри не все подряд, а только экстеншены
Посмотри какие экстеншены используются

Kira
03.01.2018
21:12:27
Отдельного файла типа JavaPluginExtension там нет, так что смотрю всё подряд

Boris
03.01.2018
21:13:14
Так эта, что за плагин-то?

Kira
03.01.2018
21:13:57
id 'com.google.protobuf' version '0.8.3'
https://github.com/google/protobuf-gradle-plugin

Boris
03.01.2018
21:14:45
Мм, причем тогда тут джава?

Kira
03.01.2018
21:16:16
Это был пример, а в джава-плагине еще кусок добавляется от этого плагина

Boris
03.01.2018
21:17:40
Так если даже уже есть груви вариант , о надо просто оттуда и взять
А джаваплагин хорошо типизирован

Kira
03.01.2018
21:19:16
Джаваплагин sourceSet не особо понятен, увы, я что-то там написал, но уверенности нет
Груви вариант и использовал в коде что выше слал, но не отрабатывает

Boris
03.01.2018
21:20:21
Сорссет надо по имени получить сначала как из мапа

Kira
03.01.2018
21:21:33
Запускается, правда без эффекта
java {
sourceSets(delegateClosureOf<DefaultSourceSetContainer> {
create("proto", closureOf<DefaultSourceSet> {
withGroovyBuilder {
"proto" {
"srcDir"("proto")
}
}
})
})
}

Boris
03.01.2018
21:22:11
А груви оттранслировать в динамические вызовы, к это сделано в грувидсл билде