diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/IdentifierHelperTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/IdentifierHelperTest.java index 33e7bec0993..3941bfdbbbd 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/IdentifierHelperTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/IdentifierHelperTest.java @@ -31,6 +31,7 @@ public class IdentifierHelperTest extends TestSuite { suite.addTest(new EmptyCaseTest()); suite.addTest(new IllegalCharCaseTest()); suite.addTest(new KeywordCaseTest()); + suite.addTestSuite(NameHelperTest.class); return suite; } } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/NameHelperTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/NameHelperTest.java new file mode 100644 index 00000000000..76b74ee4b69 --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/utils/NameHelperTest.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2010 Marc-Andre Laperle and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Marc-Andre Laperle - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.tests.refactoring.utils; + +import junit.framework.TestCase; + +import org.eclipse.cdt.internal.ui.refactoring.utils.NameHelper; + +public class NameHelperTest extends TestCase { + + public void testTrimFieldName() { + assertEquals("f", NameHelper.trimFieldName("f_")); + assertEquals("F", NameHelper.trimFieldName("F_")); + assertEquals("oo", NameHelper.trimFieldName("F_oo")); + assertEquals("o", NameHelper.trimFieldName("f_o")); + + assertEquals("M", NameHelper.trimFieldName("a_M_")); + assertEquals("bs", NameHelper.trimFieldName("a_bs_")); + assertEquals("foo_bar", NameHelper.trimFieldName("foo_bar")); + assertEquals("foo_bar", NameHelper.trimFieldName("foo_bar_")); + + assertEquals("foo_b", NameHelper.trimFieldName("foo_b_")); + + assertEquals("foo", NameHelper.trimFieldName("foo")); + assertEquals("foo", NameHelper.trimFieldName("_foo")); + assertEquals("bar", NameHelper.trimFieldName("_f_bar")); + + assertEquals("f", NameHelper.trimFieldName("f__")); + assertEquals("f", NameHelper.trimFieldName("__f")); + assertEquals("O__b", NameHelper.trimFieldName("fO__b")); + assertEquals("Oo", NameHelper.trimFieldName("fOo")); + assertEquals("O", NameHelper.trimFieldName("fO")); + + assertEquals("8", NameHelper.trimFieldName("_8")); + + assertEquals("8bar", NameHelper.trimFieldName("_8bar_")); + assertEquals("8bar_8", NameHelper.trimFieldName("_8bar_8")); + assertEquals("8bAr", NameHelper.trimFieldName("_8bAr")); + assertEquals("b8Ar", NameHelper.trimFieldName("_b8Ar")); + } + +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/NameHelper.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/NameHelper.java index 6a4610870fb..96232697b23 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/NameHelper.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/NameHelper.java @@ -81,24 +81,44 @@ public class NameHelper { return qname; } + /** + * Returns the trimmed field name. Leading and trailing non-letters-digits are trimmed. + * If the first letter-digit is in lower case and the next is in upper case, + * the first letter is trimmed. + * + * @param fieldName Complete, unmodified name of the field to trim + * @return Trimmed field + */ public static String trimFieldName(String fieldName){ char[] letters = fieldName.toCharArray(); int start = 0; int end = letters.length - 1; try{ - while(!Character.isLetter(letters[start]) && start < end) { + + // Trim, non-letters at the beginning + while(!Character.isLetterOrDigit(letters[start]) && start < end) { ++start; } - if(Character.isLowerCase(letters[start])){ - if(!Character.isLetter(letters[start + 1])){ - start+= 2; - } - else if (Character.isUpperCase(letters[start + 1])){ - start += 1; + // If the next character is not a letter or digit, + // look ahead because the first letter might not be needed + if (start + 1 <= end + && !Character.isLetterOrDigit(letters[start + 1])) { + int lookAhead = 1; + while (start + lookAhead <= end) { + // Only change the start if something is found after the non-letters + if (Character.isLetterOrDigit(letters[start + lookAhead])) { + start += lookAhead; + break; + } + lookAhead++; } + } else if (start + 1 <= end + && Character.isUpperCase(letters[start + 1])) { + start++; } + // Trim, non-letters at the end while((!Character.isLetter(letters[end]) && !Character.isDigit(letters[end])) && start < end) { --end; }