From 832b80f75b237bf09516cb2e8482622af0eb6cc8 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 15 Mar 2024 15:59:47 +0100 Subject: [PATCH] [util] NameUtilCore.uniqName GitOrigin-RevId: 9ff6d21d5e1efc735239d79a80c8993f476d7a5d --- .../com/intellij/psi/NameUtilTest.java | 11 ++++++++ .../com/intellij/util/text/NameUtilCore.java | 27 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/platform/platform-tests/testSrc/com/intellij/psi/NameUtilTest.java b/platform/platform-tests/testSrc/com/intellij/psi/NameUtilTest.java index a408588d01bf..61cfdd90c1b2 100644 --- a/platform/platform-tests/testSrc/com/intellij/psi/NameUtilTest.java +++ b/platform/platform-tests/testSrc/com/intellij/psi/NameUtilTest.java @@ -6,6 +6,7 @@ import com.intellij.util.text.NameUtilCore; import org.junit.Test; import java.util.Arrays; +import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -72,4 +73,14 @@ public class NameUtilTest { final String[] result = NameUtil.splitNameIntoWords(name); assertEquals(Arrays.asList(expected).toString(), Arrays.asList(result).toString()); } + + @Test + public void testUniqName() { + assertEquals("best", NameUtilCore.uniqName("best", Set.of("test", "test1")::contains)); + assertEquals("test1", NameUtilCore.uniqName("test", Set.of("test")::contains)); + assertEquals("test2", NameUtilCore.uniqName("test", Set.of("test", "test1")::contains)); + assertEquals("test3", NameUtilCore.uniqName("test", Set.of("test", "test1", "test2")::contains)); + assertEquals("test3", NameUtilCore.uniqName("test1", Set.of("test", "test1", "test2")::contains)); + assertEquals("test3", NameUtilCore.uniqName("test2", Set.of("test", "test1", "test2")::contains)); + } } diff --git a/platform/util/base/src/com/intellij/util/text/NameUtilCore.java b/platform/util/base/src/com/intellij/util/text/NameUtilCore.java index fc93a6de0d82..b3feccd48ee9 100644 --- a/platform/util/base/src/com/intellij/util/text/NameUtilCore.java +++ b/platform/util/base/src/com/intellij/util/text/NameUtilCore.java @@ -7,6 +7,8 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; +import java.util.regex.Pattern; public final class NameUtilCore { @@ -168,4 +170,29 @@ public final class NameUtilCore { } return ArrayUtilRt.toStringArray(array); } + + /** + * Generates a unique name + * + * @param origName original symbol name + * @param alreadyUsed a predicate that returns true if a supplied name is already used and we cannot use it + * @return the name based on the origName, which is definitely not used (typically by adding a numeric suffix) + */ + public static @NotNull String uniqName(@NotNull String origName, @NotNull Predicate<@NotNull String> alreadyUsed) { + if (!alreadyUsed.test(origName)) return origName; + String baseName = origName; + int index = 0; + Pattern pattern = Pattern.compile("(.+?)(\\d+)"); + java.util.regex.Matcher matcher = pattern.matcher(baseName); + if (matcher.matches()) { + baseName = matcher.group(1); + index = Integer.parseInt(matcher.group(2)); + } + while (true) { + String name = baseName + (++index); + if (!alreadyUsed.test(name)) { + return name; + } + } + } }