@Override protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiType thrownType = myThrown.getType(); if (thrownType == null) { return; } final PsiElement typeElement = descriptor.getPsiElement(); if (typeElement == null) { return; } final PsiElement catchParameter = typeElement.getParent(); if (!(catchParameter instanceof PsiParameter)) { return; } final PsiElement catchBlock = ((PsiParameter) catchParameter).getDeclarationScope(); if (!(catchBlock instanceof PsiCatchSection)) { return; } final PsiCatchSection myBeforeCatchSection = (PsiCatchSection) catchBlock; final PsiTryStatement myTryStatement = myBeforeCatchSection.getTryStatement(); final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); final String name = codeStyleManager.suggestUniqueVariableName("e", myTryStatement.getTryBlock(), false); final PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory(); final PsiCatchSection section = factory.createCatchSection(thrownType, name, myTryStatement); final PsiCatchSection element = (PsiCatchSection) myTryStatement.addBefore(section, myBeforeCatchSection); codeStyleManager.shortenClassReferences(element); if (isOnTheFly()) { final PsiCodeBlock newBlock = element.getCatchBlock(); assert newBlock != null; final TextRange range = SurroundWithUtil.getRangeToSelect(newBlock); final PsiFile file = element.getContainingFile(); final Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); if (editor == null) { return; } final Document document = PsiDocumentManager.getInstance(project).getDocument(file); if (editor.getDocument() != document) { return; } editor.getCaretModel().moveToOffset(range.getStartOffset()); editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); editor.getSelectionModel().setSelection(range.getStartOffset(), range.getEndOffset()); } }
private void checkCatchSection(PsiCatchSection section) { final PsiCodeBlock block = section.getCatchBlock(); if (block == null || !isCatchBlockEmpty(block)) { return; } final PsiParameter parameter = section.getParameter(); if (parameter == null) { return; } final PsiIdentifier identifier = parameter.getNameIdentifier(); if (identifier == null) { return; } @NonNls final String parameterName = parameter.getName(); if (m_ignoreIgnoreParameter && ("ignore".equals(parameterName) || "ignored".equals(parameterName))) { return; } final PsiElement catchToken = section.getFirstChild(); if (catchToken == null) { return; } registerError(catchToken); }
public void replace(final ReplacementInfo info, ReplaceOptions options) { PsiElement elementToReplace = info.getMatch(0); PsiElement elementParent = elementToReplace.getParent(); String replacementToMake = info.getReplacement(); Project project = myContext.getProject(); PsiElement el = findRealSubstitutionElement(elementToReplace); boolean listContext = isListContext(el); if (el instanceof PsiAnnotation && !StringUtil.startsWithChar(replacementToMake, '@')) { replacementToMake = "@" + replacementToMake; } PsiElement[] statements = ReplacerUtil.createTreeForReplacement( replacementToMake, el instanceof PsiMember && !isSymbolReplacement(el) ? PatternTreeContext.Class : PatternTreeContext.Block, myContext); if (listContext) { if (statements.length > 1) { elementParent.addRangeBefore( statements[0], statements[statements.length - 1], elementToReplace); } else if (statements.length == 1) { PsiElement replacement = getMatchExpr(statements[0], elementToReplace); handleModifierList(el, replacement); replacement = handleSymbolReplacement(replacement, el); if (replacement instanceof PsiTryStatement) { final List<PsiCatchSection> unmatchedCatchSections = el.getUserData(JavaMatchingVisitor.UNMATCHED_CATCH_SECTION_CONTENT_VAR_KEY); final PsiCatchSection[] catches = ((PsiTryStatement) replacement).getCatchSections(); if (unmatchedCatchSections != null) { for (int i = unmatchedCatchSections.size() - 1; i >= 0; --i) { final PsiParameter parameter = unmatchedCatchSections.get(i).getParameter(); final PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory(); final PsiCatchSection catchSection = elementFactory.createCatchSection(parameter.getType(), parameter.getName(), null); catchSection.getCatchBlock().replace(unmatchedCatchSections.get(i).getCatchBlock()); replacement.addAfter(catchSection, catches[catches.length - 1]); replacement.addBefore(createWhiteSpace(replacement), replacement.getLastChild()); } } } try { final PsiElement inserted = elementParent.addBefore(replacement, elementToReplace); if (replacement instanceof PsiComment && (elementParent instanceof PsiIfStatement || elementParent instanceof PsiLoopStatement)) { elementParent.addAfter(createSemicolon(replacement), inserted); } } catch (IncorrectOperationException e) { elementToReplace.replace(replacement); } } } else if (statements.length > 0) { PsiElement replacement = ReplacerUtil.copySpacesAndCommentsBefore( elementToReplace, statements, replacementToMake, elementParent); replacement = getMatchExpr(replacement, elementToReplace); if (replacement instanceof PsiStatement && !(replacement.getLastChild() instanceof PsiJavaToken) && !(replacement.getLastChild() instanceof PsiComment)) { // assert w/o ; final PsiElement prevLastChildInParent = replacement.getLastChild().getPrevSibling(); if (prevLastChildInParent != null) { elementParent.addRangeBefore(replacement.getFirstChild(), prevLastChildInParent, el); } else { elementParent.addBefore(replacement.getFirstChild(), el); } el.getNode().getTreeParent().removeChild(el.getNode()); } else { // preserve comments handleModifierList(el, replacement); if (replacement instanceof PsiClass) { // modifier list final PsiStatement[] searchStatements = getCodeBlock().getStatements(); if (searchStatements.length > 0 && searchStatements[0] instanceof PsiDeclarationStatement && ((PsiDeclarationStatement) searchStatements[0]).getDeclaredElements()[0] instanceof PsiClass) { final PsiClass replaceClazz = (PsiClass) replacement; final PsiClass queryClazz = (PsiClass) ((PsiDeclarationStatement) searchStatements[0]).getDeclaredElements()[0]; final PsiClass clazz = (PsiClass) el; if (replaceClazz.getExtendsList().getTextLength() == 0 && queryClazz.getExtendsList().getTextLength() == 0 && clazz.getExtendsList().getTextLength() != 0) { replaceClazz.addBefore( clazz.getExtendsList().getPrevSibling(), replaceClazz.getExtendsList()); // whitespace replaceClazz .getExtendsList() .addRange( clazz.getExtendsList().getFirstChild(), clazz.getExtendsList().getLastChild()); } if (replaceClazz.getImplementsList().getTextLength() == 0 && queryClazz.getImplementsList().getTextLength() == 0 && clazz.getImplementsList().getTextLength() != 0) { replaceClazz.addBefore( clazz.getImplementsList().getPrevSibling(), replaceClazz.getImplementsList()); // whitespace replaceClazz .getImplementsList() .addRange( clazz.getImplementsList().getFirstChild(), clazz.getImplementsList().getLastChild()); } if (replaceClazz.getTypeParameterList().getTextLength() == 0 && queryClazz.getTypeParameterList().getTextLength() == 0 && clazz.getTypeParameterList().getTextLength() != 0) { // skip < and > replaceClazz.getTypeParameterList().replace(clazz.getTypeParameterList()); } } } replacement = handleSymbolReplacement(replacement, el); el.replace(replacement); } } else { final PsiElement nextSibling = el.getNextSibling(); el.delete(); if (nextSibling instanceof PsiWhiteSpace && nextSibling.isValid()) { nextSibling.delete(); } } if (listContext) { final int matchSize = info.getMatchesCount(); for (int i = 0; i < matchSize; ++i) { PsiElement matchElement = info.getMatch(i); PsiElement element = findRealSubstitutionElement(matchElement); if (element == null) continue; PsiElement firstToDelete = element; PsiElement lastToDelete = element; PsiElement prevSibling = element.getPrevSibling(); PsiElement nextSibling = element.getNextSibling(); if (prevSibling instanceof PsiWhiteSpace) { firstToDelete = prevSibling; prevSibling = prevSibling != null ? prevSibling.getPrevSibling() : null; } else if (prevSibling == null && nextSibling instanceof PsiWhiteSpace) { lastToDelete = nextSibling; } if (nextSibling instanceof XmlText && i + 1 < matchSize) { final PsiElement next = info.getMatch(i + 1); if (next != null && next == nextSibling.getNextSibling()) { lastToDelete = nextSibling; } } if (element instanceof PsiExpression) { final PsiElement parent = element.getParent().getParent(); if ((parent instanceof PsiCall || parent instanceof PsiAnonymousClass) && prevSibling instanceof PsiJavaToken && ((PsiJavaToken) prevSibling).getTokenType() == JavaTokenType.COMMA) { firstToDelete = prevSibling; } } else if (element instanceof PsiParameter && prevSibling instanceof PsiJavaToken && ((PsiJavaToken) prevSibling).getTokenType() == JavaTokenType.COMMA) { firstToDelete = prevSibling; } element.getParent().deleteChildRange(firstToDelete, lastToDelete); } } }
@Override public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiReferenceExpression parameterReference = (PsiReferenceExpression) descriptor.getPsiElement(); final PsiElement target = parameterReference.resolve(); if (!(target instanceof PsiParameter)) { return; } final PsiParameter parameter = (PsiParameter) target; final PsiElement declarationScope = parameter.getDeclarationScope(); final PsiElement body; if (declarationScope instanceof PsiMethod) { final PsiMethod method = (PsiMethod) declarationScope; body = method.getBody(); } else if (declarationScope instanceof PsiCatchSection) { final PsiCatchSection catchSection = (PsiCatchSection) declarationScope; body = catchSection.getCatchBlock(); } else if (declarationScope instanceof PsiLoopStatement) { final PsiLoopStatement forStatement = (PsiLoopStatement) declarationScope; final PsiStatement forBody = forStatement.getBody(); if (forBody instanceof PsiBlockStatement) { final PsiBlockStatement blockStatement = (PsiBlockStatement) forBody; body = blockStatement.getCodeBlock(); } else { body = forBody; } } else { return; } if (body == null) { return; } final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project); final String parameterName = parameterReference.getText(); final JavaCodeStyleManager javaCodeStyleManager = JavaCodeStyleManager.getInstance(project); final String variableName = javaCodeStyleManager.suggestUniqueVariableName(parameterName, parameterReference, true); final SearchScope scope = parameter.getUseScope(); final Query<PsiReference> search = ReferencesSearch.search(parameter, scope); final PsiReference reference = search.findFirst(); if (reference == null) { return; } final PsiElement element = reference.getElement(); if (!(element instanceof PsiReferenceExpression)) { return; } final PsiReferenceExpression firstReference = (PsiReferenceExpression) element; final PsiElement[] children = body.getChildren(); final int startIndex; final int endIndex; if (body instanceof PsiCodeBlock) { startIndex = 1; endIndex = children.length - 1; } else { startIndex = 0; endIndex = children.length; } boolean newDeclarationCreated = false; final StringBuilder buffer = new StringBuilder(); for (int i = startIndex; i < endIndex; i++) { final PsiElement child = children[i]; newDeclarationCreated |= replaceVariableName(child, firstReference, variableName, parameterName, buffer); } final String replacementText; if (newDeclarationCreated) { replacementText = "{" + buffer + '}'; } else { final PsiType type = parameterReference.getType(); if (type == null) { return; } final String className = type.getCanonicalText(); replacementText = '{' + className + ' ' + variableName + " = " + parameterName + ';' + buffer + '}'; } final PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory(); final PsiCodeBlock block = elementFactory.createCodeBlockFromText(replacementText, null); body.replace(block); codeStyleManager.reformat(declarationScope); }