From d978d97e48cff2603327ab46d6edec6d6dc40ed5 Mon Sep 17 00:00:00 2001 From: Up <10714589+UpcraftLP@users.noreply.github.com> Date: Tue, 7 Oct 2025 14:54:10 +0200 Subject: [PATCH] Properly and consistently lowercase strings (#2688) --- .../minecraft/server/packs/PackType.java.patch | 2 +- settings.gradle | 2 +- .../neoforge/client/gui/ModListScreen.java | 17 +++++++++-------- .../neoforge/common/util/VanillaClassToKey.java | 12 ++++++------ .../neoforge/server/command/ConfigCommand.java | 4 ++-- .../testframework/impl/test/AbstractTest.java | 8 ++++---- .../neoforge/oldtest/block/CustomHeadTest.java | 5 +++-- 7 files changed, 26 insertions(+), 24 deletions(-) diff --git a/patches/net/minecraft/server/packs/PackType.java.patch b/patches/net/minecraft/server/packs/PackType.java.patch index b46adf4739..b0f607bd81 100644 --- a/patches/net/minecraft/server/packs/PackType.java.patch +++ b/patches/net/minecraft/server/packs/PackType.java.patch @@ -7,6 +7,6 @@ + + @Override + public String getSerializedName() { -+ return name().toLowerCase(); ++ return name().toLowerCase(java.util.Locale.ROOT); + } } diff --git a/settings.gradle b/settings.gradle index 5ab35aea11..d383d0f14a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -25,7 +25,7 @@ dependencyResolutionManagement { } } -if (rootProject.name.toLowerCase() == "neoforge") { +if (rootProject.name.toLowerCase(Locale.ROOT) == "neoforge") { // Solve name clashes between projects/neoforge and the rootProject for Eclipse. rootProject.name = "NeoForge-Root" } diff --git a/src/client/java/net/neoforged/neoforge/client/gui/ModListScreen.java b/src/client/java/net/neoforged/neoforge/client/gui/ModListScreen.java index 3350018668..adf269c6e3 100644 --- a/src/client/java/net/neoforged/neoforge/client/gui/ModListScreen.java +++ b/src/client/java/net/neoforged/neoforge/client/gui/ModListScreen.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.Map.Entry; import java.util.Optional; import java.util.function.Consumer; @@ -41,13 +42,13 @@ import net.minecraft.server.packs.repository.Pack; import net.minecraft.server.packs.repository.PackSource; import net.minecraft.server.packs.resources.IoSupplier; import net.minecraft.util.FormattedCharSequence; +import net.minecraft.util.StringUtil; import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; import net.neoforged.fml.VersionChecker; import net.neoforged.fml.i18n.FMLTranslations; import net.neoforged.fml.i18n.MavenVersionTranslator; import net.neoforged.fml.loading.FMLPaths; -import net.neoforged.fml.loading.StringUtils; import net.neoforged.neoforge.client.gui.widget.ModListWidget; import net.neoforged.neoforge.client.gui.widget.ScrollPanel; import net.neoforged.neoforge.common.CommonHooks; @@ -62,7 +63,7 @@ import org.jetbrains.annotations.Nullable; public class ModListScreen extends Screen { private static String stripControlCodes(String value) { - return net.minecraft.util.StringUtil.stripColor(value); + return StringUtil.stripColor(value); } private static final Logger LOGGER = LogManager.getLogger(); @@ -90,13 +91,13 @@ public class ModListScreen extends Screen { @Override public int compare(ModContainer o1, ModContainer o2) { - String name1 = StringUtils.toLowerCase(stripControlCodes(o1.getModInfo().getDisplayName())); - String name2 = StringUtils.toLowerCase(stripControlCodes(o2.getModInfo().getDisplayName())); + String name1 = stripControlCodes(o1.getModInfo().getDisplayName()).toLowerCase(Locale.ROOT); + String name2 = stripControlCodes(o2.getModInfo().getDisplayName()).toLowerCase(Locale.ROOT); return compare(name1, name2); } Component getButtonText() { - return Component.translatable("fml.menu.mods." + StringUtils.toLowerCase(name())); + return Component.translatable("fml.menu.mods." + name().toLowerCase(Locale.ROOT)); } } @@ -124,8 +125,8 @@ public class ModListScreen extends Screen { public ModListScreen(Screen parentScreen) { super(Component.translatable("fml.menu.mods.title")); this.parentScreen = parentScreen; - this.mods = Collections.unmodifiableList(ModList.get().getSortedMods()); - this.unsortedMods = Collections.unmodifiableList(this.mods); + this.unsortedMods = Collections.unmodifiableList(ModList.get().getSortedMods()); + this.mods = this.unsortedMods; } class InfoPanel extends ScrollPanel { @@ -327,7 +328,7 @@ public class ModListScreen extends Screen { } private void reloadMods() { - this.mods = this.unsortedMods.stream().filter(mi -> StringUtils.toLowerCase(stripControlCodes(mi.getModInfo().getDisplayName())).contains(StringUtils.toLowerCase(search.getValue()))).collect(Collectors.toList()); + this.mods = this.unsortedMods.stream().filter(mi -> stripControlCodes(mi.getModInfo().getDisplayName()).toLowerCase(Locale.ROOT).contains(search.getValue().toLowerCase(Locale.ROOT))).toList(); lastFilterText = search.getValue(); } diff --git a/src/main/java/net/neoforged/neoforge/common/util/VanillaClassToKey.java b/src/main/java/net/neoforged/neoforge/common/util/VanillaClassToKey.java index 1308b830f7..e07fc776d9 100644 --- a/src/main/java/net/neoforged/neoforge/common/util/VanillaClassToKey.java +++ b/src/main/java/net/neoforged/neoforge/common/util/VanillaClassToKey.java @@ -25,14 +25,14 @@ public class VanillaClassToKey { Preconditions.checkArgument(!cls.getSimpleName().isEmpty(), "Automatic name conversion can only happen for identifiable classes (per Class#getSimpleName()). Provided: " + cls.getName()); StringBuilder sb = new StringBuilder(); - cls.getSimpleName().chars().mapMulti((value, consumer) -> { - if (Character.isUpperCase((char) value)) { - consumer.accept('_'); - consumer.accept(Character.toLowerCase((char) value)); + cls.getSimpleName().codePoints().forEachOrdered(value -> { + if (Character.isUpperCase(value)) { + sb.append('_'); + sb.append(Character.toString(Character.toLowerCase(value))); } else { - consumer.accept(value); + sb.append(Character.toString(value)); } - }).forEach(i -> sb.append((char) i)); + }); return ResourceLocation.withDefaultNamespace(sb.substring(1)); // The string will be prefixed with an additional `_` since the first character is uppercase. } diff --git a/src/main/java/net/neoforged/neoforge/server/command/ConfigCommand.java b/src/main/java/net/neoforged/neoforge/server/command/ConfigCommand.java index 2d0e286822..e974a3e429 100644 --- a/src/main/java/net/neoforged/neoforge/server/command/ConfigCommand.java +++ b/src/main/java/net/neoforged/neoforge/server/command/ConfigCommand.java @@ -9,6 +9,7 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import java.io.File; +import java.util.Locale; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; @@ -19,7 +20,6 @@ import net.minecraft.server.level.ServerPlayer; import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.config.ModConfigs; import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.fml.loading.StringUtils; public class ConfigCommand { public static void register(CommandDispatcher dispatcher) { @@ -32,7 +32,7 @@ public class ConfigCommand { SERVER; public String extension() { - return StringUtils.toLowerCase(name()); + return name().toLowerCase(Locale.ROOT); } } diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java b/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java index eb5cf0c229..a2354a69d7 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java @@ -291,16 +291,16 @@ public abstract class AbstractTest implements Test { final StringBuilder modId = new StringBuilder() .append(framework().id().getNamespace()).append('_'); boolean isInUpper = false; - for (char c : id().toCharArray()) { - if (Character.isUpperCase(c)) { + for (int value : id().codePoints().toArray()) { + if (Character.isUpperCase(value)) { if (!isInUpper) { isInUpper = true; modId.append('_'); } - modId.append(Character.toLowerCase(c)); + modId.append(Character.toString(Character.toLowerCase(value))); } else { isInUpper = false; - modId.append(c); + modId.append(Character.toString(value)); } } return modId.toString(); diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/block/CustomHeadTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/block/CustomHeadTest.java index 4499fa8585..89c4cee369 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/block/CustomHeadTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/block/CustomHeadTest.java @@ -5,6 +5,7 @@ package net.neoforged.neoforge.oldtest.block; +import java.util.Locale; import net.minecraft.client.model.SkullModel; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.renderer.blockentity.SkullBlockRenderer; @@ -107,12 +108,12 @@ public class CustomHeadTest { BLAZE; SkullType() { - TYPES.put(name().toLowerCase(), this); + TYPES.put(getSerializedName(), this); } @Override public String getSerializedName() { - return name().toLowerCase(); + return name().toLowerCase(Locale.ROOT); } }