1 package com
.intellij
.refactoring
.rename
;
3 import com
.intellij
.codeInsight
.completion
.JavaCompletionUtil
;
4 import com
.intellij
.codeInsight
.lookup
.LookupItem
;
5 import com
.intellij
.codeInsight
.lookup
.LookupItemUtil
;
6 import com
.intellij
.codeInsight
.lookup
.LookupElement
;
7 import com
.intellij
.openapi
.util
.text
.StringUtil
;
8 import com
.intellij
.psi
.*;
9 import com
.intellij
.psi
.util
.PropertyUtil
;
10 import com
.intellij
.psi
.codeStyle
.JavaCodeStyleManager
;
11 import com
.intellij
.psi
.codeStyle
.NameUtil
;
12 import com
.intellij
.psi
.codeStyle
.SuggestedNameInfo
;
13 import com
.intellij
.psi
.codeStyle
.VariableKind
;
14 import com
.intellij
.usageView
.UsageViewUtil
;
15 import com
.intellij
.util
.ArrayUtil
;
16 import com
.intellij
.util
.containers
.ContainerUtil
;
17 import org
.jetbrains
.annotations
.Nullable
;
21 public class JavaNameSuggestionProvider
implements NameSuggestionProvider
{
23 public SuggestedNameInfo
getSuggestedNames(final PsiElement element
, final PsiElement nameSuggestionContext
, List
<String
> result
) {
24 String initialName
= UsageViewUtil
.getShortName(element
);
25 SuggestedNameInfo info
= suggestNamesForElement(element
);
27 String parameterName
= null;
28 String superMethodName
= null;
29 if (nameSuggestionContext
!= null) {
30 final PsiElement nameSuggestionContextParent
= nameSuggestionContext
.getParent();
31 if (nameSuggestionContextParent
!= null) {
32 final PsiElement parentOfParent
= nameSuggestionContextParent
.getParent();
33 if (parentOfParent
instanceof PsiExpressionList
) {
34 final PsiExpressionList expressionList
= (PsiExpressionList
)parentOfParent
;
35 final PsiElement parent
= expressionList
.getParent();
36 if (parent
instanceof PsiCallExpression
) {
37 final PsiMethod method
= ((PsiCallExpression
)parent
).resolveMethod();
39 final PsiParameter
[] parameters
= method
.getParameterList().getParameters();
40 final PsiExpression
[] expressions
= expressionList
.getExpressions();
41 for (int i
= 0; i
< expressions
.length
; i
++) {
42 PsiExpression expression
= expressions
[i
];
43 if (expression
== nameSuggestionContextParent
) {
44 if (i
< parameters
.length
) {
45 parameterName
= parameters
[i
].getName();
53 else if (parentOfParent
instanceof PsiParameterList
) {
54 final PsiElement parent3
= parentOfParent
.getParent();
55 if (parent3
instanceof PsiMethod
) {
56 final String propName
= PropertyUtil
.getPropertyName((PsiMethod
)parent3
);
57 if (propName
!= null) {
58 parameterName
= propName
;
60 if (nameSuggestionContextParent
instanceof PsiParameter
) {
61 superMethodName
= getSuperMethodName((PsiParameter
) nameSuggestionContextParent
, (PsiMethod
) parent3
);
67 final String
[] strings
= info
!= null ? info
.names
: ArrayUtil
.EMPTY_STRING_ARRAY
;
68 ArrayList
<String
> list
= new ArrayList
<String
>(Arrays
.asList(strings
));
69 final String properlyCased
= suggestProperlyCasedName(element
);
70 if (!list
.contains(initialName
)) {
71 list
.add(0, initialName
);
74 int i
= list
.indexOf(initialName
);
76 list
.add(0, initialName
);
78 if (properlyCased
!= null && !properlyCased
.equals(initialName
)) {
79 list
.add(1, properlyCased
);
81 if (parameterName
!= null && !list
.contains(parameterName
)) {
82 list
.add(parameterName
);
84 if (superMethodName
!= null && !list
.contains(superMethodName
)) {
85 list
.add(0, superMethodName
);
87 ContainerUtil
.removeDuplicates(list
);
93 private static String
getSuperMethodName(final PsiParameter psiParameter
, final PsiMethod method
) {
94 final int index
= method
.getParameterList().getParameterIndex(psiParameter
);
95 final PsiMethod
[] superMethods
= method
.findSuperMethods();
96 for (PsiMethod superMethod
: superMethods
) {
97 final PsiParameterList superParameters
= superMethod
.getParameterList();
98 if (index
< superParameters
.getParametersCount()) {
99 return superParameters
.getParameters() [index
].getName();
106 public Collection
<LookupElement
> completeName(final PsiElement element
, final PsiElement nameSuggestionContext
, final String prefix
) {
107 if (element
instanceof PsiVariable
) {
108 PsiVariable var
= (PsiVariable
)element
;
109 VariableKind kind
= JavaCodeStyleManager
.getInstance(element
.getProject()).getVariableKind(var
);
110 Set
<LookupItem
> set
= new LinkedHashSet
<LookupItem
>();
111 JavaCompletionUtil
.completeVariableNameForRefactoring(element
.getProject(), set
, prefix
, var
.getType(), kind
);
113 if (prefix
.length() == 0) {
114 List
<String
> suggestedNames
= new ArrayList
<String
>();
115 getSuggestedNames(element
, nameSuggestionContext
, suggestedNames
);
116 for (String suggestedName
: suggestedNames
) {
117 LookupItemUtil
.addLookupItem(set
, suggestedName
);
126 private static String
suggestProperlyCasedName(PsiElement psiElement
) {
127 if (!(psiElement
instanceof PsiNamedElement
)) return null;
128 String name
= ((PsiNamedElement
)psiElement
).getName();
129 if (name
== null) return null;
130 if (psiElement
instanceof PsiVariable
) {
131 final JavaCodeStyleManager codeStyleManager
= JavaCodeStyleManager
.getInstance(psiElement
.getProject());
132 final VariableKind kind
= codeStyleManager
.getVariableKind((PsiVariable
)psiElement
);
133 final String prefix
= codeStyleManager
.getPrefixByVariableKind(kind
);
134 if (name
.startsWith(prefix
)) {
135 name
= name
.substring(prefix
.length());
137 final String
[] words
= NameUtil
.splitNameIntoWords(name
);
138 if (kind
== VariableKind
.STATIC_FINAL_FIELD
) {
139 StringBuilder buffer
= new StringBuilder();
140 for (int i
= 0; i
< words
.length
; i
++) {
141 String word
= words
[i
];
142 if (i
> 0) buffer
.append('_');
143 buffer
.append(word
.toUpperCase());
145 return buffer
.toString();
148 StringBuilder buffer
= new StringBuilder(prefix
);
149 for (int i
= 0; i
< words
.length
; i
++) {
150 String word
= words
[i
];
151 final boolean prefixRequiresCapitalization
= prefix
.length() > 0 && !StringUtil
.endsWithChar(prefix
, '_');
152 if (i
> 0 || prefixRequiresCapitalization
) {
153 buffer
.append(StringUtil
.capitalize(word
));
156 buffer
.append(StringUtil
.decapitalize(word
));
159 return buffer
.toString();
167 private static SuggestedNameInfo
suggestNamesForElement(final PsiElement element
) {
168 PsiVariable var
= null;
169 if (element
instanceof PsiVariable
) {
170 var
= (PsiVariable
)element
;
172 else if (element
instanceof PsiIdentifier
) {
173 PsiIdentifier identifier
= (PsiIdentifier
)element
;
174 if (identifier
.getParent() instanceof PsiVariable
) {
175 var
= (PsiVariable
)identifier
.getParent();
179 if (var
== null) return null;
181 JavaCodeStyleManager codeStyleManager
= JavaCodeStyleManager
.getInstance(element
.getProject());
182 VariableKind variableKind
= codeStyleManager
.getVariableKind(var
);
183 return codeStyleManager
.suggestVariableName(variableKind
, null, var
.getInitializer(), var
.getType());