From 69ecf399412c0a36deefd0535a6681373b699e1f Mon Sep 17 00:00:00 2001 From: Alexandr Suhinin Date: Tue, 5 May 2020 20:12:19 +0300 Subject: [PATCH] IDEA-236333: fus options of extract method refactoring GitOrigin-RevId: f9d8b0a1e305b34bdcbd627a47c221e790a26e8d --- java/java-impl/src/META-INF/JavaPlugin.xml | 1 + .../extractMethod/ExtractMethodDialog.java | 95 ++++++++++++++++++- 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/META-INF/JavaPlugin.xml b/java/java-impl/src/META-INF/JavaPlugin.xml index b1f0c3685c79..506a3dd00de9 100644 --- a/java/java-impl/src/META-INF/JavaPlugin.xml +++ b/java/java-impl/src/META-INF/JavaPlugin.xml @@ -412,6 +412,7 @@ + diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java index 682e18edcba7..044bbc473d87 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodDialog.java @@ -5,6 +5,8 @@ import com.intellij.codeInsight.Nullability; import com.intellij.codeInsight.NullableNotNullManager; import com.intellij.ide.highlighter.JavaFileType; import com.intellij.ide.util.PropertiesComponent; +import com.intellij.internal.statistic.eventLog.FeatureUsageData; +import com.intellij.internal.statistic.service.fus.collectors.FUCounterUsageLogger; import com.intellij.java.refactoring.JavaRefactoringBundle; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; @@ -15,6 +17,7 @@ import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.Splitter; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.util.PsiFormatUtil; @@ -30,6 +33,7 @@ import com.intellij.ui.NonFocusableCheckBox; import com.intellij.ui.SeparatorFactory; import com.intellij.ui.components.JBLabel; import com.intellij.util.*; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import com.intellij.util.ui.DialogUtil; import com.intellij.util.ui.JBUI; @@ -43,7 +47,10 @@ import javax.swing.border.Border; import java.awt.*; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; +import java.util.HashMap; import java.util.HashSet; +import java.util.List; +import java.util.Map; import java.util.Set; import java.util.function.Supplier; @@ -84,6 +91,9 @@ public class ExtractMethodDialog extends RefactoringDialog implements AbstractEx private VariableData[] myInputVariables; private TypeSelector mySelector; private final Supplier myDuplicatesCountSupplier; + private boolean isReturnVisible = false; + + private Map myInitialParameterInfos; public ExtractMethodDialog(Project project, PsiClass targetClass, InputVariables inputVariables, PsiType returnType, PsiTypeParameterList typeParameterList, PsiType[] exceptions, @@ -116,7 +126,7 @@ public class ExtractMethodDialog extends RefactoringDialog implements AbstractEx } myInputVariables = myVariableData.getInputVariables().toArray(new VariableData[0]); myDuplicatesCountSupplier = duplicatesCountSupplier; - setPreviewResults(duplicatesCountSupplier != null); + setPreviewResults(false); init(); } @@ -228,6 +238,7 @@ public class ExtractMethodDialog extends RefactoringDialog implements AbstractEx } final JPanel returnTypePanel = createReturnTypePanel(); if (returnTypePanel != null) { + isReturnVisible = true; visibilityAndReturnType.add(returnTypePanel, BorderLayout.EAST); } @@ -505,6 +516,7 @@ public class ExtractMethodDialog extends RefactoringDialog implements AbstractEx } protected void createParametersPanel() { + myInitialParameterInfos = getParameterInfos(getChosenParameters()); if (myParamTable != null) { myCenterPanel.remove(myParamTable); } @@ -688,4 +700,85 @@ public class ExtractMethodDialog extends RefactoringDialog implements AbstractEx public PsiType getReturnType() { return mySelector != null ? mySelector.getSelectedType() : myReturnType; } + + @Override + public void show() { + super.show(); + final FeatureUsageData featureUsageData = collectStatistics(); + FUCounterUsageLogger.getInstance().logEvent("java.extract.method","action.performed", featureUsageData); + } + + private static class ParameterInfo { + final int myIndex; + final String myName; + final PsiType myType; + final boolean myIsEnabled; + + private ParameterInfo(int index, VariableData parameter) { + myIndex = index; + myName = parameter.name; + myType = parameter.type; + myIsEnabled = parameter.passAsParameter; + } + } + + private static Map getParameterInfos(VariableData[] parameters){ + final Map map = new HashMap<>(); + for (int index=0; index resultParams = getParameterInfos(getChosenParameters()); + final List> parameterChanges = ContainerUtil.map(getChosenParameters(), (param) -> + new Pair<>(resultParams.get(param.variable), myInitialParameterInfos.get(param.variable)) + ); + if (! resultParams.isEmpty()) { + boolean renamed = ContainerUtil.exists(parameterChanges, (changePair) -> ! changePair.first.myName.equals(changePair.second.myName)); + boolean typeChanged = ContainerUtil.exists(parameterChanges, (changePair) -> ! changePair.first.myType.equals(changePair.second.myType)); + boolean removed = ContainerUtil.exists(parameterChanges, (changePair) -> ! changePair.first.myIsEnabled); + data.addData("parameters_type_changed", typeChanged); + data.addData("parameters_renamed", renamed); + data.addData("parameters_removed", removed); + } + if(resultParams.size() > 1) { + boolean reordered = ContainerUtil.exists(parameterChanges, (changePair) -> changePair.first.myIndex != changePair.second.myIndex); + data.addData("parameters_reordered", reordered); + } + + if (myVisibilityPanel != null) { + data.addData("visibility_changed", !myDefaultVisibility); + } + if (isReturnVisible) { + data.addData("return_changed", getReturnType() != myReturnType); + } + if (myMakeStatic != null && myMakeStatic.isEnabled()) { + String key = myVariableData.isPassFields() ? "static_pass_fields" : "static"; + data.addData(key, myMakeStatic.isSelected()); + } + if (myMakeVarargs != null){ + data.addData("make_varargs", myMakeVarargs.isSelected()); + } + if (myFoldParameters != null && myFoldParameters.isVisible()) { + data.addData("folded", myFoldParameters.isSelected()); + } + if (myCbChainedConstructor != null) { + data.addData("constructor", myCbChainedConstructor.isSelected()); + } + if (myGenerateAnnotations != null) { + data.addData("annotated", myGenerateAnnotations.isSelected()); + } + if (hasPreviewButton()) { + data.addData("preview_used", isPreviewUsages()); + } + data.addData("finished", isOK()); + + return data; + } } \ No newline at end of file