    public void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) {
        final String opString = Printer.OPCODES[opcode];
        final String decompiledOwnerFullClassName = DeclarationWorker.decompileFullClassName(owner);
        final String ownerClassName = decompileClassNameWithOuterClasses(owner);
        List<Expression> arguments = getInvocationArguments(desc);
        String returnType = getInvocationReturnType(desc);
        final boolean hasVoidReturnType = hasVoidReturnType(desc);
        String invocationName = name;
        boolean isStaticInvocation = false;
        if (opString.contains("INVOKEVIRTUAL") || opString.contains("INVOKEINTERFACE")) {
            if (!name.equals("<init>")) {
                appendInstanceInvocation(name, hasVoidReturnType ? "" : returnType, arguments, myBodyStack.pop());
                return;
            }
        }
        if (opString.contains("INVOKESPECIAL")) {
            if (name.equals("<init>")) {
                final Expression lambdaFunction = tryVisitLambdaFunction(owner);
                if (lambdaFunction != null) {
                    myBodyStack.pop();
                    myBodyStack.pop();
                    myBodyStack.push(lambdaFunction);
                    return;
                }
                myDecompiledMethod.addImport(decompiledOwnerFullClassName);
                invocationName = ownerClassName;
                returnType = invocationName + " ";
            } else if (!myDecompiledOwnerFullClassName.equals(decompiledOwnerFullClassName)) {
                invocationName = "super<" + ownerClassName + ">."  + name;
            }
        }
        if (opString.contains("INVOKESTATIC")) {
            myDecompiledMethod.addImport(decompiledOwnerFullClassName);
            if (!ownerClassName.equals("KotlinPackage")) {
                if (!decompiledOwnerFullClassName.contains(".src.")) {
                    invocationName = ownerClassName + "." + name;
                } else {
                    invocationName = name;
                }
            } else {
                appendInstanceInvocation(name, hasVoidReturnType ? "" : returnType, arguments, arguments.remove(0));
                return;
            }
            isStaticInvocation = true;
            if (name.equals("checkParameterIsNotNull")) {
                ((KotlinVariable) arguments.get(0)).setIsNotNull(true);
                return;
            }
        }
        appendInvocationOrConstructor(isStaticInvocation, name, invocationName, hasVoidReturnType ? "" : returnType, arguments, decompiledOwnerFullClassName);
    }

    public void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) {
        final String opString = Printer.OPCODES[opcode];
        final String decompiledOwnerFullClassName = DeclarationWorker.decompileFullClassName(owner);
        final String ownerClassName = decompileClassNameWithOuterClasses(owner);
        List<Expression> arguments = getInvocationArguments(desc);
        String returnType = getInvocationReturnType(desc);
        final boolean hasVoidReturnType = hasVoidReturnType(desc);
        String invocationName = name;
        boolean isStaticInvocation = false;
        if (opString.contains("INVOKEVIRTUAL") || opString.contains("INVOKEINTERFACE")) {
            if (!name.equals("<init>")) {
                appendInstanceInvocation(name, hasVoidReturnType ? "" : returnType, arguments, myBodyStack.pop());
                return;
            }
        }
        if (opString.contains("INVOKESPECIAL")) {
            if (name.equals("<init>")) {
                final Expression lambdaFunction = tryVisitLambdaFunction(owner);
                if (lambdaFunction != null) {
                    myBodyStack.pop();
                    myBodyStack.pop();
                    myBodyStack.push(lambdaFunction);
                    return;
                }
                myDecompiledMethod.addImport(decompiledOwnerFullClassName);
                invocationName = ownerClassName;
                returnType = invocationName + " ";
            } else if (!myDecompiledOwnerFullClassName.equals(decompiledOwnerFullClassName)) {
                invocationName = "super<" + ownerClassName + ">."  + name;
            }
        }
        if (opString.contains("INVOKESTATIC")) {
            myDecompiledMethod.addImport(decompiledOwnerFullClassName);
            if (!ownerClassName.equals("KotlinPackage") && !ownerClassName.equals(myDecompiledMethod.getDecompiledClass().getName())) {
                if (!decompiledOwnerFullClassName.contains(".src.")) {
                    if (ownerClassName.contains("..")) {
                        invocationName = "super<" + ownerClassName.substring(0, ownerClassName.indexOf("..")) + ">."  + name;
                        appendInstanceInvocation(invocationName, hasVoidReturnType ? "" : returnType, arguments, arguments.remove(0));
                        return;
                    } else {
                        invocationName = ownerClassName + "." + name;
                    }
                } else {
                    invocationName = name;
                }
            } else {
                appendInstanceInvocation(name, hasVoidReturnType ? "" : returnType, arguments, arguments.remove(0));
                return;
            }
            isStaticInvocation = true;
            if (name.equals("checkParameterIsNotNull")) {
                ((KotlinVariable) arguments.get(0)).setIsNotNull(true);
                return;
            }
        }
        appendInvocationOrConstructor(isStaticInvocation, name, invocationName, hasVoidReturnType ? "" : returnType, arguments, decompiledOwnerFullClassName);
    }
