Er, if the following works:
val a = ContextA()
val instructions: FormParser.InstructionsContext = a.instructions()
And so does this:
val b = ContextB()
val instructions: FormParser.InstructionsContext = b.instructions()
Then you wouldn’t expect the following to work intrinsically, without FormParserContextScope
?
val ab: magic union syntax between ContextA and ContextB = a ?: b
val instructions: FormParser.InstructionsContext = ab.instructions()
And if not, then isn’t magic union syntax between ContextA and ContextB
just the common ancestor, same as today?
You’d expect error: unresolved reference. None of the following candidates is applicable because of receiver type mismatch
, like today?
I guess denotable union types just means you can write, e.g. ContextA | ContextB
vs. BaseContext
. Except the former would preclude ContextC
. Which would be most handy in cases like, e.g. Error | String
. Sorry, thinking out loud.
In that case your (hypothetical) FormParserContextScope< magic union syntax between ContextA and ContextB >
implementation makes sense, thanks!
It’s weird I find, having to write
when (this) {
is ContextA: ranges()
is ContextB: ranges()
}
but not
when (this) {
is ContextA, is ContextB: ranges()
}
Subtle. I guess it makes sense if (without a common ancestor) ContextA::ranges()
≠ ContextB::ranges()
. Will take some getting used to, but probably a rare case. Thanks again for all the help!