4 using SharpYaml.Serialization;
5 using SharpYaml.Serialization.Serializers;
6 using SiliconStudio.Core.Reflection;
10 namespace SiliconStudio.Core.Yaml
18 private readonly
bool keepOnlySealedOverrides;
21 private const char PostFixSealed =
'!';
23 private const char PostFixNew =
'*';
25 private const string PostFixNewSealed =
"*!";
27 private const string PostFixNewSealedAlt =
"!*";
30 public OverrideKeyMappingTransform(
ITypeDescriptorFactory typeDescriptorFactory,
bool keepOnlySealedOverrides)
32 if (typeDescriptorFactory == null)
throw new ArgumentNullException(
"typeDescriptorFactory");
33 this.typeDescriptorFactory = typeDescriptorFactory;
34 this.keepOnlySealedOverrides = keepOnlySealedOverrides;
37 public override void WriteMemberName(ref ObjectContext objectContext, SharpYaml.Serialization.IMemberDescriptor member,
string memberName)
44 if (customDescriptor == null)
46 customDescriptor = typeDescriptorFactory.Find(objectContext.Instance.GetType())[memberName];
47 member.Tag = customDescriptor;
50 if (customDescriptor != null)
52 var overrideType = objectContext.Instance.GetOverride(customDescriptor);
53 if (!keepOnlySealedOverrides && (overrideType &
OverrideType.New) != 0)
55 memberName += PostFixNew;
59 memberName += PostFixSealed;
64 base.WriteMemberName(ref objectContext, member, memberName);
67 public override string ReadMemberName(ref ObjectContext objectContext,
string memberName)
69 var newMemberName = memberName.Trim(PostFixSealed, PostFixNew);
71 if (newMemberName.Length != memberName.Length)
73 var overrideType = OverrideType.Base;
74 if (memberName.Contains(PostFixNewSealed) || memberName.EndsWith(PostFixNewSealedAlt))
76 overrideType = OverrideType.New | OverrideType.Sealed;
78 else if (memberName.EndsWith(PostFixNew))
80 overrideType = OverrideType.New;
82 else if (memberName.EndsWith(PostFixSealed))
84 overrideType = OverrideType.Sealed;
90 if (keepOnlySealedOverrides && overrideType.IsSealed())
92 overrideType = OverrideType.Base | OverrideType.Sealed;
95 var objectType = objectContext.Instance.GetType();
96 if (cachedDescriptor == null || cachedDescriptor.Type != objectType)
98 cachedDescriptor = typeDescriptorFactory.Find(objectType);
100 var memberDescriptor = cachedDescriptor[newMemberName];
101 objectContext.Instance.SetOverride(memberDescriptor, overrideType);
105 return base.ReadMemberName(ref objectContext, newMemberName);
Describe a member of an object.
Provides access members of a type.
OverrideType
A Type of override used on a member value.
A factory to create an instance of a ITypeDescriptor