using System;
using System.Collections.Generic;
using System.Linq;
+using System.Reflection;
using System.Threading.Tasks;
using Content.IntegrationTests;
using Robust.Shared.Prototypes;
+using Robust.Shared.Reflection;
using Robust.Shared.Serialization.Markdown.Validation;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
return (yamlErrors, fieldErrors);
}
- public static async Task<(Dictionary<string, HashSet<ErrorNode>> YamlErrors , List<string> FieldErrors)>
+ public static async Task<(Dictionary<string, HashSet<ErrorNode>> YamlErrors, List<string> FieldErrors)>
RunValidation()
{
+ var (clientAssemblies, serverAssemblies) = await GetClientServerAssemblies();
+ var serverTypes = serverAssemblies.SelectMany(n => n.GetTypes()).Select(t => t.Name).ToHashSet();
+ var clientTypes = clientAssemblies.SelectMany(n => n.GetTypes()).Select(t => t.Name).ToHashSet();
+
var yamlErrors = new Dictionary<string, HashSet<ErrorNode>>();
var serverErrors = await ValidateServer();
var newErrors = val.Where(n => n.AlwaysRelevant).ToHashSet();
// We include sometimes-relevant errors if they exist both for the client & server
- if (clientErrors.Item1.TryGetValue(key, out var clientVal))
+ if (clientErrors.YamlErrors.TryGetValue(key, out var clientVal))
newErrors.UnionWith(val.Intersect(clientVal));
+ // Include any errors that relate to server-only types
+ foreach (var errorNode in val)
+ {
+ if (errorNode is FieldNotFoundErrorNode fieldNotFoundNode && !clientTypes.Contains(fieldNotFoundNode.FieldType.Name))
+ {
+ newErrors.Add(errorNode);
+ }
+ }
+
if (newErrors.Count != 0)
yamlErrors[key] = newErrors;
}
errors.UnionWith(val.Where(n => n.AlwaysRelevant));
else
yamlErrors[key] = newErrors;
+
+ // Include any errors that relate to client-only types
+ foreach (var errorNode in val)
+ {
+ if (errorNode is FieldNotFoundErrorNode fieldNotFoundNode && !serverTypes.Contains(fieldNotFoundNode.FieldType.Name))
+ {
+ newErrors.Add(errorNode);
+ }
+ }
}
// Finally, combine the prototype ID field errors.
return (yamlErrors, fieldErrors);
}
+
+ private static async Task<(Assembly[] clientAssemblies, Assembly[] serverAssemblies)>
+ GetClientServerAssemblies()
+ {
+ await using var pair = await PoolManager.GetServerClient();
+
+ var result = (GetAssemblies(pair.Client), GetAssemblies(pair.Server));
+
+ await pair.CleanReturnAsync();
+
+ return result;
+
+ Assembly[] GetAssemblies(RobustIntegrationTest.IntegrationInstance instance)
+ {
+ var refl = instance.ResolveDependency<IReflectionManager>();
+ return refl.Assemblies.ToArray();
+ }
+ }
}
}