diff --git a/.editorconfig b/.editorconfig index 8f7998107a..233966a3a0 100644 --- a/.editorconfig +++ b/.editorconfig @@ -189,6 +189,9 @@ dotnet_diagnostic.IDE0040.severity = warning # Use 'is null' check. dotnet_diagnostic.IDE0041.severity = warning +# Deconstruct variable declaration. +dotnet_diagnostic.IDE0042.severity = warning + # Make field readonly. dotnet_diagnostic.IDE0044.severity = warning diff --git a/OpenRA.Mods.Common/Installer/SourceActions/ExtractBlastSourceAction.cs b/OpenRA.Mods.Common/Installer/SourceActions/ExtractBlastSourceAction.cs index 4a09a47a03..ef410696d6 100644 --- a/OpenRA.Mods.Common/Installer/SourceActions/ExtractBlastSourceAction.cs +++ b/OpenRA.Mods.Common/Installer/SourceActions/ExtractBlastSourceAction.cs @@ -57,19 +57,19 @@ namespace OpenRA.Mods.Common.Installer continue; } - var entry = entries[node.Value.Value]; + var (length, offset) = entries[node.Value.Value]; - source.Position = entry.Offset; + source.Position = offset; extracted.Add(targetPath); Directory.CreateDirectory(Path.GetDirectoryName(targetPath)); var displayFilename = Path.GetFileName(Path.GetFileName(targetPath)); Action onProgress = null; - if (entry.Length < InstallFromSourceLogic.ShowPercentageThreshold) + if (length < InstallFromSourceLogic.ShowPercentageThreshold) updateMessage(modData.Translation.GetString(InstallFromSourceLogic.Extracing, Translation.Arguments("filename", displayFilename))); else - onProgress = b => updateMessage(modData.Translation.GetString(InstallFromSourceLogic.ExtracingProgress, Translation.Arguments("filename", displayFilename, "progress", 100 * b / entry.Length))); + onProgress = b => updateMessage(modData.Translation.GetString(InstallFromSourceLogic.ExtracingProgress, Translation.Arguments("filename", displayFilename, "progress", 100 * b / length))); using (var target = File.OpenWrite(targetPath)) { diff --git a/OpenRA.Mods.Common/Traits/BotModules/BotModuleLogic/BaseBuilderQueueManager.cs b/OpenRA.Mods.Common/Traits/BotModules/BotModuleLogic/BaseBuilderQueueManager.cs index f5dda0a1f6..83d58e78c8 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/BotModuleLogic/BaseBuilderQueueManager.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/BotModuleLogic/BaseBuilderQueueManager.cs @@ -161,9 +161,7 @@ namespace OpenRA.Mods.Common.Traits else if (baseBuilder.Info.RefineryTypes.Contains(actorInfo.Name)) type = BuildingType.Refinery; - var pack = ChooseBuildLocation(currentBuilding.Item, true, type); - location = pack.Location; - actorVariant = pack.Variant; + (location, actorVariant) = ChooseBuildLocation(currentBuilding.Item, true, type); } if (location == null) diff --git a/OpenRA.Mods.Common/Traits/Crates/Crate.cs b/OpenRA.Mods.Common/Traits/Crates/Crate.cs index e1aef4613d..4f467322ac 100644 --- a/OpenRA.Mods.Common/Traits/Crates/Crate.cs +++ b/OpenRA.Mods.Common/Traits/Crates/Crate.cs @@ -155,15 +155,15 @@ namespace OpenRA.Mods.Common.Traits var totalShares = shares.Sum(a => a.Shares); var n = self.World.SharedRandom.Next(totalShares); - foreach (var s in shares) + foreach (var (action, share) in shares) { - if (n < s.Shares) + if (n < share) { - s.Action.Activate(crusher); + action.Activate(crusher); return; } - n -= s.Shares; + n -= share; } } } diff --git a/OpenRA.Mods.Common/Traits/Player/PlayerRadarTerrain.cs b/OpenRA.Mods.Common/Traits/Player/PlayerRadarTerrain.cs index 2c2585ca0c..bf72d6439a 100644 --- a/OpenRA.Mods.Common/Traits/Player/PlayerRadarTerrain.cs +++ b/OpenRA.Mods.Common/Traits/Player/PlayerRadarTerrain.cs @@ -90,8 +90,8 @@ namespace OpenRA.Mods.Common.Traits if (rtl.TryGetTerrainColorPair(uv, out var c)) return (c.Left.ToArgb(), c.Right.ToArgb()); - var tc = map.GetTerrainColorPair(uv); - return (tc.Left.ToArgb(), tc.Right.ToArgb()); + var (left, right) = map.GetTerrainColorPair(uv); + return (left.ToArgb(), right.ToArgb()); } } } diff --git a/OpenRA.Mods.Common/UpdateRules/Rules/20200503/RenameStances.cs b/OpenRA.Mods.Common/UpdateRules/Rules/20200503/RenameStances.cs index 5e326096b0..ec79c93f11 100644 --- a/OpenRA.Mods.Common/UpdateRules/Rules/20200503/RenameStances.cs +++ b/OpenRA.Mods.Common/UpdateRules/Rules/20200503/RenameStances.cs @@ -79,9 +79,9 @@ namespace OpenRA.Mods.Common.UpdateRules.Rules public override IEnumerable UpdateActorNode(ModData modData, MiniYamlNode actorNode) { - foreach (var field in traits) - foreach (var traitNode in actorNode.ChildrenMatching(field.TraitName)) - traitNode.RenameChildrenMatching(field.OldName, field.NewName); + foreach (var (traitName, oldName, newName) in traits) + foreach (var traitNode in actorNode.ChildrenMatching(traitName)) + traitNode.RenameChildrenMatching(oldName, newName); yield break; } diff --git a/OpenRA.Mods.Common/UtilityCommands/ExtractEmmyLuaAPI.cs b/OpenRA.Mods.Common/UtilityCommands/ExtractEmmyLuaAPI.cs index 9b982b8dec..8876bc8b5e 100644 --- a/OpenRA.Mods.Common/UtilityCommands/ExtractEmmyLuaAPI.cs +++ b/OpenRA.Mods.Common/UtilityCommands/ExtractEmmyLuaAPI.cs @@ -226,15 +226,15 @@ namespace OpenRA.Mods.Common.UtilityCommands return ScriptMemberWrapper.WrappableMembers(t).Select(memberInfo => (memberInfo, required)); }); - foreach (var property in properties) + foreach (var (memberInfo, required) in properties) { Console.WriteLine(); - var isActivity = property.memberInfo.HasAttribute(); + var isActivity = memberInfo.HasAttribute(); - if (property.memberInfo.HasAttribute()) + if (memberInfo.HasAttribute()) { - var lines = property.memberInfo.GetCustomAttributes(true).First().Lines; + var lines = memberInfo.GetCustomAttributes(true).First().Lines; foreach (var line in lines) Console.WriteLine($" --- {line}"); } @@ -242,10 +242,10 @@ namespace OpenRA.Mods.Common.UtilityCommands if (isActivity) Console.WriteLine(" --- *Queued Activity*"); - if (property.required.Any()) - Console.WriteLine($" --- **Requires {(property.required.Length == 1 ? "Trait" : "Traits")}:** {property.required.Select(GetDocumentationUrl).JoinWith(", ")}"); + if (required.Any()) + Console.WriteLine($" --- **Requires {(required.Length == 1 ? "Trait" : "Traits")}:** {required.Select(GetDocumentationUrl).JoinWith(", ")}"); - if (property.memberInfo is MethodInfo methodInfo) + if (memberInfo is MethodInfo methodInfo) { var attributes = methodInfo.GetCustomAttributes(false); foreach (var obsolete in attributes.OfType()) @@ -264,7 +264,7 @@ namespace OpenRA.Mods.Common.UtilityCommands Console.WriteLine($" {methodInfo.Name} = function({parameterString}) end;"); } - if (property.memberInfo is PropertyInfo propertyInfo) + if (memberInfo is PropertyInfo propertyInfo) { Console.WriteLine($" ---@type {propertyInfo.PropertyType.EmmyLuaString()}"); Console.WriteLine(" " + propertyInfo.Name + " = { };"); diff --git a/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs b/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs index ee80176cd1..48509f067b 100644 --- a/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs +++ b/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs @@ -255,13 +255,13 @@ namespace OpenRA.Mods.Common.UtilityCommands Location: LocationFromMapOffset(Exts.ParseIntegerInvariant(kv.Value), MapSize))); // Add waypoint actors skipping duplicate entries - foreach (var kv in wps.DistinctBy(location => location.Location)) + foreach (var (waypointNumber, location) in wps.DistinctBy(location => location.Location)) { - if (!singlePlayer && kv.WaypointNumber <= 7) + if (!singlePlayer && waypointNumber <= 7) { var ar = new ActorReference("mpspawn") { - new LocationInit((CPos)kv.Location), + new LocationInit((CPos)location), new OwnerInit("Neutral") }; @@ -272,11 +272,11 @@ namespace OpenRA.Mods.Common.UtilityCommands { var ar = new ActorReference("waypoint") { - new LocationInit((CPos)kv.Location), + new LocationInit((CPos)location), new OwnerInit("Neutral") }; - SaveWaypoint(kv.WaypointNumber, ar); + SaveWaypoint(waypointNumber, ar); } } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoLogic.cs index ea2ee12f26..95b42e98db 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoLogic.cs @@ -101,12 +101,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic for (var i = 0; i < numTabs; i++) { var type = visiblePanels[i]; - var info = panels[type]; + var (panel, label, setup) = panels[type]; var tabButton = tabContainer?.Get($"BUTTON{i + 1}"); if (tabButton != null) { - tabButton.Text = modData.Translation.GetString(info.Label); + tabButton.Text = modData.Translation.GetString(label); tabButton.OnClick = () => { if (activePanel == IngameInfoPanel.Chat) @@ -117,9 +117,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic tabButton.IsHighlighted = () => activePanel == type; } - var panelContainer = widget.Get(info.Panel); + var panelContainer = widget.Get(panel); panelContainer.IsVisible = () => activePanel == type; - info.Setup(tabButton, panelContainer); + setup(tabButton, panelContainer); if (activePanel == IngameInfoPanel.AutoSelect) activePanel = type; diff --git a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs index 84635e01d0..02ac98670e 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs @@ -228,9 +228,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic flag.GetImageCollection = () => "flags"; flag.GetImageName = () => factionId; - var tooltip = SplitOnFirstToken(faction.Description); - item.GetTooltipText = () => tooltip.First; - item.GetTooltipDesc = () => tooltip.Second; + var (text, desc) = SplitOnFirstToken(faction.Description); + item.GetTooltipText = () => text; + item.GetTooltipDesc = () => desc; return item; } @@ -566,9 +566,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic dropdown.IsDisabled = () => s.LockFaction || orderManager.LocalClient.IsReady; dropdown.OnMouseDown = _ => ShowFactionDropDown(dropdown, c, orderManager, factions); - var tooltip = SplitOnFirstToken(factions[c.Faction].Description); - dropdown.GetTooltipText = () => tooltip.First; - dropdown.GetTooltipDesc = () => tooltip.Second; + var (text, desc) = SplitOnFirstToken(factions[c.Faction].Description); + dropdown.GetTooltipText = () => text; + dropdown.GetTooltipDesc = () => desc; SetupFactionWidget(dropdown, c, factions); } diff --git a/OpenRA.Mods.Common/Widgets/Logic/SystemInfoPromptLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/SystemInfoPromptLogic.cs index 0f1a8c4a39..81f8cb6a1b 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/SystemInfoPromptLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/SystemInfoPromptLogic.cs @@ -69,10 +69,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic var template = sysInfoData.Get("DATA_TEMPLATE"); sysInfoData.RemoveChildren(); - foreach (var info in GetSystemInformation().Values) + foreach (var (name, value) in GetSystemInformation().Values) { var label = template.Clone() as LabelWidget; - var text = info.Label + ": " + info.Value; + var text = name + ": " + value; label.GetText = () => text; sysInfoData.AddChild(label); } diff --git a/OpenRA.Mods.Common/Widgets/RadarWidget.cs b/OpenRA.Mods.Common/Widgets/RadarWidget.cs index 0a8622bc2e..0655a58c4b 100644 --- a/OpenRA.Mods.Common/Widgets/RadarWidget.cs +++ b/OpenRA.Mods.Common/Widgets/RadarWidget.cs @@ -222,10 +222,8 @@ namespace OpenRA.Mods.Common.Widgets void UpdateTerrainColor(MPos uv) { - var colorPair = playerRadarTerrain != null && playerRadarTerrain.IsInitialized ? + var (leftColor, rightColor) = playerRadarTerrain != null && playerRadarTerrain.IsInitialized ? playerRadarTerrain[uv] : PlayerRadarTerrain.GetColor(world.Map, radarTerrainLayers, uv); - var leftColor = colorPair.Left; - var rightColor = colorPair.Right; var stride = radarSheet.Size.Width;