```@DslMarker annotation class MyDsl interface To...
# language-proposals
j
Copy code
@DslMarker
annotation class MyDsl

interface TopLevelBuilder : MethodsThatShouldBeAvailableAnywhere, TopLevelMethodsOnly

interface MethodsThatShouldBeAvailableAnywhere {
  fun doSomethingAnywhere()
}

@MyDsl
interface TopLevelMethodsOnly {
  fun doSomethingAtTopLevel()

  fun lowerLevel(builder: LowerLevelBuilder.() -> Unit)
}

@MyDsl
interface LowerLevelBuilder {
  fun doSomethingAtLowerLevel()
}

fun startDsl(builder: TopLevelBuilder.() -> Unit) {

}

fun main() {
  startDsl {
    doSomethingAnywhere()    // compiles
    doSomethingAtTopLevel()  // compiles

    lowerLevel {
      doSomethingAtLowerLevel() // compiles
      doSomethingAnywhere()     // doesn't compile

      this@startDsl.doSomethingAnywhere()  // compiles but is not very nice
    }
  }
}
I know that I could make all my Builder interface implement
MethodsThatShouldBeAvailableAnywhere
and delegate the calls but I have many of them so it's quite inconvenient.
j
i agree on the slightly different basis that the return and matching @ ought to be deprecated as compiler hints that leaked into the language grammar.