From 9f084375d1c4b9c63d87d5fedf71afa3d241e72f Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 1 Feb 2016 12:53:28 +0100 Subject: [PATCH] add live template macros: dashesToCamelCase (IDEA-135255) and lowercaseAndDash (IDEA-147176) --- .../template/LiveTemplateTest.groovy | 2 +- ...oovy => NamingConventionMacrosTest.groovy} | 19 ++++-- ...acro.java => ConvertToCamelCaseMacro.java} | 49 +++++++++++---- .../template/macro/SnakeCaseMacro.java | 30 --------- ...erscoreMacro.java => SplitWordsMacro.java} | 61 +++++++++++++++---- .../src/META-INF/LangExtensions.xml | 8 ++- 6 files changed, 104 insertions(+), 65 deletions(-) rename java/java-tests/testSrc/com/intellij/codeInsight/template/{CapitalizeAndUnderscoreTest.groovy => NamingConventionMacrosTest.groovy} (64%) rename platform/lang-impl/src/com/intellij/codeInsight/template/macro/{ReplaceUnderscoresToCamelCaseMacro.java => ConvertToCamelCaseMacro.java} (50%) delete mode 100644 platform/lang-impl/src/com/intellij/codeInsight/template/macro/SnakeCaseMacro.java rename platform/lang-impl/src/com/intellij/codeInsight/template/macro/{CapitalizeAndUnderscoreMacro.java => SplitWordsMacro.java} (55%) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy index 1535bfc03062..f62a48498791 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy @@ -788,7 +788,7 @@ class Foo { final Template template = manager.createTemplate("result", "user", '$A$ $B$ c'); template.addVariable('A', new EmptyNode(), true) - def macroCallNode = new MacroCallNode(new SnakeCaseMacro()) + def macroCallNode = new MacroCallNode(new SplitWordsMacro.SnakeCaseMacro()) macroCallNode.addParameter(new VariableNode('A', null)) template.addVariable('B', macroCallNode, false) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/CapitalizeAndUnderscoreTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/template/NamingConventionMacrosTest.groovy similarity index 64% rename from java/java-tests/testSrc/com/intellij/codeInsight/template/CapitalizeAndUnderscoreTest.groovy rename to java/java-tests/testSrc/com/intellij/codeInsight/template/NamingConventionMacrosTest.groovy index 2d8d95792ad7..70402b3a9e68 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/template/CapitalizeAndUnderscoreTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/NamingConventionMacrosTest.groovy @@ -15,14 +15,14 @@ */ package com.intellij.codeInsight.template -import com.intellij.codeInsight.template.macro.CapitalizeAndUnderscoreMacro -import com.intellij.codeInsight.template.macro.SnakeCaseMacro +import com.intellij.codeInsight.template.macro.ConvertToCamelCaseMacro +import com.intellij.codeInsight.template.macro.SplitWordsMacro import junit.framework.TestCase /** * @author peter */ -class CapitalizeAndUnderscoreTest extends TestCase { +class NamingConventionMacrosTest extends TestCase { public void "test capitalize and underscore"() { assert "FOO_BAR" == cau("fooBar") @@ -40,12 +40,21 @@ class CapitalizeAndUnderscoreTest extends TestCase { assert "a_b_c_d_e_f_g" == snakeCase("a-b.c/d|e*f+g") assert "a_b" == snakeCase("a--b") } + + 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() + } private static def snakeCase(String s) { - return new SnakeCaseMacro().convertString(s) + return new SplitWordsMacro.SnakeCaseMacro().convertString(s) } private static def cau(String s) { - return new CapitalizeAndUnderscoreMacro().convertString(s) + return new SplitWordsMacro.CapitalizeAndUnderscoreMacro().convertString(s) } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/ReplaceUnderscoresToCamelCaseMacro.java b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/ConvertToCamelCaseMacro.java similarity index 50% rename from platform/lang-impl/src/com/intellij/codeInsight/template/macro/ReplaceUnderscoresToCamelCaseMacro.java rename to platform/lang-impl/src/com/intellij/codeInsight/template/macro/ConvertToCamelCaseMacro.java index 89708d8e2b01..fac2fd712b8d 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/ReplaceUnderscoresToCamelCaseMacro.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/ConvertToCamelCaseMacro.java @@ -15,6 +15,7 @@ */ package com.intellij.codeInsight.template.macro; +import com.google.common.annotations.VisibleForTesting; import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.codeInsight.template.Expression; import com.intellij.codeInsight.template.ExpressionContext; @@ -29,9 +30,13 @@ import java.util.List; /** * @author Konstantin Bulenkov */ -public class ReplaceUnderscoresToCamelCaseMacro extends MacroBase { - public ReplaceUnderscoresToCamelCaseMacro() { - super("underscoresToCamelCase", CodeInsightBundle.message("macro.undescoresToCamelCase.string")); +public abstract class ConvertToCamelCaseMacro extends MacroBase { + + private final String mySeparator; + + private ConvertToCamelCaseMacro(String name, String description, String separator) { + super(name, description); + mySeparator = separator; } @Nullable @@ -39,17 +44,35 @@ public class ReplaceUnderscoresToCamelCaseMacro extends MacroBase { protected Result calculateResult(@NotNull Expression[] params, ExpressionContext context, boolean quick) { final String text = getTextResult(params, context, true); if (text != null) { - - final List strings = StringUtil.split(text, "_"); - if (strings.size() > 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())); - } - return new TextResult(buf.toString()); - } + return convertString(text); } return null; } + + @SuppressWarnings("StringToUpperCaseOrToLowerCaseWithoutLocale") + @Nullable + @VisibleForTesting + public Result convertString(String text) { + final List strings = StringUtil.split(text, mySeparator); + if (strings.size() > 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())); + } + return new TextResult(buf.toString()); + } + return null; + } + + public static class ReplaceUnderscoresToCamelCaseMacro extends ConvertToCamelCaseMacro { + public ReplaceUnderscoresToCamelCaseMacro() { + super("underscoresToCamelCase", CodeInsightBundle.message("macro.undescoresToCamelCase.string"), "_"); + } + } + public static class ReplaceDashesToCamelCaseMacro extends ConvertToCamelCaseMacro { + public ReplaceDashesToCamelCaseMacro() { + super("dashesToCamelCase", "dashesToCamelCase(String)", "-"); + } + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/SnakeCaseMacro.java b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/SnakeCaseMacro.java deleted file mode 100644 index 9e5d8ac25106..000000000000 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/SnakeCaseMacro.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2000-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.codeInsight.template.macro; - -/** - * @author yole - */ -public class SnakeCaseMacro extends CapitalizeAndUnderscoreMacro { - public SnakeCaseMacro() { - super("snakeCase", "snakeCase(String)"); - } - - @Override - protected String convertCase(String word) { - return word.toLowerCase(); - } -} diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/CapitalizeAndUnderscoreMacro.java b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/SplitWordsMacro.java similarity index 55% rename from platform/lang-impl/src/com/intellij/codeInsight/template/macro/CapitalizeAndUnderscoreMacro.java rename to platform/lang-impl/src/com/intellij/codeInsight/template/macro/SplitWordsMacro.java index 29fb920ce837..4552e385cd0f 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/CapitalizeAndUnderscoreMacro.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/SplitWordsMacro.java @@ -28,13 +28,12 @@ import org.jetbrains.annotations.NotNull; /** * @author Konstantin Bulenkov */ -public class CapitalizeAndUnderscoreMacro extends MacroBase { - public CapitalizeAndUnderscoreMacro() { - super("capitalizeAndUnderscore", CodeInsightBundle.message("macro.capitalizeAndUnderscore.string")); - } +public abstract class SplitWordsMacro extends MacroBase { + private final char mySeparator; - protected CapitalizeAndUnderscoreMacro(String name, String description) { + private SplitWordsMacro(String name, String description, char separator) { super(name, description); + mySeparator = separator; } @Override @@ -49,25 +48,61 @@ public class CapitalizeAndUnderscoreMacro extends MacroBase { @VisibleForTesting public String convertString(String text) { final String[] words = NameUtil.nameToWords(text); - boolean insertUnderscore = false; + boolean insertSeparator = false; final StringBuilder buf = new StringBuilder(); for (String word : words) { if (!Character.isLetterOrDigit(word.charAt(0))) { - buf.append("_"); - insertUnderscore = false; + buf.append(mySeparator); + insertSeparator = false; continue; } - if (insertUnderscore) { - buf.append("_"); + if (insertSeparator) { + buf.append(mySeparator); } else { - insertUnderscore = true; + insertSeparator = true; } buf.append(convertCase(word)); } return buf.toString(); } - protected String convertCase(String word) { - return StringUtil.toUpperCase(word); + @NotNull protected abstract String convertCase(@NotNull String word); + + public static class CapitalizeAndUnderscoreMacro extends SplitWordsMacro { + + public CapitalizeAndUnderscoreMacro() { + super("capitalizeAndUnderscore", CodeInsightBundle.message("macro.capitalizeAndUnderscore.string"), '_'); + } + + @NotNull + protected String convertCase(@NotNull String word) { + return StringUtil.toUpperCase(word); + } + } + + public static class SnakeCaseMacro extends SplitWordsMacro { + public SnakeCaseMacro() { + super("snakeCase", "snakeCase(String)", '_'); + } + + @NotNull + @Override + protected String convertCase(@NotNull String word) { + //noinspection StringToUpperCaseOrToLowerCaseWithoutLocale + return word.toLowerCase(); + } + } + + public static class LowercaseAndDash extends SplitWordsMacro { + public LowercaseAndDash() { + super("lowercaseAndDash", "lowercaseAndDash(String)", '-'); + } + + @NotNull + @Override + protected String convertCase(@NotNull String word) { + //noinspection StringToUpperCaseOrToLowerCaseWithoutLocale + return word.toLowerCase(); + } } } diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index ebb16ebb6e4c..24339bdc936a 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -470,9 +470,11 @@ - - - + + + + +