diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/NamingConventionMacrosTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/template/NamingConventionMacrosTest.groovy index 70402b3a9e68..06690ba2d1d9 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/template/NamingConventionMacrosTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/NamingConventionMacrosTest.groovy @@ -39,17 +39,28 @@ class NamingConventionMacrosTest extends TestCase { assert "_foo_bar_" == snakeCase("-FOO-BAR-") assert "a_b_c_d_e_f_g" == snakeCase("a-b.c/d|e*f+g") assert "a_b" == snakeCase("a--b") + assert "foo_bar" == snakeCase("FOO BAR") } public void "test lowercase and dash"() { assert "foo-bar" == new SplitWordsMacro.LowercaseAndDash().convertString("FOO_BAR") } - public void "test dashes to camel case"() { - assert "fooBar" == new ConvertToCamelCaseMacro.ReplaceDashesToCamelCaseMacro().convertString("foo-bar")?.toString() - assert "fooBar" == new ConvertToCamelCaseMacro.ReplaceDashesToCamelCaseMacro().convertString("FOO-BAR")?.toString() + public void "test to camel case"() { + assert "fooBar" == new ConvertToCamelCaseMacro().convertString("foo-bar")?.toString() + assert "fooBar" == new ConvertToCamelCaseMacro().convertString("FOO-BAR")?.toString() + assert "fooBar" == new ConvertToCamelCaseMacro().convertString("foo bar")?.toString() } - + + public void "test space separated"() { + assert "foo Bar" == new SplitWordsMacro.SpaceSeparated().convertString("fooBar") + assert "foo bar" == new SplitWordsMacro.SpaceSeparated().convertString("foo-bar") + } + + public void "test underscoresToCamelCase"() { + assert "fooBar-goo" == new ConvertToCamelCaseMacro.ReplaceUnderscoresToCamelCaseMacro().convertString("foo_bar-goo")?.toString() + } + private static def snakeCase(String s) { return new SplitWordsMacro.SnakeCaseMacro().convertString(s) } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/ConvertToCamelCaseMacro.java b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/ConvertToCamelCaseMacro.java index fac2fd712b8d..3f49b9177c2e 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/ConvertToCamelCaseMacro.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/ConvertToCamelCaseMacro.java @@ -22,21 +22,21 @@ import com.intellij.codeInsight.template.ExpressionContext; import com.intellij.codeInsight.template.Result; import com.intellij.codeInsight.template.TextResult; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.codeStyle.NameUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; - /** * @author Konstantin Bulenkov */ -public abstract class ConvertToCamelCaseMacro extends MacroBase { +public class ConvertToCamelCaseMacro extends MacroBase { - private final String mySeparator; + public ConvertToCamelCaseMacro() { + super("camelCase", "camelCase(String)"); + } - private ConvertToCamelCaseMacro(String name, String description, String separator) { + private ConvertToCamelCaseMacro(String name, String description) { super(name, description); - mySeparator = separator; } @Nullable @@ -53,26 +53,35 @@ public abstract class ConvertToCamelCaseMacro extends MacroBase { @Nullable @VisibleForTesting public Result convertString(String text) { - final List strings = StringUtil.split(text, mySeparator); - if (strings.size() > 0) { + final String[] strings = splitWords(text); + if (strings.length > 0) { final StringBuilder buf = new StringBuilder(); - buf.append(strings.get(0).toLowerCase()); - for (int i = 1; i < strings.size(); i++) { - buf.append(StringUtil.capitalize(strings.get(i).toLowerCase())); + buf.append(strings[0].toLowerCase()); + for (int i = 1; i < strings.length; i++) { + String string = strings[i]; + if (Character.isLetterOrDigit(string.charAt(0))) { + buf.append(StringUtil.capitalize(string.toLowerCase())); + } } return new TextResult(buf.toString()); } return null; } + @NotNull + protected String[] splitWords(String text) { + return NameUtil.nameToWords(text); + } + public static class ReplaceUnderscoresToCamelCaseMacro extends ConvertToCamelCaseMacro { public ReplaceUnderscoresToCamelCaseMacro() { - super("underscoresToCamelCase", CodeInsightBundle.message("macro.undescoresToCamelCase.string"), "_"); + super("underscoresToCamelCase", CodeInsightBundle.message("macro.undescoresToCamelCase.string")); } - } - public static class ReplaceDashesToCamelCaseMacro extends ConvertToCamelCaseMacro { - public ReplaceDashesToCamelCaseMacro() { - super("dashesToCamelCase", "dashesToCamelCase(String)", "-"); + + @NotNull + @Override + protected String[] splitWords(String text) { + return text.split("_"); } } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/SplitWordsMacro.java b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/SplitWordsMacro.java index 4552e385cd0f..fa4846438567 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/SplitWordsMacro.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/SplitWordsMacro.java @@ -105,4 +105,17 @@ public abstract class SplitWordsMacro extends MacroBase { return word.toLowerCase(); } } + + public static class SpaceSeparated extends SplitWordsMacro { + public SpaceSeparated() { + super("spaceSeparated", "spaceSeparated(String)", ' '); + } + + @NotNull + @Override + protected String convertCase(@NotNull String word) { + //noinspection StringToUpperCaseOrToLowerCaseWithoutLocale + return word; + } + } } diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index 24339bdc936a..b8e0729da2b4 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -471,10 +471,11 @@ - + +