From e1f423e1d47e4492d99c3120242d7ac8456cc084 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 7 Apr 2017 15:19:49 +0300 Subject: [PATCH] IDEA-171134 Extract as method object generates the same getters --- .../ExtractMethodObjectProcessor.java | 27 ++++++++++++----- .../SameFieldsWithPrefix.java | 10 +++++++ .../SameFieldsWithPrefix.java.after | 30 +++++++++++++++++++ ...ethodObjectWithMultipleExitPointsTest.java | 20 +++++++++++-- 4 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/SameFieldsWithPrefix.java create mode 100644 java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/SameFieldsWithPrefix.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java index c34722cafebd..651b4612ecac 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.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. @@ -61,6 +61,8 @@ import com.intellij.usageView.UsageViewUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; +import com.intellij.util.text.UniqueNameGenerator; +import one.util.streamex.StreamEx; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -86,6 +88,7 @@ public class ExtractMethodObjectProcessor extends BaseRefactoringProcessor { private PsiClass myInnerClass; private boolean myChangeReturnType; private Runnable myCopyMethodToInner; + private final UniqueNameGenerator myFieldNameGenerator = new UniqueNameGenerator(); private static final Key GENERATED_RETURN = new Key<>("GENERATED_RETURN"); @@ -163,8 +166,9 @@ public class ExtractMethodObjectProcessor extends BaseRefactoringProcessor { } if (myExtractProcessor.generatesConditionalExit()) { - myInnerClass.add(myElementFactory.createField("myResult", PsiPrimitiveType.BOOLEAN)); - myInnerClass.add(myElementFactory.createMethodFromText("boolean is(){return myResult;}", myInnerClass)); + String resultName = uniqueFieldName(new String[]{"myResult"}); + myInnerClass.add(myElementFactory.createField(resultName, PsiPrimitiveType.BOOLEAN)); + myInnerClass.add(myElementFactory.createMethodFromText("boolean is(){return " + resultName + ";}", myInnerClass)); } final PsiParameter[] parameters = getMethod().getParameterList().getParameters(); @@ -635,7 +639,8 @@ public class ExtractMethodObjectProcessor extends BaseRefactoringProcessor { if (type instanceof PsiEllipsisType) type = ((PsiEllipsisType)type).toArrayType(); try { final JavaCodeStyleManager styleManager = JavaCodeStyleManager.getInstance(getMethod().getProject()); - final String fieldName = styleManager.suggestVariableName(VariableKind.FIELD, styleManager.variableNameToPropertyName(parameterName, VariableKind.PARAMETER), null, type).names[0]; + String fieldName = uniqueFieldName(styleManager.suggestVariableName( + VariableKind.FIELD, styleManager.variableNameToPropertyName(parameterName, VariableKind.PARAMETER), null, type).names); PsiField field = myElementFactory.createField(fieldName, type); final PsiModifierList modifierList = field.getModifierList(); @@ -725,6 +730,15 @@ public class ExtractMethodObjectProcessor extends BaseRefactoringProcessor { return true; } + private String uniqueFieldName(String[] candidates) { + String name = StreamEx.of(candidates).findFirst(myFieldNameGenerator::isUnique).orElse(null); + if (name == null) { + name = myFieldNameGenerator.generateUniqueName(candidates[0]); + } + myFieldNameGenerator.addExistingName(name); + return name; + } + public class MyExtractMethodProcessor extends ExtractMethodProcessor { public MyExtractMethodProcessor(Project project, @@ -767,9 +781,8 @@ public class ExtractMethodObjectProcessor extends BaseRefactoringProcessor { for (int i = 0; i < myOutputVariables.length; i++) { PsiVariable variable = myOutputVariables[i]; if (!myInputVariables.contains(variable)) { //one field creation - final JavaCodeStyleManager styleManager = JavaCodeStyleManager.getInstance(myProject); - final String fieldName = - styleManager.suggestVariableName(VariableKind.FIELD, getPureName(variable), null, variable.getType()).names[0]; + String fieldName = uniqueFieldName(JavaCodeStyleManager.getInstance(myProject) + .suggestVariableName(VariableKind.FIELD, getPureName(variable), null, variable.getType()).names); try { myOutputFields[i] = myElementFactory.createField(fieldName, variable.getType()); } diff --git a/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/SameFieldsWithPrefix.java b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/SameFieldsWithPrefix.java new file mode 100644 index 000000000000..77c9d80e712f --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/SameFieldsWithPrefix.java @@ -0,0 +1,10 @@ +public class SameFieldsWithPrefix { + public static void main(String[] args) { + int aValue = 100; + int bValue = 1000; + + IntStream.of(aValue, bValue).peek(x -> {}).sum(); + + System.out.println(aValue + bValue); + } +} diff --git a/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/SameFieldsWithPrefix.java.after b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/SameFieldsWithPrefix.java.after new file mode 100644 index 000000000000..97c635b2db93 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/SameFieldsWithPrefix.java.after @@ -0,0 +1,30 @@ +public class SameFieldsWithPrefix { + public static void main(String[] args) { + Inner inner = new Inner().invoke(); + int aValue = inner.getValue(); + int bValue = inner.getBValue(); + + System.out.println(aValue + bValue); + } + + private static class Inner { + private int myValue; + private int myBValue; + + public int getValue() { + return myValue; + } + + public int getBValue() { + return myBValue; + } + + public Inner invoke() { + myValue = 100; + myBValue = 1000; + + IntStream.of(myValue, myBValue).peek(x -> {}).sum(); + return this; + } + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObjectWithMultipleExitPointsTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObjectWithMultipleExitPointsTest.java index 20f78f6e9b33..b2e56e5f756d 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObjectWithMultipleExitPointsTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObjectWithMultipleExitPointsTest.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. @@ -22,9 +22,10 @@ package com.intellij.refactoring; import com.intellij.JavaTestUtil; import com.intellij.codeInsight.CodeInsightUtil; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiExpression; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.refactoring.extractMethodObject.ExtractMethodObjectHandler; import com.intellij.refactoring.extractMethodObject.ExtractMethodObjectProcessor; import org.jetbrains.annotations.NotNull; @@ -150,4 +151,19 @@ public class ExtractMethodObjectWithMultipleExitPointsTest extends LightRefactor public void testAssignReturnValueToForeachParameter() throws Exception { doTest(); } + + public void testSameFieldsWithPrefix() throws Exception { + final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject()); + String oldPrefix = settings.FIELD_NAME_PREFIX; + settings.FIELD_NAME_PREFIX = "my"; + boolean oldPrefer = settings.PREFER_LONGER_NAMES; + settings.PREFER_LONGER_NAMES = false; + try { + doTest(); + } + finally { + settings.FIELD_NAME_PREFIX = oldPrefix; + settings.PREFER_LONGER_NAMES = oldPrefer; + } + } }