Cache reflection calls when running utility lints and commands.
Reduces runtime of --check-yaml command to 70% of original.
This commit is contained in:
committed by
Matthias Mailänder
parent
1a2aafa17c
commit
9dd4f938da
@@ -39,16 +39,16 @@ namespace OpenRA.Mods.Common.Lint
|
||||
void CheckTrait(Action<string> emitError, ActorInfo actorInfo, TraitInfo traitInfo, Ruleset rules)
|
||||
{
|
||||
var actualType = traitInfo.GetType();
|
||||
foreach (var field in actualType.GetFields())
|
||||
foreach (var field in Utility.GetFields(actualType))
|
||||
{
|
||||
if (field.HasAttribute<ActorReferenceAttribute>())
|
||||
if (Utility.HasAttribute<ActorReferenceAttribute>(field))
|
||||
CheckActorReference(emitError, actorInfo, traitInfo, field, rules.Actors,
|
||||
field.GetCustomAttributes<ActorReferenceAttribute>(true)[0]);
|
||||
Utility.GetCustomAttributes<ActorReferenceAttribute>(field, true)[0]);
|
||||
|
||||
if (field.HasAttribute<WeaponReferenceAttribute>())
|
||||
if (Utility.HasAttribute<WeaponReferenceAttribute>(field))
|
||||
CheckWeaponReference(emitError, actorInfo, traitInfo, field, rules.Weapons);
|
||||
|
||||
if (field.HasAttribute<VoiceSetReferenceAttribute>())
|
||||
if (Utility.HasAttribute<VoiceSetReferenceAttribute>(field))
|
||||
CheckVoiceReference(emitError, actorInfo, traitInfo, field, rules.Voices);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Lint
|
||||
|
||||
// Build the list of widget keys to validate
|
||||
var checkWidgetFields = modData.ObjectCreator.GetTypesImplementing<Widget>()
|
||||
.SelectMany(w => w.GetFields()
|
||||
.SelectMany(w => Utility.GetFields(w)
|
||||
.Where(f => f.FieldType == typeof(HotkeyReference))
|
||||
.Select(f => (w.Name.Substring(0, w.Name.Length - 6), f.Name)))
|
||||
.ToArray();
|
||||
@@ -47,7 +47,7 @@ namespace OpenRA.Mods.Common.Lint
|
||||
|
||||
foreach (var w in modData.ObjectCreator.GetTypesImplementing<Widget>())
|
||||
{
|
||||
foreach (var m in w.GetMethods().Where(m => m.HasAttribute<CustomLintableHotkeyNames>()))
|
||||
foreach (var m in w.GetMethods().Where(m => Utility.HasAttribute<CustomLintableHotkeyNames>(m)))
|
||||
{
|
||||
var p = m.GetParameters();
|
||||
if (p.Length == 3 && p[0].ParameterType == typeof(MiniYamlNode) && p[1].ParameterType == typeof(Action<string>)
|
||||
@@ -104,7 +104,7 @@ namespace OpenRA.Mods.Common.Lint
|
||||
if (type == null)
|
||||
continue;
|
||||
|
||||
checkArgKeys.AddRange(type.GetCustomAttributes<ChromeLogicArgsHotkeys>(true).SelectMany(x => x.LogicArgKeys));
|
||||
checkArgKeys.AddRange(Utility.GetCustomAttributes<ChromeLogicArgsHotkeys>(type, true).SelectMany(x => x.LogicArgKeys));
|
||||
}
|
||||
|
||||
foreach (var n in node.Value.Nodes)
|
||||
|
||||
@@ -38,20 +38,23 @@ namespace OpenRA.Mods.Common.Lint
|
||||
|
||||
foreach (var trait in actorInfo.Value.TraitInfos<TraitInfo>())
|
||||
{
|
||||
var fieldConsumed = trait.GetType().GetFields()
|
||||
.Where(x => x.HasAttribute<ConsumedConditionReferenceAttribute>())
|
||||
var fields = Utility.GetFields(trait.GetType());
|
||||
var properties = trait.GetType().GetProperties();
|
||||
|
||||
var fieldConsumed = fields
|
||||
.Where(x => Utility.HasAttribute<ConsumedConditionReferenceAttribute>(x))
|
||||
.SelectMany(f => LintExts.GetFieldValues(trait, f));
|
||||
|
||||
var propertyConsumed = trait.GetType().GetProperties()
|
||||
.Where(x => x.HasAttribute<ConsumedConditionReferenceAttribute>())
|
||||
var propertyConsumed = properties
|
||||
.Where(x => Utility.HasAttribute<ConsumedConditionReferenceAttribute>(x))
|
||||
.SelectMany(p => LintExts.GetPropertyValues(trait, p));
|
||||
|
||||
var fieldGranted = trait.GetType().GetFields()
|
||||
.Where(x => x.HasAttribute<GrantedConditionReferenceAttribute>())
|
||||
var fieldGranted = fields
|
||||
.Where(x => Utility.HasAttribute<GrantedConditionReferenceAttribute>(x))
|
||||
.SelectMany(f => LintExts.GetFieldValues(trait, f));
|
||||
|
||||
var propertyGranted = trait.GetType().GetProperties()
|
||||
.Where(x => x.HasAttribute<GrantedConditionReferenceAttribute>())
|
||||
var propertyGranted = properties
|
||||
.Where(x => Utility.HasAttribute<GrantedConditionReferenceAttribute>(x))
|
||||
.SelectMany(f => LintExts.GetPropertyValues(trait, f));
|
||||
|
||||
foreach (var c in fieldConsumed.Concat(propertyConsumed))
|
||||
|
||||
@@ -45,10 +45,10 @@ namespace OpenRA.Mods.Common.Lint
|
||||
{
|
||||
foreach (var traitInfo in actorInfo.Value.TraitInfos<TraitInfo>())
|
||||
{
|
||||
var fields = traitInfo.GetType().GetFields();
|
||||
var fields = Utility.GetFields(traitInfo.GetType());
|
||||
foreach (var field in fields)
|
||||
{
|
||||
var cursorReference = field.GetCustomAttributes<CursorReferenceAttribute>(true).FirstOrDefault();
|
||||
var cursorReference = Utility.GetCustomAttributes<CursorReferenceAttribute>(field, true).FirstOrDefault();
|
||||
if (cursorReference == null)
|
||||
continue;
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Lint
|
||||
{
|
||||
foreach (var traitInfo in actorInfo.Value.TraitInfos<TraitInfo>())
|
||||
{
|
||||
var fields = traitInfo.GetType().GetFields().Where(f => f.HasAttribute<LocomotorReferenceAttribute>());
|
||||
var fields = Utility.GetFields(traitInfo.GetType()).Where(f => Utility.HasAttribute<LocomotorReferenceAttribute>(f));
|
||||
foreach (var field in fields)
|
||||
{
|
||||
var locomotors = LintExts.GetFieldValues(traitInfo, field);
|
||||
|
||||
@@ -35,11 +35,11 @@ namespace OpenRA.Mods.Common.Lint
|
||||
{
|
||||
foreach (var traitInfo in actorInfo.Value.TraitInfos<TraitInfo>())
|
||||
{
|
||||
var fields = traitInfo.GetType().GetFields();
|
||||
foreach (var field in fields.Where(x => x.HasAttribute<NotificationReferenceAttribute>()))
|
||||
var fields = Utility.GetFields(traitInfo.GetType());
|
||||
foreach (var field in fields.Where(x => Utility.HasAttribute<NotificationReferenceAttribute>(x)))
|
||||
{
|
||||
string type = null;
|
||||
var notificationReference = field.GetCustomAttributes<NotificationReferenceAttribute>(true).First();
|
||||
var notificationReference = Utility.GetCustomAttributes<NotificationReferenceAttribute>(field, true).First();
|
||||
if (!string.IsNullOrEmpty(notificationReference.NotificationTypeFieldName))
|
||||
{
|
||||
var fieldInfo = fields.First(f => f.Name == notificationReference.NotificationTypeFieldName);
|
||||
|
||||
@@ -39,10 +39,10 @@ namespace OpenRA.Mods.Common.Lint
|
||||
{
|
||||
foreach (var traitInfo in actorInfo.Value.TraitInfos<TraitInfo>())
|
||||
{
|
||||
var fields = traitInfo.GetType().GetFields();
|
||||
var fields = Utility.GetFields(traitInfo.GetType());
|
||||
foreach (var field in fields)
|
||||
{
|
||||
var paletteReference = field.GetCustomAttributes<PaletteReferenceAttribute>(true).FirstOrDefault();
|
||||
var paletteReference = Utility.GetCustomAttributes<PaletteReferenceAttribute>(field, true).FirstOrDefault();
|
||||
if (paletteReference == null)
|
||||
continue;
|
||||
|
||||
@@ -82,10 +82,10 @@ namespace OpenRA.Mods.Common.Lint
|
||||
if (projectileInfo == null)
|
||||
continue;
|
||||
|
||||
var fields = projectileInfo.GetType().GetFields();
|
||||
var fields = Utility.GetFields(projectileInfo.GetType());
|
||||
foreach (var field in fields)
|
||||
{
|
||||
var paletteReference = field.GetCustomAttributes<PaletteReferenceAttribute>(true).FirstOrDefault();
|
||||
var paletteReference = Utility.GetCustomAttributes<PaletteReferenceAttribute>(field, true).FirstOrDefault();
|
||||
if (paletteReference == null)
|
||||
continue;
|
||||
|
||||
@@ -126,10 +126,10 @@ namespace OpenRA.Mods.Common.Lint
|
||||
var tilesetPalettes = new List<(string Tileset, string PaletteName)>();
|
||||
foreach (var traitInfo in worldActorInfo.TraitInfos<TraitInfo>())
|
||||
{
|
||||
var fields = traitInfo.GetType().GetFields();
|
||||
var fields = Utility.GetFields(traitInfo.GetType());
|
||||
foreach (var field in fields)
|
||||
{
|
||||
var paletteDefinition = field.GetCustomAttributes<PaletteDefinitionAttribute>(true).FirstOrDefault();
|
||||
var paletteDefinition = Utility.GetCustomAttributes<PaletteDefinitionAttribute>(field, true).FirstOrDefault();
|
||||
if (paletteDefinition == null)
|
||||
continue;
|
||||
|
||||
|
||||
@@ -47,10 +47,10 @@ namespace OpenRA.Mods.Common.Lint
|
||||
var traitName = traitInfo.GetType().Name;
|
||||
traitName = traitName.Remove(traitName.Length - 4);
|
||||
|
||||
var fields = traitInfo.GetType().GetFields();
|
||||
var fields = Utility.GetFields(traitInfo.GetType());
|
||||
foreach (var field in fields)
|
||||
{
|
||||
var sequenceReference = field.GetCustomAttributes<SequenceReferenceAttribute>(true).FirstOrDefault();
|
||||
var sequenceReference = Utility.GetCustomAttributes<SequenceReferenceAttribute>(field, true).FirstOrDefault();
|
||||
if (sequenceReference == null)
|
||||
continue;
|
||||
|
||||
@@ -103,10 +103,10 @@ namespace OpenRA.Mods.Common.Lint
|
||||
if (projectileInfo == null)
|
||||
continue;
|
||||
|
||||
var fields = projectileInfo.GetType().GetFields();
|
||||
var fields = Utility.GetFields(projectileInfo.GetType());
|
||||
foreach (var field in fields)
|
||||
{
|
||||
var sequenceReference = field.GetCustomAttributes<SequenceReferenceAttribute>(true).FirstOrDefault();
|
||||
var sequenceReference = Utility.GetCustomAttributes<SequenceReferenceAttribute>(field, true).FirstOrDefault();
|
||||
if (sequenceReference == null)
|
||||
continue;
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace OpenRA.Mods.Common.Lint
|
||||
const BindingFlags Flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly;
|
||||
while (type != null)
|
||||
{
|
||||
if (((MemberInfo[])type.GetFields(Flags)).Concat(type.GetProperties(Flags)).Any(x => x.HasAttribute<SyncAttribute>()))
|
||||
if (((MemberInfo[])type.GetFields(Flags)).Concat(type.GetProperties(Flags)).Any(x => Utility.HasAttribute<SyncAttribute>(x)))
|
||||
return true;
|
||||
type = type.BaseType;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common.Lint
|
||||
{
|
||||
foreach (var traitInfo in actorInfo.Value.TraitInfos<TraitInfo>())
|
||||
{
|
||||
var traitLocation = traitInfo.GetType().GetCustomAttributes<TraitLocationAttribute>(true).FirstOrDefault();
|
||||
var traitLocation = Utility.GetCustomAttributes<TraitLocationAttribute>(traitInfo.GetType(), true).FirstOrDefault();
|
||||
if (traitLocation == null)
|
||||
continue;
|
||||
|
||||
|
||||
@@ -39,10 +39,10 @@ namespace OpenRA.Mods.Common.Lint
|
||||
{
|
||||
foreach (var traitInfo in actorInfo.Value.TraitInfos<TraitInfo>())
|
||||
{
|
||||
var fields = traitInfo.GetType().GetFields();
|
||||
var fields = Utility.GetFields(traitInfo.GetType());
|
||||
foreach (var field in fields)
|
||||
{
|
||||
var translationReference = field.GetCustomAttributes<TranslationReferenceAttribute>(true).FirstOrDefault();
|
||||
var translationReference = Utility.GetCustomAttributes<TranslationReferenceAttribute>(field, true).FirstOrDefault();
|
||||
if (translationReference == null)
|
||||
continue;
|
||||
|
||||
@@ -72,7 +72,7 @@ namespace OpenRA.Mods.Common.Lint
|
||||
|
||||
foreach (var modType in modData.ObjectCreator.GetTypes())
|
||||
{
|
||||
foreach (var fieldInfo in modType.GetFields(Binding).Where(m => m.HasAttribute<TranslationReferenceAttribute>()))
|
||||
foreach (var fieldInfo in modType.GetFields(Binding).Where(m => Utility.HasAttribute<TranslationReferenceAttribute>(m)))
|
||||
{
|
||||
if (fieldInfo.FieldType != typeof(string))
|
||||
emitError($"Translation attribute on non string field {fieldInfo.Name}.");
|
||||
@@ -87,7 +87,7 @@ namespace OpenRA.Mods.Common.Lint
|
||||
if (!translation.HasMessage(key))
|
||||
emitError($"{key} not present in {language} translation.");
|
||||
|
||||
var translationReference = fieldInfo.GetCustomAttributes<TranslationReferenceAttribute>(true)[0];
|
||||
var translationReference = Utility.GetCustomAttributes<TranslationReferenceAttribute>(fieldInfo, true)[0];
|
||||
if (translationReference.RequiredVariableNames != null && translationReference.RequiredVariableNames.Length > 0)
|
||||
referencedVariablesPerKey.GetOrAdd(key, translationReference.RequiredVariableNames);
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common.Lint
|
||||
{
|
||||
foreach (var traitInfo in actorInfo.Value.TraitInfos<TraitInfo>())
|
||||
{
|
||||
var fields = traitInfo.GetType().GetFields().Where(f => f.HasAttribute<VoiceSetReferenceAttribute>());
|
||||
var fields = Utility.GetFields(traitInfo.GetType()).Where(f => Utility.HasAttribute<VoiceSetReferenceAttribute>(f));
|
||||
foreach (var field in fields)
|
||||
{
|
||||
var voiceSets = LintExts.GetFieldValues(traitInfo, field);
|
||||
@@ -57,7 +57,7 @@ namespace OpenRA.Mods.Common.Lint
|
||||
|
||||
foreach (var traitInfo in actorInfo.TraitInfos<TraitInfo>())
|
||||
{
|
||||
var fields = traitInfo.GetType().GetFields().Where(f => f.HasAttribute<VoiceReferenceAttribute>());
|
||||
var fields = Utility.GetFields(traitInfo.GetType()).Where(f => Utility.HasAttribute<VoiceReferenceAttribute>(f));
|
||||
foreach (var field in fields)
|
||||
{
|
||||
var voices = LintExts.GetFieldValues(traitInfo, field);
|
||||
|
||||
Reference in New Issue
Block a user