https://kotlinlang.org/docs/type-safe-builders.html#scope-control-dslmarker) (и в документации к самой DslMarker! https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-dsl-marker/) рассмотрен только вариант расстановки этой аннотации у классов и интерфейсов. Аннотирование функций не предусмотрено.
Если же заглянуть в kotlinx-html, то там у всех функций-тегов расставлена такая аннотация:
https://github.com/Kotlin/kotlinx.html/blob/24ef7f418687ce4241ec111f757b09e8b4f5bf79/src/commonMain/kotlin/generated/gen-tags-p.kt#L49-L50
@HtmlTagMarker
inline fun PICTURE.img(alt : String? = null, src : String? = null, classes : String? = null, crossinline block : IMG.() -> Unit = {}) : Unit = IMG(attributesMapOf("alt", alt,"src", src,"class", classes), consumer).visit(block)
При этом у интерфейса htmltag такая же аннотация тоже присутствует:
https://github.com/Kotlin/kotlinx.html/blob/24ef7f418687ce4241ec111f757b09e8b4f5bf79/src/commonMain/kotlin/api.kt#L18-L19
@HtmlTagMarker
interface Tag {
Из побочных эффектов заметил, что в моём случае добавление аннотации на fun меняет стиль в IDEA: код становится простым, не наклонным. Но вообще как это должно работать? Нужно аннотации и на типах и на методах расставлять?
Она означает, что если внутри скоупа, образованного этой функцией нельзя вызывать такую же функцию без явного указания this. Но она очень мутно работает, кроме как методом тыка понять невозможно
Я же говорю, она очень мутно работает. Не понятно, где работает, а где нет.
Ещё раз: документация описывает использование @DslMaker на типах — там понятно как работает. А вот вариант использования аннотации на fun — не документирован
а если сам TransactionControllerScope проаннотировать, ошибка появляется?
Я сейчас не рассматриваю проблему вложенных http { http { } } — чтобы её запретить нужно у функции http поменять тип лямбды (ну, чтобы она не TestElementScope принимала, а что-нибудь типа TestSamplerScope, которое отличается от TestElementScope тем, что у него не должно быть дочерних элементов)
я вешал на функции для красивой подсветки 🙂
Методом проб и ошибок понял, что IDEA 2021.3 выбирает разные цвета для функций, размеченных разными DslMarker аннотациями. Иными словами, DslMarker аннотации на функциях (пока?) не влияют на receiver'ы, но зато они позволяют раскрасить эти самые функции. val/var properties пока не раскрашиваются.
это незадокументированная возможность. цвет вычисляется из названия аннотации и мапится на 4 отконфигурированных варианта. кмк - корявые костыли.
Варианты вполне документированные, они в настройках есть
нет полной истории. пока у DslMarker-а target выставлен TYPE - это костыли костыльные
Обсуждают сегодня