@Override public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException { try { if (!FileModificationService.getInstance().preparePsiElementForWrite(element)) return; final PsiJavaToken token = (PsiJavaToken) element; final PsiPolyadicExpression expression = SplitConditionUtil.findCondition(element, true, false); final PsiLambdaExpression lambdaExpression = PsiTreeUtil.getParentOfType(expression, PsiLambdaExpression.class); LOG.assertTrue(lambdaExpression != null); final String lambdaParameterName = lambdaExpression.getParameterList().getParameters()[0].getName(); final PsiMethodCallExpression methodCallExpression = PsiTreeUtil.getParentOfType(expression, PsiMethodCallExpression.class); LOG.assertTrue(methodCallExpression != null, expression); PsiExpression lOperand = getLOperands(expression, token); PsiExpression rOperand = getROperands(expression, token); final Collection<PsiComment> comments = PsiTreeUtil.findChildrenOfType(expression, PsiComment.class); final PsiMethodCallExpression chainedCall = (PsiMethodCallExpression) JavaPsiFacade.getElementFactory(project) .createExpressionFromText( "a.filter(" + lambdaParameterName + " -> x)", expression); final PsiExpression argExpression = chainedCall.getArgumentList().getExpressions()[0]; final PsiElement rReplaced = ((PsiLambdaExpression) argExpression).getBody().replace(rOperand); final PsiExpression compoundArg = methodCallExpression.getArgumentList().getExpressions()[0]; final int separatorOffset = token.getTextOffset(); for (PsiComment comment : comments) { if (comment.getTextOffset() < separatorOffset) { compoundArg.getParent().add(comment); } else { rReplaced.getParent().add(comment); } } ((PsiLambdaExpression) compoundArg).getBody().replace(lOperand); chainedCall.getMethodExpression().getQualifierExpression().replace(methodCallExpression); methodCallExpression.replace(chainedCall); } catch (IncorrectOperationException e) { LOG.error(e); } }
@Override protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression) descriptor.getPsiElement().getParent().getParent(); final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); final PsiExpression qualifier = methodExpression.getQualifierExpression(); if (qualifier == null) { PsiReplacementUtil.replaceExpression(methodCallExpression, "this"); } else { methodCallExpression.replace(qualifier); } }
@Override protected void doFix(Project project, ProblemDescriptor descriptor) { final PsiElement element = descriptor.getPsiElement(); final PsiClass aClass = ClassUtils.getContainingStaticClass(element); if (aClass == null) { return; } final PsiElement parent = element.getParent(); if (!(parent instanceof PsiReferenceExpression)) { return; } final PsiReferenceExpression methodExpression = (PsiReferenceExpression) parent; final PsiElement grandParent = methodExpression.getParent(); if (!(grandParent instanceof PsiMethodCallExpression)) { return; } final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression) grandParent; final PsiExpressionList list = methodCallExpression.getArgumentList(); final PsiExpression[] expressions = list.getExpressions(); @NonNls final StringBuilder fieldText = new StringBuilder( "private static final java.util.regex.Pattern PATTERN = java.util.regex.Pattern.compile("); final int expressionsLength = expressions.length; if (expressionsLength > 0) { fieldText.append(expressions[0].getText()); } @NonNls final String methodName = methodExpression.getReferenceName(); final boolean literalReplacement = "replace".equals(methodName); if (literalReplacement) { fieldText.append(", java.util.regex.Pattern.LITERAL"); } fieldText.append(");"); @NonNls final StringBuilder expressionText = new StringBuilder("PATTERN."); final PsiExpression qualifier = methodExpression.getQualifierExpression(); @NonNls final String qualifierText = (qualifier == null) ? "this" : qualifier.getText(); if ("split".equals(methodName)) { expressionText.append(methodName); expressionText.append('('); expressionText.append(qualifierText); for (int i = 1; i < expressionsLength; i++) { expressionText.append(',').append(expressions[i].getText()); } expressionText.append(')'); } else { expressionText.append("matcher(").append(qualifierText).append(")."); if (literalReplacement) { expressionText.append("replaceAll"); } else { expressionText.append(methodName); } expressionText.append('('); if (literalReplacement) { expressionText.append("java.util.regex.Matcher.quoteReplacement("); } if (expressionsLength > 1) { expressionText.append(expressions[1].getText()); for (int i = 2; i < expressionsLength; i++) { expressionText.append(',').append(expressions[i].getText()); } } if (literalReplacement) { expressionText.append(')'); } expressionText.append(')'); } final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); final PsiField newField = factory.createFieldFromText(fieldText.toString(), element); final PsiElement field = aClass.add(newField); final PsiExpression newExpression = factory.createExpressionFromText(expressionText.toString(), element); PsiMethodCallExpression newMethodCallExpression = (PsiMethodCallExpression) methodCallExpression.replace(newExpression); newMethodCallExpression = CodeInsightUtilCore.forcePsiPostprocessAndRestoreElement(newMethodCallExpression); final PsiReferenceExpression reference = getReference(newMethodCallExpression); HighlightUtils.showRenameTemplate(aClass, (PsiNameIdentifierOwner) field, reference); }