AccessWideningVisitor
own is the module's classes — see erase. superInit is the direct superclass when the visited method is a constructor, null otherwise — see bridgeSpecial.
Functions
Reroutes a class's invokespecial through the bridge. A super call always goes, as every other call to a foreign member does: AccessBridge.superCall opens the method, and its erased descriptor takes an argument that crossed the bridge as Object. A constructor goes only where the call as written would fail — its descriptor names a type the bridge erased, so verification would fail, and the whole class with it; or the constructor itself is not public (closedInit) — since rerouting one costs a discarded allocation. True if owner's call was rerouted.
Lambdas (LambdaMetafactory call sites the Kotlin compiler emits). Two things here name a type we erased and must move with it: the captured-argument descriptor, and the impl-method handle — which points at the snippet's OWN synthetic method, whose signature widenAccessClass's visitMethod already erased. instantiatedMethodType describes that handle, so it moves too (INSTANTIATED_TYPE).
A class literal, ::class, of a class a snippet cannot name, as a dynamic constant AccessBridge.classConstant resolves by name, where loading is not access-checked: still a constant, now one the snippet can load.
A type instruction naming a class a snippet cannot is itself access-checked. Each of the three with a fixed stack shape therefore moves into the bridge, which loads the class by name, where loading is not access-checked, and keeps the instruction's own semantics: