interface Context1 interface Context2 { fun getContextElement(): A } class Context2Impl(value: A) : Context2 { override fun getContextElement(): A val value: A } context(Int, String) class A { constructor(int: Int) } context(Context1, c2@Context2) class B { override fun toString(): String } context(Context2) class C { val a: A get() } context(Context1) @Deprecated(message = "Use `B` instead.") class D context(b@B, `fun`@A) fun foo() context(Context2>) fun bar(): C