From 02b0c4c7eb9fe35fa02d0d2eebbf1ee8425b09f8 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 14 Apr 2015 14:33:27 +0300 Subject: [PATCH] Name Suggester: Do not strip "get"/"is"/"set" prefixes if remaining sequence is not upper-cased #KT-7399 Fixed --- .../idea/core/refactoring/JetNameSuggester.java | 15 +++++++++++++-- .../createFunction/call/afterDoNotStripPrefix.kt | 10 ++++++++++ .../createFunction/call/afterStripPrefix.kt | 10 ++++++++++ .../createFunction/call/beforeDoNotStripPrefix.kt | 7 +++++++ .../createFunction/call/beforeStripPrefix.kt | 7 +++++++ .../idea/quickfix/QuickFixTestGenerated.java | 12 ++++++++++++ 6 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 idea/testData/quickfix/createFromUsage/createFunction/call/afterDoNotStripPrefix.kt create mode 100644 idea/testData/quickfix/createFromUsage/createFunction/call/afterStripPrefix.kt create mode 100644 idea/testData/quickfix/createFromUsage/createFunction/call/beforeDoNotStripPrefix.kt create mode 100644 idea/testData/quickfix/createFromUsage/createFunction/call/beforeStripPrefix.kt diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/refactoring/JetNameSuggester.java b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/refactoring/JetNameSuggester.java index d5ca1da89b5..d662f612a77 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/refactoring/JetNameSuggester.java +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/refactoring/JetNameSuggester.java @@ -192,11 +192,22 @@ public class JetNameSuggester { } } + private static final String[] ACCESSOR_PREFIXES = { "get", "is", "set" }; + private static void addCamelNames(ArrayList result, String name, JetNameValidator validator) { if (name == "") return; String s = deleteNonLetterFromString(name); - if (s.startsWith("get") || s.startsWith("set")) s = s.substring(3); - else if (s.startsWith("is")) s = s.substring(2); + + for (String prefix : ACCESSOR_PREFIXES) { + if (!s.startsWith(prefix)) continue; + + int len = prefix.length(); + if (len < s.length() && Character.isUpperCase(s.charAt(len))) { + s = s.substring(len); + break; + } + } + for (int i = 0; i < s.length(); ++i) { if (i == 0) { addName(result, StringUtil.decapitalize(s), validator); diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/afterDoNotStripPrefix.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/afterDoNotStripPrefix.kt new file mode 100644 index 00000000000..e13ee32404f --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/afterDoNotStripPrefix.kt @@ -0,0 +1,10 @@ +// "Create function 'foo'" "true" +class Settings + +fun isModified(settings: Settings, c: C) = c.foo(settings) + +class C { + fun foo(settings: Settings): Any { + throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/afterStripPrefix.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/afterStripPrefix.kt new file mode 100644 index 00000000000..65b35513241 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/afterStripPrefix.kt @@ -0,0 +1,10 @@ +// "Create function 'foo'" "true" +class SetOptions + +fun isModified(setOptions: SetOptions, c: C) = c.foo(setOptions) + +class C { + fun foo(options: SetOptions): Any { + throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/beforeDoNotStripPrefix.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/beforeDoNotStripPrefix.kt new file mode 100644 index 00000000000..982aaa712cd --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/beforeDoNotStripPrefix.kt @@ -0,0 +1,7 @@ +// "Create function 'foo'" "true" +class Settings + +fun isModified(settings: Settings, c: C) = c.foo(settings) + +class C { +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/beforeStripPrefix.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/beforeStripPrefix.kt new file mode 100644 index 00000000000..ab9b92435f0 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/beforeStripPrefix.kt @@ -0,0 +1,7 @@ +// "Create function 'foo'" "true" +class SetOptions + +fun isModified(setOptions: SetOptions, c: C) = c.foo(setOptions) + +class C { +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 8c07cb13b46..58889a46858 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -1586,6 +1586,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("beforeDoNotStripPrefix.kt") + public void testDoNotStripPrefix() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforeDoNotStripPrefix.kt"); + doTest(fileName); + } + @TestMetadata("beforeExtensionFunOnTrait.kt") public void testExtensionFunOnTrait() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforeExtensionFunOnTrait.kt"); @@ -1778,6 +1784,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("beforeStripPrefix.kt") + public void testStripPrefix() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforeStripPrefix.kt"); + doTest(fileName); + } + @TestMetadata("beforeThisInClass.kt") public void testThisInClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforeThisInClass.kt");