@Override protected void invokeImpl(final PsiClass targetClass) { if (CreateFromUsageUtils.isValidReference(myReferenceExpression, true)) { return; } final Project project = myReferenceExpression.getProject(); PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory(); final PsiFile targetFile = targetClass.getContainingFile(); PsiType[] expectedTypes = CreateFromUsageUtils.guessType(myReferenceExpression, false); PsiType type = expectedTypes[0]; String varName = myReferenceExpression.getReferenceName(); PsiExpression initializer = null; boolean isInline = false; PsiExpression[] expressions = CreateFromUsageUtils.collectExpressions( myReferenceExpression, PsiMember.class, PsiFile.class); PsiStatement anchor = getAnchor(expressions); if (anchor instanceof PsiExpressionStatement && ((PsiExpressionStatement) anchor).getExpression() instanceof PsiAssignmentExpression) { PsiAssignmentExpression assignment = (PsiAssignmentExpression) ((PsiExpressionStatement) anchor).getExpression(); if (assignment.getLExpression().textMatches(myReferenceExpression)) { initializer = assignment.getRExpression(); isInline = true; } } PsiDeclarationStatement decl = factory.createVariableDeclarationStatement(varName, type, initializer); TypeExpression expression = new TypeExpression(project, expectedTypes); if (isInline) { final PsiExpression expr = ((PsiExpressionStatement) anchor).getExpression(); final PsiElement semicolon = expr.getNextSibling(); if (semicolon != null) { final PsiElement nextSibling = semicolon.getNextSibling(); if (nextSibling != null) { decl.addRange(nextSibling, anchor.getLastChild()); } } decl = (PsiDeclarationStatement) anchor.replace(decl); } else { decl = (PsiDeclarationStatement) anchor.getParent().addBefore(decl, anchor); } PsiVariable var = (PsiVariable) decl.getDeclaredElements()[0]; boolean isFinal = CodeStyleSettingsManager.getSettings(project).GENERATE_FINAL_LOCALS && !CreateFromUsageUtils.isAccessedForWriting(expressions); PsiUtil.setModifierProperty(var, PsiModifier.FINAL, isFinal); var = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(var); if (var == null) return; TemplateBuilderImpl builder = new TemplateBuilderImpl(var); builder.replaceElement(var.getTypeElement(), expression); builder.setEndVariableAfter(var.getNameIdentifier()); Template template = builder.buildTemplate(); final Editor newEditor = positionCursor(project, targetFile, var); TextRange range = var.getTextRange(); newEditor.getDocument().deleteString(range.getStartOffset(), range.getEndOffset()); startTemplate( newEditor, template, project, new TemplateEditingAdapter() { @Override public void templateFinished(Template template, boolean brokenOff) { PsiDocumentManager.getInstance(project).commitDocument(newEditor.getDocument()); final int offset = newEditor.getCaretModel().getOffset(); final PsiLocalVariable localVariable = PsiTreeUtil.findElementOfClassAtOffset( targetFile, offset, PsiLocalVariable.class, false); if (localVariable != null) { ApplicationManager.getApplication() .runWriteAction( new Runnable() { @Override public void run() { CodeStyleManager.getInstance(project).reformat(localVariable); } }); } } }); }
private void processVariable(final PsiVariable variable) { if (myLineRange.intersects(variable.getTextRange()) && myVisibleLocals.contains(variable.getName())) { myVars.add(variable.getName()); } }