1ec7b3eec353a0b3b922533af14f8bb903313a25
[idea/community.git] / java / java-impl / src / com / intellij / refactoring / rename / naming / AutomaticUsageRenamer.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.refactoring.rename.naming;
3
4 import com.intellij.openapi.util.NlsContexts;
5 import com.intellij.openapi.util.NlsSafe;
6 import com.intellij.openapi.util.text.StringUtil;
7 import com.intellij.usages.RenameableUsage;
8 import com.intellij.util.IncorrectOperationException;
9 import org.jetbrains.annotations.Nls;
10 import org.jetbrains.annotations.NotNull;
11 import org.jetbrains.annotations.Nullable;
12
13 import java.util.*;
14
15 /**
16  * @author peter
17  */
18 public abstract class AutomaticUsageRenamer<T> {
19   private final String myOldName;
20   private final String myNewName;
21   private final Map<T, String> myRenames = new LinkedHashMap<>();
22   private final List<T> myElements = new ArrayList<>();
23   private final Map<T, List<RenameableUsage>> myReferences = new HashMap<>();
24
25   protected AutomaticUsageRenamer(List<? extends T> renamedElements, String oldName, String newName) {
26     myOldName = oldName;
27     myNewName = newName;
28     List<T> elements = new ArrayList<>(renamedElements);
29     elements.sort((o1, o2) -> {
30       int i = StringUtil.compare(getSourceName(o1), getSourceName(o2), false);
31       if (i != 0) return i;
32       return getName(o1).compareTo(getName(o2));
33     });
34     for (T element : elements) {
35       String suggestedNewName = suggestName(element);
36       if (!getName(element).equals(suggestedNewName)) {
37         myElements.add(element);
38         setRename(element, suggestedNewName);
39       }
40     }
41   }
42
43   public boolean hasAnythingToRename() {
44     for (final String s : myRenames.values()) {
45       if (s != null) return true;
46     }
47     return false;
48   }
49
50   public boolean isEmpty() {
51     return myRenames.isEmpty();
52   }
53
54   protected String getOldName() {
55     return myOldName;
56   }
57
58   public String getNewName() {
59     return myNewName;
60   }
61
62   protected boolean isChecked(T element) {
63     return myRenames.containsKey(element);
64   }
65
66   protected boolean isCheckedInitially(T element) {
67     return false;
68   }
69
70   protected boolean isNameAlreadySuggested(String newName) {
71     return myRenames.containsValue(newName);
72   }
73
74   public List<? extends T> getElements() {
75     return myElements;
76   }
77
78   /**
79    * Element source, path. For example, package. Taken into account while sorting.
80    */
81   @Nullable
82   public String getSourceName(T element) {
83     return null;
84   }
85
86   public String getNewElementName(T element) {
87     return myRenames.get(element);
88   }
89
90   public Map<? extends T,String> getRenames() {
91     return myRenames;
92   }
93
94   public void setRename(T element, @NotNull String replacement) {
95     myRenames.put(element, replacement);
96   }
97
98   public void doNotRename(T element) {
99     myRenames.remove(element);
100   }
101
102   @Nullable
103   public @NlsContexts.Tooltip String getErrorText(T element) {
104     return null;
105   }
106
107   public final void doRename() throws IncorrectOperationException {
108     for (final Map.Entry<T, List<RenameableUsage>> entry : myReferences.entrySet()) {
109       final T element = entry.getKey();
110       final String newName = getNewElementName(element);
111       doRenameElement(element);
112       for (final RenameableUsage usage : entry.getValue()) {
113         usage.rename(newName);
114       }
115     }
116   }
117
118   protected abstract void doRenameElement(T element) throws IncorrectOperationException;
119
120   protected abstract String suggestName(T element);
121
122   protected abstract @NlsSafe String getName(T element);
123
124   public abstract @NlsContexts.DialogTitle String getDialogTitle();
125
126   public abstract @Nls String getDialogDescription();
127
128   public abstract String getEntityName();
129 }
130