FILE: B.kt
    public final class B : R|A| {
        public constructor(): R|B| {
            super<R|A|>()
        }

        protected open override infix fun foo(s: R|kotlin/String|): R|kotlin/String| {
            ^foo String()
        }

        public final fun testProtected(): R|kotlin/String| {
            ^testProtected this@R|/B|.R|/B.foo|(String(hello))
        }

    }
FILE: A.kt
    public abstract class A : R|kotlin/Any| {
        public constructor(): R|A| {
            super<R|kotlin/Any|>()
        }

        protected abstract infix fun foo(s: R|kotlin/String|): R|kotlin/String|

    }
FILE: main.kt
    public final fun test(b: R|B|): R|kotlin/String| {
        ^test R|<local>/b|.R|/B.foo<HIDDEN: /B.foo is invisible>#|(String(hello))
    }
