From cbd273dda851449ce80f99786183074f855962ce Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 18 Jan 2017 13:50:46 +0700 Subject: [PATCH] StreamApiMigration: minor fixes in FindFirst scenarios --- .../streamMigration/FindFirstMigration.java | 40 +++++++++---------- .../afterFindFirstValueReused.java | 14 +++++++ .../beforeFindFirstValueReused.java | 18 +++++++++ 3 files changed, 52 insertions(+), 20 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstValueReused.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstValueReused.java diff --git a/java/java-impl/src/com/intellij/codeInspection/streamMigration/FindFirstMigration.java b/java/java-impl/src/com/intellij/codeInspection/streamMigration/FindFirstMigration.java index b1565cfe154d..44599fb3057d 100644 --- a/java/java-impl/src/com/intellij/codeInspection/streamMigration/FindFirstMigration.java +++ b/java/java-impl/src/com/intellij/codeInspection/streamMigration/FindFirstMigration.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,8 @@ import com.intellij.psi.util.PsiTypesUtil; import com.siyeh.ig.psiutils.ExpressionUtils; import org.jetbrains.annotations.NotNull; +import static com.intellij.util.ObjectUtils.tryCast; + /** * @author Tagir Valeev */ @@ -63,31 +65,29 @@ class FindFirstMigration extends BaseStreamApiMigration { return loopStatement.replace(elementFactory.createStatementFromText( tb.generate() + ".findFirst().ifPresent(" + LambdaUtil.createLambda(tb.getVariable(), expression) + ");", loopStatement)); } - PsiExpression lValue = assignment.getLExpression(); - if (!(lValue instanceof PsiReferenceExpression)) return null; - PsiElement element = ((PsiReferenceExpression)lValue).resolve(); - if (!(element instanceof PsiVariable)) return null; - PsiVariable var = (PsiVariable)element; + PsiReferenceExpression lValue = tryCast(assignment.getLExpression(), PsiReferenceExpression.class); + if (lValue == null) return null; + PsiVariable var = tryCast(lValue.resolve(), PsiVariable.class); + if (var == null) return null; PsiExpression value = assignment.getRExpression(); if (value == null) return null; restoreComments(loopStatement, body); InitializerUsageStatus status = StreamApiMigrationInspection.getInitializerUsageStatus(var, loopStatement); - if (status != InitializerUsageStatus.UNKNOWN) { - PsiExpression initializer = var.getInitializer(); - if (initializer != null) { - String replacementText = generateOptionalUnwrap(tb, value, initializer, var.getType()); - return replaceInitializer(loopStatement, var, initializer, replacementText, status); + PsiExpression initializer = var.getInitializer(); + PsiExpression falseExpression = lValue; + if (status != InitializerUsageStatus.UNKNOWN && + (status != InitializerUsageStatus.AT_WANTED_PLACE || ExpressionUtils.isSimpleExpression(initializer))) { + falseExpression = initializer; + } else { + PsiElement maybeAssignment = PsiTreeUtil.skipSiblingsBackward(loopStatement, PsiWhiteSpace.class, PsiComment.class); + PsiExpression prevRValue = ExpressionUtils.getAssignmentTo(maybeAssignment, var); + if (prevRValue != null) { + maybeAssignment.delete(); + falseExpression = prevRValue; } } - PsiElement maybeAssignment = PsiTreeUtil.skipSiblingsBackward(loopStatement, PsiWhiteSpace.class, PsiComment.class); - PsiExpression prevRValue = ExpressionUtils.getAssignmentTo(maybeAssignment, var); - if(prevRValue != null) { - maybeAssignment.delete(); - return loopStatement.replace(elementFactory.createStatementFromText( - var.getName() + " = " + generateOptionalUnwrap(tb, value, prevRValue, var.getType()) + ";", loopStatement)); - } - return loopStatement.replace(elementFactory.createStatementFromText( - var.getName() + " = " + generateOptionalUnwrap(tb, value, lValue, var.getType()) + ";", loopStatement)); + String replacementText = generateOptionalUnwrap(tb, value, falseExpression, var.getType()); + return replaceInitializer(loopStatement, var, initializer, replacementText, status); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstValueReused.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstValueReused.java new file mode 100644 index 000000000000..a8ac65c0ee7d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstValueReused.java @@ -0,0 +1,14 @@ +// "Replace with findFirst()" "true" + +import java.util.stream.IntStream; + +public class Test { + public static void main(String[] args) { + String s = " hello "; + String res = s.trim(); + if(args.length == 0) { + res = IntStream.range(0, s.length()).boxed().filter(x -> s.charAt(x) == 'l').findFirst().map(String::valueOf).orElse(res); + } + System.out.println(res); + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstValueReused.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstValueReused.java new file mode 100644 index 000000000000..7a059d1101ea --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstValueReused.java @@ -0,0 +1,18 @@ +// "Replace with findFirst()" "true" + +public class Test { + public static void main(String[] args) { + String s = " hello "; + String res = s.trim(); + if(args.length == 0) { + for (int i = 0; i < s.length(); i++) { + Integer x = i; + if (s.charAt(x) == 'l') { + res = String.valueOf(x); + break; + } + } + } + System.out.println(res); + } +}