From 97a82cbc4a5b32e16305f8eccdbcc53863b242b4 Mon Sep 17 00:00:00 2001 From: Ralph Sennhauser Date: Sat, 14 Jun 2025 12:27:36 +0200 Subject: [PATCH] Enable eslint rule 'no-redeclare' Enable recommended rule 'no-redeclare' [1] and manually fix violations. [1] https://eslint.org/docs/latest/rules/no-redeclare Ref: #8068 Signed-off-by: Ralph Sennhauser --- .../data/mods/public/globalscripts/FSM.js | 12 ++-- .../data/mods/public/globalscripts/Math.js | 18 +++--- .../data/mods/public/maps/random/migration.js | 36 +++++------ .../components/BuildRestrictions.js | 9 +-- .../simulation/components/EntityLimits.js | 33 +++++----- .../components/TechnologyManager.js | 16 ++--- .../public/simulation/components/UnitAI.js | 4 +- .../public/simulation/helpers/Commands.js | 24 ++++---- eslint.config.mjs | 2 +- source/tools/profiler2/Profiler2Report.js | 61 ++++++++++--------- 10 files changed, 112 insertions(+), 103 deletions(-) diff --git a/binaries/data/mods/public/globalscripts/FSM.js b/binaries/data/mods/public/globalscripts/FSM.js index 0ed4999a68..14af8bc47a 100644 --- a/binaries/data/mods/public/globalscripts/FSM.js +++ b/binaries/data/mods/public/globalscripts/FSM.js @@ -181,14 +181,14 @@ function FSM(spec) fsm.states[path.join(".")] = state; var newhandlers = {}; - for (var e in handlers) + for (const e in handlers) newhandlers[e] = handlers[e]; state._name = path.join("."); state._parent = path.slice(0, -1).join("."); state._refs = {}; - for (var key in node) + for (const key in node) { if (key === "enter" || key === "leave") { @@ -207,10 +207,10 @@ function FSM(spec) } } - for (var e in newhandlers) + for (const e in newhandlers) state[e] = newhandlers[e]; - for (var key in node) + for (const key in node) { if (key.match(/^[A-Z]+$/)) { @@ -343,7 +343,7 @@ FSM.prototype.SwitchToNextState = function(obj, nextStateName) if (equalPrefix > 0 && equalPrefix === toState.length) --equalPrefix; - for (var i = fromState.length-1; i >= equalPrefix; --i) + for (let i = fromState.length-1; i >= equalPrefix; --i) { var leave = this.states[fromState[i]].leave; if (leave) @@ -357,7 +357,7 @@ FSM.prototype.SwitchToNextState = function(obj, nextStateName) } } - for (var i = equalPrefix; i < toState.length; ++i) + for (let i = equalPrefix; i < toState.length; ++i) { var enter = this.states[toState[i]].enter; if (enter) diff --git a/binaries/data/mods/public/globalscripts/Math.js b/binaries/data/mods/public/globalscripts/Math.js index 89279502a7..23296911de 100644 --- a/binaries/data/mods/public/globalscripts/Math.js +++ b/binaries/data/mods/public/globalscripts/Math.js @@ -176,10 +176,11 @@ Math.square = function(x) */ Math.exp = function(x) { + let iPart; if (x < 0) - var iPart = 1/Math.intPow(Math.E, -Math.floor(x)); + iPart = 1/Math.intPow(Math.E, -Math.floor(x)); else - var iPart = Math.intPow(Math.E, Math.floor(x)); + iPart = Math.intPow(Math.E, Math.floor(x)); if (x === Math.floor(x)) // no need to loop if we know the answer @@ -226,9 +227,10 @@ Math.log = function(x) // when implemented in C, just count the number of bits before the fraction // without leading zeros. This may be negative. var log = 0; + let i; if (x >= 1) { - for (var i = 1; i <= x; i *= 2) + for (i = 1; i <= x; i *= 2) log++; log--; @@ -236,7 +238,7 @@ Math.log = function(x) } else { - for (var i = 1; i > x; i /= 2) + for (i = 1; i > x; i /= 2) log--; } // now lb(x) = log + lb(y) with y = x/i. So y \in [1,2) @@ -297,14 +299,14 @@ Math.intPow = function(x, y) var result = 1; - var i = binary.length; + var l = binary.length; while (y > 0) { - if (binary[--i] <= y) + if (binary[--l] <= y) { - result *= powers[i]; - y -= binary[i]; + result *= powers[l]; + y -= binary[l]; } } // error margin = 0 (default JS error) diff --git a/binaries/data/mods/public/maps/random/migration.js b/binaries/data/mods/public/maps/random/migration.js index 3a80d4463a..486afb1fca 100644 --- a/binaries/data/mods/public/maps/random/migration.js +++ b/binaries/data/mods/public/maps/random/migration.js @@ -187,25 +187,27 @@ export function* generateMap(mapSettings) yield 34; g_Map.log("Creating forests"); - var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); - var types = [ - [[tForestFloor2, tMainTerrain, pForest1], [tForestFloor2, pForest1]], - [[tForestFloor1, tMainTerrain, pForest2], [tForestFloor1, pForest2]] - ]; + { + const [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); + const types = [ + [[tForestFloor2, tMainTerrain, pForest1], [tForestFloor2, pForest1]], + [[tForestFloor1, tMainTerrain, pForest2], [tForestFloor1, pForest2]] + ]; - var size = forestTrees / (scaleByMapSize(2, 8) * numPlayers) * - (currentBiome() == "generic/savanna" ? 2 : 1); + const size = forestTrees / (scaleByMapSize(2, 8) * numPlayers) * + (currentBiome() == "generic/savanna" ? 2 : 1); - var num = Math.floor(size / types.length); - for (const type of types) - createAreas( - new ClumpPlacer(forestTrees / num, 0.1, 0.1, Infinity), - [ - new LayeredPainter(type, [2]), - new TileClassPainter(clForest) - ], - [avoidClasses(clForest, 10, clHill, 2), stayClasses(clLand, 7)], - num); + const num = Math.floor(size / types.length); + for (const type of types) + createAreas( + new ClumpPlacer(forestTrees / num, 0.1, 0.1, Infinity), + [ + new LayeredPainter(type, [2]), + new TileClassPainter(clForest) + ], + [avoidClasses(clForest, 10, clHill, 2), stayClasses(clLand, 7)], + num); + } yield 38; g_Map.log("Creating dirt patches"); diff --git a/binaries/data/mods/public/simulation/components/BuildRestrictions.js b/binaries/data/mods/public/simulation/components/BuildRestrictions.js index 453cf15407..7a7ca5f6fe 100644 --- a/binaries/data/mods/public/simulation/components/BuildRestrictions.js +++ b/binaries/data/mods/public/simulation/components/BuildRestrictions.js @@ -104,7 +104,7 @@ BuildRestrictions.prototype.CheckPlacement = function() if (!cmpPlayer.IsAI()) { // Check whether it's in a visible or fogged region - var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); + const cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); var cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership); if (!cmpRangeManager || !cmpOwnership) return result; // Fail @@ -141,14 +141,15 @@ BuildRestrictions.prototype.CheckPlacement = function() return result; // Fail + let ret; if (this.template.Category == "Wall") { // for walls, only test the center point - var ret = cmpObstruction.CheckFoundation(passClassName, true); + ret = cmpObstruction.CheckFoundation(passClassName, true); } else { - var ret = cmpObstruction.CheckFoundation(passClassName, false); + ret = cmpObstruction.CheckFoundation(passClassName, false); } if (ret !== "success") @@ -252,7 +253,7 @@ BuildRestrictions.prototype.CheckPlacement = function() // Check distance restriction if (this.template.Distance) { - var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); + const cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); var cat = this.template.Distance.FromClass; var filter = function(id) diff --git a/binaries/data/mods/public/simulation/components/EntityLimits.js b/binaries/data/mods/public/simulation/components/EntityLimits.js index 64b6634b78..1af2bfe280 100644 --- a/binaries/data/mods/public/simulation/components/EntityLimits.js +++ b/binaries/data/mods/public/simulation/components/EntityLimits.js @@ -82,7 +82,7 @@ EntityLimits.prototype.Init = function() if (category in this.template.LimitChangers) { this.changers[category] = {}; - for (var c in this.template.LimitChangers[category]) + for (const c in this.template.LimitChangers[category]) this.changers[category][c] = +this.template.LimitChangers[category][c]; } if (category in this.template.LimitRemovers) @@ -90,7 +90,7 @@ EntityLimits.prototype.Init = function() // Keep a copy of removable limits for possible restoration. this.removedLimit[category] = this.limit[category]; this.removers[category] = {}; - for (var c in this.template.LimitRemovers[category]) + for (const c in this.template.LimitRemovers[category]) { this.removers[category][c] = this.template.LimitRemovers[category][c]._string.split(/\s+/); if (c === "RequiredClasses") @@ -251,23 +251,26 @@ EntityLimits.prototype.OnGlobalOwnershipChanged = function(msg) error("EntityLimits component is defined on a non-player entity"); return; } + let modifier; if (msg.from == cmpPlayer.GetPlayerID()) - var modifier = -1; + modifier = -1; else if (msg.to == cmpPlayer.GetPlayerID()) - var modifier = 1; + modifier = 1; else return; // Update entity counts - var category = null; - var cmpBuildRestrictions = Engine.QueryInterface(msg.entity, IID_BuildRestrictions); - if (cmpBuildRestrictions) - category = cmpBuildRestrictions.GetCategory(); - var cmpTrainingRestrictions = Engine.QueryInterface(msg.entity, IID_TrainingRestrictions); - if (cmpTrainingRestrictions) - category = cmpTrainingRestrictions.GetCategory(); - if (category) - this.ChangeCount(category, modifier); + { + let category; + const cmpBuildRestrictions = Engine.QueryInterface(msg.entity, IID_BuildRestrictions); + if (cmpBuildRestrictions) + category = cmpBuildRestrictions.GetCategory(); + const cmpTrainingRestrictions = Engine.QueryInterface(msg.entity, IID_TrainingRestrictions); + if (cmpTrainingRestrictions) + category = cmpTrainingRestrictions.GetCategory(); + if (category) + this.ChangeCount(category, modifier); + } // Update entity limits var cmpIdentity = Engine.QueryInterface(msg.entity, IID_Identity); @@ -279,7 +282,7 @@ EntityLimits.prototype.OnGlobalOwnershipChanged = function(msg) if (cmpFoundation) return; var classes = cmpIdentity.GetClassesList(); - for (var category in this.changers) + for (const category in this.changers) for (var c in this.changers[category]) if (classes.indexOf(c) >= 0) { @@ -289,7 +292,7 @@ EntityLimits.prototype.OnGlobalOwnershipChanged = function(msg) this.removedLimit[category] += modifier * this.changers[category][c]; } - for (var category in this.removers) + for (const category in this.removers) if ("RequiredClasses" in this.removers[category]) for (var cls of this.removers[category].RequiredClasses) if (classes.indexOf(cls) !== -1) diff --git a/binaries/data/mods/public/simulation/components/TechnologyManager.js b/binaries/data/mods/public/simulation/components/TechnologyManager.js index a0555fa6c7..131b334c75 100644 --- a/binaries/data/mods/public/simulation/components/TechnologyManager.js +++ b/binaries/data/mods/public/simulation/components/TechnologyManager.js @@ -379,14 +379,14 @@ TechnologyManager.prototype.OnGlobalOwnershipChanged = function(msg) var playerID = (Engine.QueryInterface(this.entity, IID_Player)).GetPlayerID(); if (msg.to == playerID) { - var cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); - var template = cmpTemplateManager.GetCurrentTemplateName(msg.entity); + const cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); + const template = cmpTemplateManager.GetCurrentTemplateName(msg.entity); - var cmpIdentity = Engine.QueryInterface(msg.entity, IID_Identity); + const cmpIdentity = Engine.QueryInterface(msg.entity, IID_Identity); if (!cmpIdentity) return; - var classes = cmpIdentity.GetClassesList(); + const classes = cmpIdentity.GetClassesList(); // don't use foundations for the class counts but check if techs apply (e.g. health increase) if (!Engine.QueryInterface(msg.entity, IID_Foundation)) { @@ -403,16 +403,16 @@ TechnologyManager.prototype.OnGlobalOwnershipChanged = function(msg) } if (msg.from == playerID) { - var cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); - var template = cmpTemplateManager.GetCurrentTemplateName(msg.entity); + const cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); + const template = cmpTemplateManager.GetCurrentTemplateName(msg.entity); // don't use foundations for the class counts if (!Engine.QueryInterface(msg.entity, IID_Foundation)) { - var cmpIdentity = Engine.QueryInterface(msg.entity, IID_Identity); + const cmpIdentity = Engine.QueryInterface(msg.entity, IID_Identity); if (cmpIdentity) { - var classes = cmpIdentity.GetClassesList(); + const classes = cmpIdentity.GetClassesList(); for (const cls of classes) { this.classCounts[cls] -= 1; diff --git a/binaries/data/mods/public/simulation/components/UnitAI.js b/binaries/data/mods/public/simulation/components/UnitAI.js index 7b5e1c7b83..c0c61a75cc 100644 --- a/binaries/data/mods/public/simulation/components/UnitAI.js +++ b/binaries/data/mods/public/simulation/components/UnitAI.js @@ -4197,7 +4197,7 @@ UnitAI.prototype.UpdateWorkOrders = function(type) var cmpUnitAI = Engine.QueryInterface(this.formationController, IID_UnitAI); if (cmpUnitAI) { - for (var i = 0; i < cmpUnitAI.orderQueue.length; ++i) + for (let i = 0; i < cmpUnitAI.orderQueue.length; ++i) { if (isWorkType(cmpUnitAI.orderQueue[i].type)) { @@ -4209,7 +4209,7 @@ UnitAI.prototype.UpdateWorkOrders = function(type) } // If nothing found, take the unit orders - for (var i = 0; i < this.orderQueue.length; ++i) + for (let i = 0; i < this.orderQueue.length; ++i) { if (isWorkType(this.orderQueue[i].type)) { diff --git a/binaries/data/mods/public/simulation/helpers/Commands.js b/binaries/data/mods/public/simulation/helpers/Commands.js index 957577bb1d..35991c9e37 100644 --- a/binaries/data/mods/public/simulation/helpers/Commands.js +++ b/binaries/data/mods/public/simulation/helpers/Commands.js @@ -1047,10 +1047,10 @@ function GetDockAngle(template, x, z) * 6. Calculate angle using average of sequence */ const numPoints = 16; - for (var dist = 0; dist < 4; ++dist) + for (let dist = 0; dist < 4; ++dist) { var waterPoints = []; - for (var i = 0; i < numPoints; ++i) + for (let i = 0; i < numPoints; ++i) { var angle = (i/numPoints)*2*Math.PI; var d = halfSize*(dist+1); @@ -1064,9 +1064,9 @@ function GetDockAngle(template, x, z) var length = waterPoints.length; if (!length) continue; - for (var i = 0; i < length; ++i) + for (let i = 0; i < length; ++i) { - var count = 0; + let count = 0; for (let j = 0; j < length - 1; ++j) { if ((waterPoints[(i + j) % length] + 1) % numPoints == waterPoints[(i + j + 1) % length]) @@ -1076,9 +1076,9 @@ function GetDockAngle(template, x, z) } consec[i] = count; } - var start = 0; - var count = 0; - for (var c in consec) + let start = 0; + let count = 0; + for (const c in consec) { if (consec[c] > count) { @@ -1191,7 +1191,7 @@ function TryConstructBuilding(player, cmpPlayer, controlAllUnits, cmd) if (g_DebugCommands) warn("Invalid command: build restrictions check failed with '"+ret.message+"' for player "+player+": "+uneval(cmd)); - var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); + const cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); ret.players = [player]; cmpGuiInterface.PushNotification(ret); @@ -1224,7 +1224,7 @@ function TryConstructBuilding(player, cmpPlayer, controlAllUnits, cmd) if (g_DebugCommands) warn("Invalid command: required technology check failed for player "+player+": "+uneval(cmd)); - var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); + const cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); cmpGuiInterface.PushNotification({ "type": "text", "players": [player], @@ -1379,7 +1379,7 @@ function TryConstructWall(player, cmpPlayer, controlAllUnits, cmd) var pieces = clone(cmd.pieces); for (; i < pieces.length; ++i) { - var piece = pieces[i]; + const piece = pieces[i]; // All wall pieces after the first must be queued. if (i > 0 && !queued) @@ -1475,9 +1475,9 @@ function TryConstructWall(player, cmpPlayer, controlAllUnits, cmd) lastTowerControlGroup = cmpSnappedEndObstruction.GetControlGroup(); } - for (var j = lastBuiltPieceIndex; j >= 0; --j) + for (let j = lastBuiltPieceIndex; j >= 0; --j) { - var piece = pieces[j]; + const piece = pieces[j]; if (!piece.ent) { diff --git a/eslint.config.mjs b/eslint.config.mjs index 82e85929cd..7f7e411b3e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -38,7 +38,7 @@ const configEslintRecommended = { "no-func-assign": "warn", "no-irregular-whitespace": "warn", "no-obj-calls": "warn", - "no-redeclare": "off", + "no-redeclare": "warn", "no-self-assign": "warn", "no-shadow-restricted-names": "warn", "no-undef": "off", diff --git a/source/tools/profiler2/Profiler2Report.js b/source/tools/profiler2/Profiler2Report.js index 0d5a515480..4ce6c30bb8 100644 --- a/source/tools/profiler2/Profiler2Report.js +++ b/source/tools/profiler2/Profiler2Report.js @@ -205,7 +205,7 @@ class Profiler2Report var last_frame_time_start; var stack = []; - for (var i = 0; i < data.length; ++i) + for (let i = 0; i < data.length; ++i) { if (data[i][0] == this.ITEM_EVENT && data[i][2] == '__framestart') { @@ -224,7 +224,7 @@ class Profiler2Report } if (range.numframes) { - for (var i = data.length - 1; i > 0; --i) + for (let i = data.length - 1; i > 0; --i) { if (data[i][0] == this.ITEM_EVENT && data[i][2] == '__framestart') { @@ -234,7 +234,7 @@ class Profiler2Report } var framesfound = 0; - for (var i = end - 1; i > 0; --i) + for (let i = end - 1; i > 0; --i) { if (data[i][0] == this.ITEM_EVENT && data[i][2] == '__framestart') { @@ -249,10 +249,10 @@ class Profiler2Report } else if (range.seconds) { - var end = data.length - 1; - for (var i = end; i > 0; --i) + end = data.length - 1; + for (let i = end; i > 0; --i) { - var type = data[i][0]; + const type = data[i][0]; if (type == this.ITEM_EVENT || type == this.ITEM_ENTER || type == this.ITEM_LEAVE) { tmax = data[i][1]; @@ -261,9 +261,9 @@ class Profiler2Report } tmin = tmax - range.seconds; - for (var i = end; i > 0; --i) + for (let i = end; i > 0; --i) { - var type = data[i][0]; + const type = data[i][0]; if ((type == this.ITEM_EVENT || type == this.ITEM_ENTER || type == this.ITEM_LEAVE) && data[i][1] < tmin) break; start = i; @@ -276,9 +276,9 @@ class Profiler2Report tmin = range.tmin; tmax = range.tmax; - for (var i = data.length-1; i > 0; --i) + for (let i = data.length-1; i > 0; --i) { - var type = data[i][0]; + const type = data[i][0]; if ((type == this.ITEM_EVENT || type == this.ITEM_ENTER || type == this.ITEM_LEAVE) && data[i][1] < tmax) { end = i; @@ -286,9 +286,9 @@ class Profiler2Report } } - for (var i = end; i > 0; --i) + for (let i = end; i > 0; --i) { - var type = data[i][0]; + const type = data[i][0]; if ((type == this.ITEM_EVENT || type == this.ITEM_ENTER || type == this.ITEM_LEAVE) && data[i][1] < tmin) break; start = i; @@ -314,30 +314,31 @@ class Profiler2Report var events = []; // Read events for the entire data period (not just start..end) - var lastWasEvent = false; - for (var i = 0; i < data.length; ++i) { - if (data[i][0] == this.ITEM_EVENT) + let lastWasEvent = false; + for (let i = 0; i < data.length; ++i) { - events.push({ 't': data[i][1], 'id': data[i][2] }); - lastWasEvent = true; - } - else if (data[i][0] == this.ITEM_ATTRIBUTE) - { - if (lastWasEvent) + if (data[i][0] == this.ITEM_EVENT) { - if (!events[events.length-1].attrs) - events[events.length-1].attrs = []; - events[events.length-1].attrs.push(data[i][1]); + events.push({ 't': data[i][1], 'id': data[i][2] }); + lastWasEvent = true; + } + else if (data[i][0] == this.ITEM_ATTRIBUTE) + { + if (lastWasEvent) + { + if (!events[events.length-1].attrs) + events[events.length-1].attrs = []; + events[events.length-1].attrs.push(data[i][1]); + } + } + else + { + lastWasEvent = false; } } - else - { - lastWasEvent = false; - } } - var intervals = []; var intervals_by_type = {}; @@ -346,7 +347,7 @@ class Profiler2Report var lastT = 0; var lastWasEvent = false; - for (var i = start; i <= end; ++i) + for (let i = start; i <= end; ++i) { if (data[i][0] == this.ITEM_EVENT) {