void (UsageInfo @NotNull [] usages) { ChangeContextUtil.encodeContextInfo(myMethod, false); PsiMethod ctorCopy = (PsiMethod)myMethod.copy(); ChangeContextUtil.clearContextInfo(myMethod); ChangeContextUtil.encodeContextInfo(myNextMethod, false); PsiMethod nextCopy = (PsiMethod)myNextMethod.copy(); ChangeContextUtil.clearContextInfo(myNextMethod); InlineMethodHelper ctorHelper = new InlineMethodHelper(myProject, myMethod, ctorCopy, myNewExpression); InlineMethodHelper nextHelper = new InlineMethodHelper(myProject, myNextMethod, nextCopy, myNextCall); PsiClass aClass = myMethod.getContainingClass(); assert aClass != null; PsiElementFactory factory = JavaPsiFacade.getElementFactory(myProject); PsiCodeBlock target = factory.createCodeBlock(); List<PsiLocalVariable> fieldLocals = new ArrayList<>(); for (PsiField field : aClass.getFields()) { if (!field.hasModifierProperty(PsiModifier.STATIC)) { PsiDeclarationStatement declaration = factory.createVariableDeclarationStatement(field.getName(), field.getType(), field.getInitializer(), aClass); fieldLocals.add((PsiLocalVariable)((PsiDeclarationStatement)target.add(declaration)).getDeclaredElements()[0]); } } PsiLocalVariable[] ctorParameters = ctorHelper.declareParameters(); ctorHelper.substituteTypes(ctorParameters); InlineTransformer ctorTransformer = InlineTransformer.getSuitableTransformer(myMethod).apply(myReference); ctorTransformer.transformBody(ctorCopy, myReference, PsiTypes.voidType()); PsiCodeBlock ctorBody = Objects.requireNonNull(ctorCopy.getBody()); InlineUtil.solveVariableNameConflicts(ctorBody, target, ctorBody); updateFieldRefs(ctorCopy, aClass); ctorParameters = addRange(target, ctorBody, ctorParameters); PsiLocalVariable[] nextParameters = nextHelper.declareParameters(); nextHelper.substituteTypes(nextParameters); InlineTransformer nextTransformer = InlineTransformer.getSuitableTransformer(myNextMethod).apply(myNextCall.getMethodExpression()); PsiLocalVariable result = nextTransformer.transformBody(nextCopy, myNextCall.getMethodExpression(), myNextCall.getType()); PsiCodeBlock nextBody = Objects.requireNonNull(nextCopy.getBody()); InlineUtil.solveVariableNameConflicts(nextBody, target, nextBody); updateFieldRefs(nextCopy, aClass); if (result != null) { PsiLocalVariable[] resultAndParameters = ArrayUtil.prepend(result, nextParameters); resultAndParameters = addRange(target, nextBody, resultAndParameters); result = resultAndParameters[0]; nextParameters = Arrays.copyOfRange(resultAndParameters, 1, resultAndParameters.length); } else { nextParameters = addRange(target, nextBody, nextParameters); } InlineUtil.solveVariableNameConflicts(target, myReference.getElement(), target); ctorHelper.initializeParameters(ctorParameters); nextHelper.initializeParameters(nextParameters); removeRedundantFieldVars(fieldLocals, target); ctorHelper.inlineParameters(ctorParameters); nextHelper.inlineParameters(nextParameters); PsiElement anchor = CommonJavaRefactoringUtil.getParentStatement(myNextCall, true); assert anchor != null; PsiElement anchorParent = anchor.getParent(); PsiStatement[] statements = target.getStatements(); PsiElement firstBodyElement = target.getFirstBodyElement(); if (firstBodyElement instanceof PsiWhiteSpace) firstBodyElement = PsiTreeUtil.skipWhitespacesForward(firstBodyElement); PsiElement firstAdded = null; if (firstBodyElement != null && firstBodyElement != target.getRBrace()) { int last = statements.length - 1; final PsiElement rBraceOrReturnStatement = last >= 0 ? PsiTreeUtil.skipWhitespacesAndCommentsForward(statements[last]) : target.getLastBodyElement(); assert rBraceOrReturnStatement != null; final PsiElement beforeRBraceStatement = rBraceOrReturnStatement.getPrevSibling(); assert beforeRBraceStatement != null; firstAdded = anchorParent.addRangeBefore(firstBodyElement, beforeRBraceStatement, anchor); ChangeContextUtil.decodeContextInfo(anchorParent, null, null); } PsiReferenceExpression resultUsage = InlineMethodProcessor.replaceCall(factory, myNextCall, firstAdded, result); if (resultUsage != null) { PsiLocalVariable resultVar = ExpressionUtils.resolveLocalVariable(resultUsage); if (resultVar != null) { InlineUtil.tryInlineResultVariable(resultVar, resultUsage); } } }