From e27e34dd13e0db9ab944a44c56c59c5d958fa1a1 Mon Sep 17 00:00:00 2001 From: Emanuel Graf Date: Wed, 5 Jan 2011 10:20:42 +0000 Subject: [PATCH] bug 330693: Improve suggested variable name in Extract Local Variable https://bugs.eclipse.org/bugs/show_bug.cgi?id=330693 Improved handling of long names --- .../refactoring/ExtractLocalVariable.rts | 50 +++++++++++++++++ .../ExtractLocalVariableRefactoring.java | 53 ++++++++++++++----- 2 files changed, 91 insertions(+), 12 deletions(-) diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ExtractLocalVariable.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ExtractLocalVariable.rts index e90a4012b24..f07d775a8d4 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ExtractLocalVariable.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ExtractLocalVariable.rts @@ -546,3 +546,53 @@ int main() { return 0; } +//!Bug 330693 Improve suggested variable name in Extract Local Variable +//#org.eclipse.cdt.ui.tests.refactoring.extractlocalvariable.ExtractLocalVariableRefactoringTest +//@A.cpp + +struct Foo{ + int getVarWithLongName(); +}; + +void bar(){ + Foo f; + /*$*/f.getVarWithLongName()/*$$*/; +} + +//= + +struct Foo{ + int getVarWithLongName(); +}; + +void bar(){ + Foo f; + int varWithLongName = f.getVarWithLongName(); + varWithLongName; +} + +//!Bug 330693 Improve suggested variable name in Extract Local Variable: name == prefix +//#org.eclipse.cdt.ui.tests.refactoring.extractlocalvariable.ExtractLocalVariableRefactoringTest +//@A.cpp + +struct Foo{ + int get(); +}; + +void bar(){ + Foo f; + /*$*/f.get()/*$$*/; +} + +//= + +struct Foo{ + int get(); +}; + +void bar(){ + Foo f; + int get = f.get(); + get; +} + diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoring.java index 8655223c408..b04e1bdfc05 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractlocalvariable/ExtractLocalVariableRefactoring.java @@ -320,21 +320,15 @@ public class ExtractLocalVariableRefactoring extends CRefactoring { if (proposals.length == 0) { return info.getName(); } else { - String name = getLastCamelCasePart(proposals[proposals.length - 1]); + String name = proposals[proposals.length - 1]; return name; } } - private String getLastCamelCasePart(String string) { - if (string.length() == 0) { - return string; - } - int index = string.length() - 1; - while (index > 0 - && (Character.isLowerCase(string.charAt(index)) || Character.isDigit(string.charAt(index)))) { - --index; - } - return string.substring(index).toLowerCase(); + private String[] getPrefixes() { + // In Future we could use user preferences to define the prefixes + String[] prefixes = { "get", "is" }; //$NON-NLS-1$//$NON-NLS-2$ + return prefixes; } /** @@ -408,7 +402,7 @@ public class ExtractLocalVariableRefactoring extends CRefactoring { tmpName[len++] = c; } } - name = getLastCamelCasePart(new String(tmpName, 0, len)); + name = trimPrefixes(new String(tmpName, 0, len)); if (name.length() > 0) { if (nameAvailable(name, guessedTempNames, scope)) { guessedTempNames.add(name); @@ -417,6 +411,7 @@ public class ExtractLocalVariableRefactoring extends CRefactoring { } } } + }); } if (guessedTempNames.isEmpty()) { @@ -428,6 +423,40 @@ public class ExtractLocalVariableRefactoring extends CRefactoring { return guessedTempNames.toArray(new String[0]); } + private String trimPrefixes(String name) { + String lower = name.toLowerCase(); + int start = 0; + for (String prefix : getPrefixes()) { + if(lower.startsWith(prefix)) { + if (name.length() > prefix.length()) { + start = prefix.length(); + } + } + prefix = prefix + "_"; //$NON-NLS-1$ + if(lower.startsWith(prefix)) { + if (name.length() > prefix.length()) { + start = prefix.length(); + } + } + } + + if (start > 0) { + + String nameWithoutPrefix = name.substring(start); + if (Character.isUpperCase(nameWithoutPrefix.charAt(0))) { + nameWithoutPrefix = nameWithoutPrefix.substring(0, 1).toLowerCase() + + nameWithoutPrefix.substring(1); + } + + if (!Character.isJavaIdentifierStart(nameWithoutPrefix.charAt(0))) { + nameWithoutPrefix = "_" + nameWithoutPrefix; //$NON-NLS-1$ + } + return nameWithoutPrefix; + } else { + return name; + } + } + private boolean nameAvailable(String name, List guessedNames, IScope scope) { if (guessedNames.contains(name) || info.getUsedNames().contains(name)) { return false;