From d6c75844bf7fc792cfe2828b1ec75ab863bda5e0 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Tue, 20 Oct 2015 23:33:28 +0100 Subject: [PATCH] Add a lint pass to check chrome logic validity. --- OpenRA.Mods.Common/Lint/CheckChromeLogic.cs | 53 ++++++++++++++++++++ OpenRA.Mods.Common/OpenRA.Mods.Common.csproj | 1 + 2 files changed, 54 insertions(+) create mode 100644 OpenRA.Mods.Common/Lint/CheckChromeLogic.cs diff --git a/OpenRA.Mods.Common/Lint/CheckChromeLogic.cs b/OpenRA.Mods.Common/Lint/CheckChromeLogic.cs new file mode 100644 index 0000000000..1bf7a38dcd --- /dev/null +++ b/OpenRA.Mods.Common/Lint/CheckChromeLogic.cs @@ -0,0 +1,53 @@ +#region Copyright & License Information +/* + * Copyright 2007-2015 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Lint +{ + class CheckChromeLogic : ILintPass + { + public void Run(Action emitError, Action emitWarning) + { + foreach (var filename in Game.ModData.Manifest.ChromeLayout) + CheckInner(MiniYaml.FromFile(filename), filename, emitError); + } + + void CheckInner(List nodes, string filename, Action emitError) + { + foreach (var node in nodes) + { + if (node.Value == null) + continue; + + if (node.Key == "Logic") + { + var typeNames = FieldLoader.GetValue(node.Key, node.Value.Value); + foreach (var typeName in typeNames) + { + var type = Game.ModData.ObjectCreator.FindType(typeName); + if (type == null) + emitError("{0} refers to a logic object `{1}` that does not exist".F(filename, typeName)); + else if (!typeof(ChromeLogic).IsAssignableFrom(type)) + emitError("{0} refers to a logic object `{1}` that does not inherit from ChromeLogic".F(filename, typeName)); + } + } + + if (node.Value.Nodes != null) + CheckInner(node.Value.Nodes, filename, emitError); + } + } + } +} \ No newline at end of file diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 3034332ae9..5e856ba673 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -704,6 +704,7 @@ +