From 89fdddfd75ef44262db2ccb98f08c4077b8894ed Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Mon, 9 Mar 2026 06:21:52 +0200 Subject: [PATCH] Fixed formatter adding spaces between operators i.e >= becomes > = --- .../client/gui/util/script/FormatHelper.java | 58 ++++++++++++++++--- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/src/main/java/noppes/npcs/client/gui/util/script/FormatHelper.java b/src/main/java/noppes/npcs/client/gui/util/script/FormatHelper.java index cf95e9026..33fe306af 100644 --- a/src/main/java/noppes/npcs/client/gui/util/script/FormatHelper.java +++ b/src/main/java/noppes/npcs/client/gui/util/script/FormatHelper.java @@ -470,8 +470,34 @@ public class FormatHelper { * Normalize whitespace (multiple spaces → single space) */ private String normalizeWhitespace(String code) { - // Replace multiple spaces with single space, but preserve indentation - return code.replaceAll(" +", " "); + String result = code.replaceAll(" +", " "); + + // Re-join operator characters that got split by spaces. + // Order: longest tokens first so that e.g. ">>>" is rejoined before ">>". + result = result.replaceAll(">\\s+>\\s+>\\s*=", ">>>="); + result = result.replaceAll(">\\s+>\\s+=", ">>="); + result = result.replaceAll("<\\s+<\\s+=", "<<="); + result = result.replaceAll(">\\s+>\\s+>", ">>>"); + result = result.replaceAll(">\\s+>", ">>"); + result = result.replaceAll("<\\s+<", "<<"); + result = result.replaceAll("=\\s+=\\s+=", "==="); + result = result.replaceAll("!\\s+=\\s+=", "!=="); + result = result.replaceAll("=\\s+=", "=="); + result = result.replaceAll("!\\s+=", "!="); + result = result.replaceAll(">\\s+=", ">="); + result = result.replaceAll("<\\s+=", "<="); + result = result.replaceAll("\\+\\s+=", "+="); + result = result.replaceAll("-\\s+=", "-="); + result = result.replaceAll("\\*\\s+=", "*="); + result = result.replaceAll("/\\s+=", "/="); + result = result.replaceAll("%\\s+=", "%="); + result = result.replaceAll("&\\s+=", "&="); + result = result.replaceAll("\\|\\s+=", "|="); + result = result.replaceAll("\\^\\s+=", "^="); + result = result.replaceAll("&\\s+&", "&&"); + result = result.replaceAll("\\|\\s+\\|", "||"); + + return result; } /** @@ -499,8 +525,10 @@ public class FormatHelper { result = formatSimpleAssignment(result); } - // Comparison operators + // Comparison operators (longer tokens first to avoid sub-string clobbering) if (settings.spaceAroundComparison) { + result = formatBinaryOp(result, "===", " === "); + result = formatBinaryOp(result, "!==", " !== "); result = formatBinaryOp(result, "==", " == "); result = formatBinaryOp(result, "!=", " != "); result = formatBinaryOp(result, "<=", " <= "); @@ -529,12 +557,24 @@ public class FormatHelper { return result; } - /** - * Format a binary operator with proper spacing - */ private String formatBinaryOp(String code, String op, String replacement) { - // First normalize: remove extra spaces around the operator - String pattern = "\\s*" + Pattern.quote(op) + "\\s*"; + String quotedOp = Pattern.quote(op); + // Negative lookahead/lookbehind guards prevent matching a shorter operator + // token inside a longer one (e.g. >> must not match inside >>=). + String lookBehind = ""; + String lookAhead = ""; + + switch (op) { + case ">>": lookBehind = "(?)"; lookAhead = "(?![>=])"; break; + case "<<": lookBehind = "(?=": lookBehind = "(?)"; break; + case "<=": lookBehind = "(?' || prev == '+' || prev == '-' || prev == '*' || prev == '/' || prev == '%' || prev == '&' || - prev == '|' || prev == '^'; + prev == '|' || prev == '^' || prev == '='; boolean isEquality = next == '='; if (!isCompound && !isEquality) {