diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/guava/GuavaFluentIterableConversionRule.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/guava/GuavaFluentIterableConversionRule.java index 5470b7623979..2a5ef5292606 100644 --- a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/guava/GuavaFluentIterableConversionRule.java +++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/guava/GuavaFluentIterableConversionRule.java @@ -229,6 +229,24 @@ public class GuavaFluentIterableConversionRule extends BaseGuavaTypeConversionRu }; needSpecifyType = false; } + else if (methodName.equals("last")) { + descriptorBase = new TypeConversionDescriptor("$it$.last()", null) { + @Override + public PsiExpression replace(PsiExpression expression, TypeEvaluator evaluator) { + final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(expression.getProject()); + String varA = suggestName("a", codeStyleManager, expression); + String varB = suggestName("b", codeStyleManager, expression); + setReplaceByString("$it$.reduce((" + varA + ", " + varB + ") -> " + varB + ")"); + return super.replace(expression, evaluator); + } + + private String suggestName(String baseName, JavaCodeStyleManager codeStyleManager, PsiElement place) { + final SuggestedNameInfo suggestedNameInfo = codeStyleManager + .suggestVariableName(VariableKind.LOCAL_VARIABLE, baseName, null, null, false); + return codeStyleManager.suggestUniqueVariableName(suggestedNameInfo, place, false).names[0]; + } + }; + } else { final TypeConversionDescriptorFactory base = DESCRIPTORS_MAP.get(methodName); if (base != null) { diff --git a/java/typeMigration/test/com/intellij/codeInsight/inspections/GuavaInspectionTest.java b/java/typeMigration/test/com/intellij/codeInsight/inspections/GuavaInspectionTest.java index 29613ff79a02..e50479f9da49 100644 --- a/java/typeMigration/test/com/intellij/codeInsight/inspections/GuavaInspectionTest.java +++ b/java/typeMigration/test/com/intellij/codeInsight/inspections/GuavaInspectionTest.java @@ -289,6 +289,10 @@ public class GuavaInspectionTest extends JavaCodeInsightFixtureTestCase { doTest(); } + public void testFluentIterableLast() { + doTest(); + } + private void doTestNoQuickFixes(Class... highlightedElements) { myFixture.configureByFile(getTestName(true) + ".java"); diff --git a/java/typeMigration/testData/inspections/guava/fluentIterableLast.java b/java/typeMigration/testData/inspections/guava/fluentIterableLast.java new file mode 100644 index 000000000000..7d60a1e0bf5d --- /dev/null +++ b/java/typeMigration/testData/inspections/guava/fluentIterableLast.java @@ -0,0 +1,11 @@ +import com.google.common.base.Optional; +import com.google.common.collect.FluentIterable; + +import java.util.ArrayList; + +public class LastMigration { + + void m(ArrayList ss, String a, String b) { + Optional last = FluentIterable.from(ss).last(); + } +} diff --git a/java/typeMigration/testData/inspections/guava/fluentIterableLast_after.java b/java/typeMigration/testData/inspections/guava/fluentIterableLast_after.java new file mode 100644 index 000000000000..b4b867fd51b0 --- /dev/null +++ b/java/typeMigration/testData/inspections/guava/fluentIterableLast_after.java @@ -0,0 +1,9 @@ +import java.util.ArrayList; +import java.util.Optional; + +public class LastMigration { + + void m(ArrayList ss, String a, String b) { + Optional last = ss.stream().reduce((a1, b1) -> b1); + } +}