169 похожих чатов

Такой вопрос: что означает @DslMarker аннотация на функции? В документации (см

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: код становится простым, не наклонным. Но вообще как это должно работать? Нужно аннотации и на типах и на методах расставлять?

13 ответов

14 просмотров

Она означает, что если внутри скоупа, образованного этой функцией нельзя вызывать такую же функцию без явного указания this. Но она очень мутно работает, кроме как методом тыка понять невозможно

Vladimir Sitnikov
screenshot Без проблем вызывается

Я же говорю, она очень мутно работает. Не понятно, где работает, а где нет.

Vladimir-Sitnikov Автор вопроса
Alexander Nozik
Я же говорю, она очень мутно работает. Не понятно,...

Ещё раз: документация описывает использование @DslMaker на типах — там понятно как работает. А вот вариант использования аннотации на fun — не документирован

Vladimir Sitnikov
screenshot Без проблем вызывается

а если сам TransactionControllerScope проаннотировать, ошибка появляется?

Vladimir-Sitnikov Автор вопроса
Leonard Startsev
а если сам TransactionControllerScope проаннотиров...

Я сейчас не рассматриваю проблему вложенных http { http { } } — чтобы её запретить нужно у функции http поменять тип лямбды (ну, чтобы она не TestElementScope принимала, а что-нибудь типа TestSamplerScope, которое отличается от TestElementScope тем, что у него не должно быть дочерних элементов)

Vladimir Sitnikov
Ещё раз: документация описывает использование @Dsl...

я вешал на функции для красивой подсветки 🙂

Vladimir-Sitnikov Автор вопроса

Методом проб и ошибок понял, что IDEA 2021.3 выбирает разные цвета для функций, размеченных разными DslMarker аннотациями. Иными словами, DslMarker аннотации на функциях (пока?) не влияют на receiver'ы, но зато они позволяют раскрасить эти самые функции. val/var properties пока не раскрашиваются.

Vladimir Sitnikov
Методом проб и ошибок понял, что IDEA 2021.3 выбир...

это незадокументированная возможность. цвет вычисляется из названия аннотации и мапится на 4 отконфигурированных варианта. кмк - корявые костыли.

Anton Arhipov
это незадокументированная возможность. цвет вычисл...

Варианты вполне документированные, они в настройках есть

Alexander Nozik
Варианты вполне документированные, они в настройка...

нет полной истории. пока у DslMarker-а target выставлен TYPE - это костыли костыльные

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта