PsiLocalVariable (final String baseName, @NotNull PsiType type, final PsiExpression initializer) { final Project project = myClass.getProject(); final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); String baseNameForIndex = baseName; int index = 0; String localName; while(true) { localName = codeStyleManager.suggestUniqueVariableName(baseNameForIndex, myNewExpression, true); if (myClass.findFieldByName(localName, false) == null) { break; } index++; baseNameForIndex = baseName + index; } try { final PsiDeclarationStatement declaration = myElementFactory.createVariableDeclarationStatement(localName, type, initializer); PsiLocalVariable variable = (PsiLocalVariable)declaration.getDeclaredElements()[0]; if (!PsiUtil.isLanguageLevel8OrHigher(myNewExpression) || JavaCodeStyleSettings.getInstance(initializer.getContainingFile()).GENERATE_FINAL_LOCALS) { PsiUtil.setModifierProperty(variable, PsiModifier.FINAL, true); } final PsiElement parent = myNewStatement.getParent(); if (parent instanceof PsiCodeBlock) { variable = (PsiLocalVariable)((PsiDeclarationStatement)parent.addBefore(declaration, myNewStatement)).getDeclaredElements()[0]; } else if (myNewStatement instanceof PsiLambdaExpression) { final Object marker = new Object(); PsiTreeUtil.mark(myNewExpression, marker); PsiCodeBlock block = CommonJavaRefactoringUtil.expandExpressionLambdaToCodeBlock((PsiLambdaExpression)myNewStatement); myNewStatement = block.getStatements()[0]; myNewExpression = (PsiNewExpression)PsiTreeUtil.releaseMark(myNewStatement, marker); variable = (PsiLocalVariable)((PsiDeclarationStatement)block.addBefore(declaration, myNewStatement)).getDeclaredElements()[0]; myConstructorArguments = initConstructorArguments(); } else { final int offsetInStatement = myNewExpression.getTextRange().getStartOffset() - myNewStatement.getTextRange().getStartOffset(); final PsiBlockStatement blockStatement = (PsiBlockStatement)myElementFactory.createStatementFromText("{}", null); PsiCodeBlock block = blockStatement.getCodeBlock(); block.add(declaration); block.add(myNewStatement); block = ((PsiBlockStatement)myNewStatement.replace(blockStatement)).getCodeBlock(); variable = (PsiLocalVariable)((PsiDeclarationStatement)block.getStatements()[0]).getDeclaredElements()[0]; myNewStatement = block.getStatements()[1]; myNewExpression = PsiTreeUtil.getParentOfType(myNewStatement.findElementAt(offsetInStatement), PsiNewExpression.class); myConstructorArguments = initConstructorArguments(); } return variable; } catch (IncorrectOperationException e) { LOG.error(e); return null; } }