Skip to content

Commit

Permalink
Make YAML Linter validate server/client-only components (space-wizard…
Browse files Browse the repository at this point in the history
…s#26809)

* YAML Linter now validates invalid fields in server-only and client-only components

* Update to change in engine PR

* Use reflection manager to get the lists of client/server assemblies.

Also made it use a hashset on type instead of the previous code.

* I'm dumb my bad.

* Fix 2 errors that snuck through, showing why we need this.

---------

Co-authored-by: Pieter-Jan Briers <[email protected]>
  • Loading branch information
Tayrtahn and PJB3005 authored Apr 19, 2024
1 parent 5b62724 commit 299da35
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 4 deletions.
46 changes: 44 additions & 2 deletions Content.YAMLLinter/Program.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
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;
Expand Down Expand Up @@ -103,9 +105,13 @@ await instance.WaitPost(() =>
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();
Expand All @@ -117,9 +123,18 @@ await instance.WaitPost(() =>
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;
}
Expand All @@ -135,6 +150,15 @@ await instance.WaitPost(() =>
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.
Expand All @@ -145,5 +169,23 @@ await instance.WaitPost(() =>

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();
}
}
}
}
1 change: 0 additions & 1 deletion Resources/Prototypes/Hydroponics/seeds.yml
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,6 @@
nutrientConsumption: 0.70
idealLight: 8
idealHeat: 298
juicy: true
growthStages: 2
splatPrototype: PuddleSplatter
chemicals:
Expand Down
1 change: 0 additions & 1 deletion Resources/Prototypes/Reagents/toxins.yml
Original file line number Diff line number Diff line change
Expand Up @@ -481,7 +481,6 @@
- !type:OrganType
type: Animal
shouldHave: false
reagent: Protein
type: Local
visualType: MediumCaution
messages: [ "generic-reagent-effect-sick" ]
Expand Down

0 comments on commit 299da35

Please sign in to comment.