Kotlin – Ограничить расширение метода расширения

Есть ли способ ограничить методы расширения в DSL?

Скажем, у меня есть такая структура классов:

class Outer { fun middle(op: Middle.() -> Unit): Middle { val middle = Middle() middle.op() return middle } } class Middle { fun inner(op: Inner.() -> Unit): Inner { val inner = Inner() inner.op() return inner } } class Inner fun outer(op: Outer.() -> Unit): Outer { val outer = Outer() outer.op() return outer } 

Затем я могу создать вызов:

 outer { middle { inner { middle { } // Here is the problem } } } 

Моя проблема в том, что помеченный вызов middle { } запутан, поскольку он добавляет Middle к Outer когда он выглядит так, будто он добавляет к Inner .

Есть ли способ не разрешить вызов middle { } ?

Вы можете использовать обходное решение с deprecated :

 class Outer { fun middle(op: Middle.() -> Unit): Middle {...} @Deprecated("can not be used inside a Outer block", level = DeprecationLevel.ERROR) fun outer(op: Outer.() -> Unit): Outer = TODO() } class Middle { fun inner(op: Inner.() -> Unit): Inner {...} @Deprecated("can not be used inside a Middle block", level = DeprecationLevel.ERROR) fun middle(op: Middle.() -> Unit): Middle = TODO() } class Inner { @Deprecated("can not be used inside a Inner block", level = DeprecationLevel.ERROR) fun inner(op: Inner.() -> Unit): Inner = TODO() } 

Теперь компилятор даст вам ошибку, и среда IDE не предложит неправильную функцию в завершении:

 outer { middle { inner { middle { } // error } } } 

Но вы действительно не должны делать это для больших DSL. Лучше подождать https://youtrack.jetbrains.com/issue/KT-11551, как предложил Кирилл Рахман.

Изменить: после того, как я исправил свой пример, он стал намного меньше. С одной фиктивной функцией для класса это не так много шаблонов.

Intereting Posts
Android Studio 3.0 не может предложить импорт для shl и shr в Kotlin Выравнивание двух кнопок по горизонтали программно с использованием компоновки ограничений Kotlin список vs массива Разрешены только безопасные (?.) Или непустые (!!.) Вызовы на приемнике с нулевым значением используя Котлин с Грейдлом Как указать типичные типы утинов (неявный интерфейс) в Котлине? Почему при создании этого проекта появляется ошибка «Нет дескрипторов сборки». Реализация свойств, объявленных в интерфейсах в Котлине Kotlin создает результат запроса для анализа репозиториев github android.view.InflateException: двоичная строка XML-файла # 32: двоичная строка XML-файла # 32: ошибка раздувания класса Преобразование данных с RxJava в Котлине Преобразование Java Collection.toArray в kotlin Как высмеять kotlin ByteArray с помощью Mockito? Как изменить правила подсветки синтаксиса для переменной с модификатором lateinit в IntelliJ (Kotlin)? Android Studio ярлык для автозаполнения Toast (Kotlin)