IDEA-79591 Suggest field name in construction parameter name completion

This commit is contained in:
peter
2012-03-05 23:11:48 +04:00
parent 693bec4af3
commit 1b19428761
4 changed files with 61 additions and 3 deletions

View File

@@ -137,6 +137,9 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor {
PsiElement parent = PsiTreeUtil.getParentOfType(var, PsiCodeBlock.class);
if(parent == null) parent = PsiTreeUtil.getParentOfType(var, PsiMethod.class);
addLookupItems(set, suggestedNameInfo, matcher, project, getUnresolvedReferences(parent, false));
if (var instanceof PsiParameter && parent instanceof PsiMethod) {
addSuggestionsInspiredByFieldNames(set, matcher, var, project, codeStyleManager);
}
PsiExpression initializer = var.getInitializer();
if (initializer != null) {
@@ -145,11 +148,33 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor {
}
}
private static void addSuggestionsInspiredByFieldNames(Set<LookupElement> set,
PrefixMatcher matcher,
PsiVariable var,
Project project,
JavaCodeStyleManager codeStyleManager) {
PsiClass psiClass = PsiTreeUtil.getParentOfType(var, PsiClass.class);
if (psiClass == null) {
return;
}
for (PsiField field : psiClass.getFields()) {
if (field.getType().isAssignableFrom(var.getType())) {
String prop = codeStyleManager.variableNameToPropertyName(field.getName(), VariableKind.FIELD);
addLookupItems(set, null, matcher, project, codeStyleManager.propertyNameToVariableName(prop, VariableKind.PARAMETER));
}
}
}
private static String[] getOverlappedNameVersions(final String prefix, final String[] suggestedNames, String suffix) {
final List<String> newSuggestions = new ArrayList<String>();
int longestOverlap = 0;
for (String suggestedName : suggestedNames) {
if (suggestedName.length() < 3) {
continue;
}
if (suggestedName.toUpperCase().startsWith(prefix.toUpperCase())) {
newSuggestions.add(suggestedName);
longestOverlap = prefix.length();

View File

@@ -0,0 +1,4 @@
class Car {
private final String color;
Car(String co<caret>x) { }
}

View File

@@ -0,0 +1,5 @@
class Car {
private final String myColor;
private final int myColor2;
Car(String pCo<caret>x) { }
}

View File

@@ -149,7 +149,7 @@ public class VariablesCompletionTest extends LightFixtureCompletionTestCase {
public void testInitializerMatters() throws Exception {
myFixture.configureByText(JavaFileType.INSTANCE, "class Foo {{ String f<caret>x = getFoo(); }; String getFoo() {}; }");
complete();
assertStringItems("foo", "fS");
assertStringItems("foo");
}
public void testFieldInitializerMatters() throws Exception {
@@ -159,13 +159,37 @@ public class VariablesCompletionTest extends LightFixtureCompletionTestCase {
}
public void testNoKeywordsInForLoopVariableName() throws Throwable {
configureByFile(FILE_PREFIX + getTestName(false) + ".java");
configure()
assertStringItems("stringBuffer", "buffer");
}
public void testDuplicateSuggestionsFromUsage() {
configureByFile(FILE_PREFIX + getTestName(false) + ".java");
configure();
assertStringItems("preferencePolicy", "policy");
}
public void configure() {
configureByFile(FILE_PREFIX + getTestName(false) + ".java")
}
public void testConstructorParameterName() {
configure()
assertStringItems("color");
}
public void testConstructorParameterNameWithPrefix() {
CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(project);
String oldField = settings.FIELD_NAME_PREFIX;
String oldParam = settings.PARAMETER_NAME_PREFIX;
settings.FIELD_NAME_PREFIX = "my";
settings.PARAMETER_NAME_PREFIX = "p";
configure()
settings.FIELD_NAME_PREFIX = oldField
settings.PARAMETER_NAME_PREFIX = oldParam
assertStringItems("pColor");
}
}