(experimental) interface IrThinVisitor
diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt
index 3b91eeb..028eb93 100644
--- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt
+++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt
@@ -136,7 +136,7 @@
     val inlinedInto: ExpressionCodegen?,
     val smap: SourceMapper,
     val reifiedTypeParametersUsages: ReifiedTypeParametersUsages,
-) : IrThinVisitor<PromisedValue, BlockInfo>(), BaseExpressionCodegen {
+) : IrThinVisitor<PromisedValue, BlockInfo>, BaseExpressionCodegen {
 
     override fun toString(): String = signature.toString()
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrThinVisitor.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrThinVisitor.kt
index 344468b0..34126b8 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrThinVisitor.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrThinVisitor.kt
@@ -9,201 +9,201 @@
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.*
 
-abstract class IrThinVisitor<out R, in D> {
-    abstract fun visitElement(element: IrElement, data: D): R
+interface IrThinVisitor<out R, in D> {
+    fun visitElement(element: IrElement, data: D): R
 
-    open fun visitModuleFragment(declaration: IrModuleFragment, data: D): R =
+    fun visitModuleFragment(declaration: IrModuleFragment, data: D): R =
         visitElement(declaration, data)
 
-    open fun visitFile(declaration: IrFile, data: D): R =
+    fun visitFile(declaration: IrFile, data: D): R =
         visitElement(declaration, data)
 
-    open fun visitExternalPackageFragment(declaration: IrExternalPackageFragment, data: D): R =
+    fun visitExternalPackageFragment(declaration: IrExternalPackageFragment, data: D): R =
         visitElement(declaration, data)
 
-    open fun visitScript(declaration: IrScript, data: D): R =
+    fun visitScript(declaration: IrScript, data: D): R =
         visitElement(declaration, data)
 
-    open fun visitClass(declaration: IrClass, data: D): R =
+    fun visitClass(declaration: IrClass, data: D): R =
         visitElement(declaration, data)
 
-    open fun visitSimpleFunction(declaration: IrSimpleFunction, data: D): R =
+    fun visitSimpleFunction(declaration: IrSimpleFunction, data: D): R =
         visitElement(declaration, data)
 
-    open fun visitConstructor(declaration: IrConstructor, data: D): R =
+    fun visitConstructor(declaration: IrConstructor, data: D): R =
         visitElement(declaration, data)
 
-    open fun visitProperty(declaration: IrProperty, data: D) =
+    fun visitProperty(declaration: IrProperty, data: D) =
         visitElement(declaration, data)
 
-    open fun visitField(declaration: IrField, data: D) =
+    fun visitField(declaration: IrField, data: D) =
         visitElement(declaration, data)
 
-    open fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty, data: D) =
+    fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty, data: D) =
         visitElement(declaration, data)
 
-    open fun visitVariable(declaration: IrVariable, data: D) =
+    fun visitVariable(declaration: IrVariable, data: D) =
         visitElement(declaration, data)
 
-    open fun visitEnumEntry(declaration: IrEnumEntry, data: D) =
+    fun visitEnumEntry(declaration: IrEnumEntry, data: D) =
         visitElement(declaration, data)
 
-    open fun visitAnonymousInitializer(declaration: IrAnonymousInitializer, data: D) =
+    fun visitAnonymousInitializer(declaration: IrAnonymousInitializer, data: D) =
         visitElement(declaration, data)
 
-    open fun visitTypeParameter(declaration: IrTypeParameter, data: D) =
+    fun visitTypeParameter(declaration: IrTypeParameter, data: D) =
         visitElement(declaration, data)
 
-    open fun visitValueParameter(declaration: IrValueParameter, data: D) =
+    fun visitValueParameter(declaration: IrValueParameter, data: D) =
         visitElement(declaration, data)
 
-    open fun visitTypeAlias(declaration: IrTypeAlias, data: D) =
+    fun visitTypeAlias(declaration: IrTypeAlias, data: D) =
         visitElement(declaration, data)
 
-    open fun visitExpressionBody(body: IrExpressionBody, data: D) =
+    fun visitExpressionBody(body: IrExpressionBody, data: D) =
         visitElement(body, data)
 
-    open fun visitBlockBody(body: IrBlockBody, data: D) =
+    fun visitBlockBody(body: IrBlockBody, data: D) =
         visitElement(body, data)
 
-    open fun visitSyntheticBody(body: IrSyntheticBody, data: D) =
+    fun visitSyntheticBody(body: IrSyntheticBody, data: D) =
         visitElement(body, data)
 
-    open fun visitSuspendableExpression(expression: IrSuspendableExpression, data: D) =
+    fun visitSuspendableExpression(expression: IrSuspendableExpression, data: D) =
         visitElement(expression, data)
 
-    open fun visitSuspensionPoint(expression: IrSuspensionPoint, data: D) =
+    fun visitSuspensionPoint(expression: IrSuspensionPoint, data: D) =
         visitElement(expression, data)
 
-    open fun visitConst(expression: IrConst<*>, data: D) =
+    fun visitConst(expression: IrConst<*>, data: D) =
         visitElement(expression, data)
 
-    open fun visitConstantObject(expression: IrConstantObject, data: D) =
+    fun visitConstantObject(expression: IrConstantObject, data: D) =
         visitElement(expression, data)
 
-    open fun visitConstantPrimitive(expression: IrConstantPrimitive, data: D) =
+    fun visitConstantPrimitive(expression: IrConstantPrimitive, data: D) =
         visitElement(expression, data)
 
-    open fun visitConstantArray(expression: IrConstantArray, data: D) =
+    fun visitConstantArray(expression: IrConstantArray, data: D) =
         visitElement(expression, data)
 
-    open fun visitVararg(expression: IrVararg, data: D) =
+    fun visitVararg(expression: IrVararg, data: D) =
         visitElement(expression, data)
 
-    open fun visitSpreadElement(spread: IrSpreadElement, data: D) =
+    fun visitSpreadElement(spread: IrSpreadElement, data: D) =
         visitElement(spread, data)
 
-    open fun visitBlock(expression: IrBlock, data: D) =
+    fun visitBlock(expression: IrBlock, data: D) =
         visitElement(expression, data)
 
-    open fun visitComposite(expression: IrComposite, data: D) =
+    fun visitComposite(expression: IrComposite, data: D) =
         visitElement(expression, data)
 
-    open fun visitStringConcatenation(expression: IrStringConcatenation, data: D) =
+    fun visitStringConcatenation(expression: IrStringConcatenation, data: D) =
         visitElement(expression, data)
 
-    open fun visitGetObjectValue(expression: IrGetObjectValue, data: D) =
+    fun visitGetObjectValue(expression: IrGetObjectValue, data: D) =
         visitElement(expression, data)
 
-    open fun visitGetEnumValue(expression: IrGetEnumValue, data: D) =
+    fun visitGetEnumValue(expression: IrGetEnumValue, data: D) =
         visitElement(expression, data)
 
-    open fun visitGetValue(expression: IrGetValue, data: D) =
+    fun visitGetValue(expression: IrGetValue, data: D) =
         visitElement(expression, data)
 
-    open fun visitSetValue(expression: IrSetValue, data: D) =
+    fun visitSetValue(expression: IrSetValue, data: D) =
         visitElement(expression, data)
 
-    open fun visitGetField(expression: IrGetField, data: D) =
+    fun visitGetField(expression: IrGetField, data: D) =
         visitElement(expression, data)
 
-    open fun visitSetField(expression: IrSetField, data: D) =
+    fun visitSetField(expression: IrSetField, data: D) =
         visitElement(expression, data)
 
-    open fun visitCall(expression: IrCall, data: D) =
+    fun visitCall(expression: IrCall, data: D) =
         visitElement(expression, data)
 
-    open fun visitConstructorCall(expression: IrConstructorCall, data: D) =
+    fun visitConstructorCall(expression: IrConstructorCall, data: D) =
         visitElement(expression, data)
 
-    open fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, data: D) =
+    fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, data: D) =
         visitElement(expression, data)
 
-    open fun visitEnumConstructorCall(expression: IrEnumConstructorCall, data: D) =
+    fun visitEnumConstructorCall(expression: IrEnumConstructorCall, data: D) =
         visitElement(expression, data)
 
-    open fun visitGetClass(expression: IrGetClass, data: D) =
+    fun visitGetClass(expression: IrGetClass, data: D) =
         visitElement(expression, data)
 
-    open fun visitFunctionReference(expression: IrFunctionReference, data: D) =
+    fun visitFunctionReference(expression: IrFunctionReference, data: D) =
         visitElement(expression, data)
 
-    open fun visitPropertyReference(expression: IrPropertyReference, data: D) =
+    fun visitPropertyReference(expression: IrPropertyReference, data: D) =
         visitElement(expression, data)
 
-    open fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference, data: D) =
+    fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference, data: D) =
         visitElement(expression, data)
 
-    open fun visitRawFunctionReference(expression: IrRawFunctionReference, data: D) =
+    fun visitRawFunctionReference(expression: IrRawFunctionReference, data: D) =
         visitElement(expression, data)
 
-    open fun visitFunctionExpression(expression: IrFunctionExpression, data: D) =
+    fun visitFunctionExpression(expression: IrFunctionExpression, data: D) =
         visitElement(expression, data)
 
-    open fun visitClassReference(expression: IrClassReference, data: D) =
+    fun visitClassReference(expression: IrClassReference, data: D) =
         visitElement(expression, data)
 
-    open fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall, data: D) =
+    fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall, data: D) =
         visitElement(expression, data)
 
-    open fun visitTypeOperator(expression: IrTypeOperatorCall, data: D) =
+    fun visitTypeOperator(expression: IrTypeOperatorCall, data: D) =
         visitElement(expression, data)
 
-    open fun visitWhen(expression: IrWhen, data: D) =
+    fun visitWhen(expression: IrWhen, data: D) =
         visitElement(expression, data)
 
-    open fun visitBranch(branch: IrBranch, data: D) =
+    fun visitBranch(branch: IrBranch, data: D) =
         visitElement(branch, data)
 
-    open fun visitElseBranch(branch: IrElseBranch, data: D) =
+    fun visitElseBranch(branch: IrElseBranch, data: D) =
         visitBranch(branch, data)
 
-    open fun visitWhileLoop(loop: IrWhileLoop, data: D) =
+    fun visitWhileLoop(loop: IrWhileLoop, data: D) =
         visitElement(loop, data)
 
-    open fun visitDoWhileLoop(loop: IrDoWhileLoop, data: D) =
+    fun visitDoWhileLoop(loop: IrDoWhileLoop, data: D) =
         visitElement(loop, data)
 
-    open fun visitTry(aTry: IrTry, data: D) =
+    fun visitTry(aTry: IrTry, data: D) =
         visitElement(aTry, data)
 
-    open fun visitCatch(aCatch: IrCatch, data: D) =
+    fun visitCatch(aCatch: IrCatch, data: D) =
         visitElement(aCatch, data)
 
-    open fun visitBreak(jump: IrBreak, data: D) =
+    fun visitBreak(jump: IrBreak, data: D) =
         visitElement(jump, data)
 
-    open fun visitContinue(jump: IrContinue, data: D) =
+    fun visitContinue(jump: IrContinue, data: D) =
         visitElement(jump, data)
 
-    open fun visitReturn(expression: IrReturn, data: D) =
+    fun visitReturn(expression: IrReturn, data: D) =
         visitElement(expression, data)
 
-    open fun visitThrow(expression: IrThrow, data: D) =
+    fun visitThrow(expression: IrThrow, data: D) =
         visitElement(expression, data)
 
-    open fun visitDynamicOperatorExpression(expression: IrDynamicOperatorExpression, data: D) =
+    fun visitDynamicOperatorExpression(expression: IrDynamicOperatorExpression, data: D) =
         visitElement(expression, data)
 
-    open fun visitDynamicMemberExpression(expression: IrDynamicMemberExpression, data: D) =
+    fun visitDynamicMemberExpression(expression: IrDynamicMemberExpression, data: D) =
         visitElement(expression, data)
 
-    open fun visitErrorDeclaration(declaration: IrErrorDeclaration, data: D) =
+    fun visitErrorDeclaration(declaration: IrErrorDeclaration, data: D) =
         visitElement(declaration, data)
 
-    open fun visitErrorExpression(expression: IrErrorExpression, data: D) =
+    fun visitErrorExpression(expression: IrErrorExpression, data: D) =
         visitElement(expression, data)
 
-    open fun visitErrorCallExpression(expression: IrErrorCallExpression, data: D) =
+    fun visitErrorCallExpression(expression: IrErrorCallExpression, data: D) =
         visitErrorExpression(expression, data)
 }