From e18a3f76dc529c7aa141450e67e541d9fb8973c3 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Fri, 17 Mar 2017 20:03:32 +0100 Subject: [PATCH] sort members in toString chooser from super to child (IDEA-93029) --- .../java/generate/GenerateToStringUtils.java | 40 ++++++++++++++++--- .../java/generate/GenerationUtil.java | 2 +- .../java/generate/view/ConfigUI.java | 14 ++++--- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/java/java-analysis-impl/src/org/jetbrains/java/generate/GenerateToStringUtils.java b/java/java-analysis-impl/src/org/jetbrains/java/generate/GenerateToStringUtils.java index dcbf9d18d290..188ad1a334a9 100644 --- a/java/java-analysis-impl/src/org/jetbrains/java/generate/GenerateToStringUtils.java +++ b/java/java-analysis-impl/src/org/jetbrains/java/generate/GenerateToStringUtils.java @@ -24,6 +24,7 @@ import org.jetbrains.java.generate.config.FilterPattern; import org.jetbrains.java.generate.psi.PsiAdapter; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; /** @@ -60,9 +61,27 @@ public class GenerateToStringUtils { FilterPattern pattern) { if (log.isDebugEnabled()) log.debug("Filtering fields using the pattern: " + pattern); List availableFields = new ArrayList<>(); + collectAvailableFields(clazz, includeSuperClass, pattern, availableFields, new HashSet<>()); + return availableFields.toArray(new PsiField[availableFields.size()]); + } + + private static void collectAvailableFields(PsiClass clazz, + boolean includeSuperClass, + FilterPattern pattern, + List availableFields, + HashSet visited) { + + int sortElements = GenerateToStringContext.getConfig().getSortElements(); + + if (includeSuperClass && sortElements == 3) { + PsiClass superClass = clazz.getSuperClass(); + if (superClass != null && visited.add(superClass)) { + collectAvailableFields(superClass, true, pattern, availableFields, visited); + } + } // performs til filtering process - PsiField[] fields = includeSuperClass ? clazz.getAllFields() : clazz.getFields(); + PsiField[] fields = includeSuperClass && sortElements != 3 ? clazz.getAllFields() : clazz.getFields(); for (PsiField field : fields) { if (!JavaResolveUtil.isAccessible(field, field.getContainingClass(), field.getModifierList(), clazz, null, null)) { continue; @@ -72,8 +91,6 @@ public class GenerateToStringUtils { availableFields.add(field); } } - - return availableFields.toArray(new PsiField[availableFields.size()]); } /** @@ -93,7 +110,21 @@ public class GenerateToStringUtils { public static PsiMethod[] filterAvailableMethods(PsiClass clazz, @NotNull FilterPattern pattern) { if (log.isDebugEnabled()) log.debug("Filtering methods using the pattern: " + pattern); List availableMethods = new ArrayList<>(); - PsiMethod[] methods = clazz.getAllMethods(); + collectAvailableMethods(clazz, pattern, availableMethods, new HashSet<>()); + return availableMethods.toArray(new PsiMethod[availableMethods.size()]); + } + + private static void collectAvailableMethods(PsiClass clazz, @NotNull FilterPattern pattern, + List availableMethods, + HashSet visited) { + int sortElements = GenerateToStringContext.getConfig().getSortElements(); + if (sortElements == 3) { + PsiClass superClass = clazz.getSuperClass(); + if (superClass != null && visited.add(superClass)) { + collectAvailableMethods(superClass, pattern, availableMethods, visited); + } + } + PsiMethod[] methods = sortElements != 3 ? clazz.getAllMethods() : clazz.getMethods(); for (PsiMethod method : methods) { // the method should be a getter if (!PsiAdapter.isGetterMethod(method)) { @@ -133,6 +164,5 @@ public class GenerateToStringUtils { log.debug("Adding the method " + methodName + " as there is not a field for this getter"); availableMethods.add(method); } - return availableMethods.toArray(new PsiMethod[availableMethods.size()]); } } diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/GenerationUtil.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/GenerationUtil.java index 4a4b108d26a2..5dc4997088e3 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/GenerationUtil.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/GenerationUtil.java @@ -192,7 +192,7 @@ public class GenerationUtil { logger.debug("Velocity Context - adding members (fields and methods)"); List elements = ElementUtils.getOnlyAsFieldAndMethodElements(selectedMembers, selectedNotNullMembers, useAccessors); // sort elements if enabled and not using chooser dialog - if (sortElements != 0) { + if (sortElements != 0 && sortElements < 3) { Collections.sort(elements, new ElementComparator(sortElements)); } vc.put("members", elements); diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/view/ConfigUI.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/view/ConfigUI.java index 9bd95d8a8b56..9ff3dd010caa 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/view/ConfigUI.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/view/ConfigUI.java @@ -117,6 +117,7 @@ public class ConfigUI extends JPanel { panel.add(innerPanel); sortElementsComboBox.addItem("Ascending"); sortElementsComboBox.addItem("Descending"); + sortElementsComboBox.addItem("Super class members first"); constraint.gridwidth = GridBagConstraints.REMAINDER; constraint.fill = GridBagConstraints.BOTH; constraint.gridx = 0; @@ -246,12 +247,15 @@ public class ConfigUI extends JPanel { enableMethods.setSelected(config.isEnableMethods()); moveCaretToMethod.setSelected(config.isJumpToMethod()); - sortElements.setSelected(config.getSortElements() != 0); + int sort = config.getSortElements(); + sortElements.setSelected(sort != 0); sortElementsComboBox.setEnabled(sortElements.isSelected()); - if (config.getSortElements() == 0 || config.getSortElements() == 1) { + if (sort == 0 || sort == 1) { sortElementsComboBox.setSelectedIndex(0); - } else if (config.getSortElements() == 2) { + } else if (sort == 2) { sortElementsComboBox.setSelectedIndex(1); + } else if (sort == 3) { + sortElementsComboBox.setSelectedIndex(2); } } @@ -298,10 +302,8 @@ public class ConfigUI extends JPanel { if (!sortElements.isSelected()) { config.setSortElements(0); - } else if (sortElementsComboBox.getSelectedIndex() == 0) { - config.setSortElements(1); // selected index of 0 is ascending } else { - config.setSortElements(2); // selected index of 0 is ascending + config.setSortElements(sortElementsComboBox.getSelectedIndex() + 1); } return config;