public InlineResult doInline( @NotNull MethodVisitor adapter, @NotNull LocalVarRemapper remapper, boolean remapReturn, @NotNull LabelOwner labelOwner) { // analyze body MethodNode transformedNode = markPlacesForInlineAndRemoveInlinable(node); // substitute returns with "goto end" instruction to keep non local returns in lambdas Label end = new Label(); transformedNode = doInline(transformedNode); removeClosureAssertions(transformedNode); InsnList instructions = transformedNode.instructions; instructions.resetLabels(); MethodNode resultNode = new MethodNode( InlineCodegenUtil.API, transformedNode.access, transformedNode.name, transformedNode.desc, transformedNode.signature, ArrayUtil.toStringArray(transformedNode.exceptions)); RemapVisitor visitor = new RemapVisitor(resultNode, remapper, nodeRemapper); try { transformedNode.accept(visitor); } catch (Exception e) { throw wrapException(e, transformedNode, "couldn't inline method call"); } resultNode.visitLabel(end); if (inliningContext.isRoot()) { InternalFinallyBlockInliner.processInlineFunFinallyBlocks(resultNode, lambdasFinallyBlocks); } processReturns(resultNode, labelOwner, remapReturn, end); // flush transformed node to output resultNode.accept(new InliningInstructionAdapter(adapter)); return result; }