2008-01-04 Ivan N. Zlatev <contact@i-nz.net>
authorIvan Zlatev <ivan@ivanz.com>
Fri, 4 Jan 2008 00:00:11 +0000 (00:00 -0000)
committerIvan Zlatev <ivan@ivanz.com>
Fri, 4 Jan 2008 00:00:11 +0000 (00:00 -0000)
        * CodeDomComponentSerializationService.cs: implemented.
        * ComponentCodeDomSerializer.cs, CollectionCodeDomSerializer.cs,
        CodeDomSerializerBase.cs, CodeDomSerializer.cs,
        EventCodeDomSerializer.cs, RootCodeDomSerializer.cs,
        PropertyCodeDomSerializer.cs:
         - Change the serialization process logic not to require an
         ExpressionContext for full serialization of a component/instance.
         - Provide statement ordering hints for the RootCodeDomSerializer.
        * DesignerSerializationManager.cs: try-catch around
        * CreateInstance just in case.

svn path=/trunk/mcs/; revision=92221

mcs/class/System.Design/System.ComponentModel.Design.Serialization/Changelog
mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomComponentSerializationService.cs
mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializer.cs
mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializerBase.cs
mcs/class/System.Design/System.ComponentModel.Design.Serialization/CollectionCodeDomSerializer.cs
mcs/class/System.Design/System.ComponentModel.Design.Serialization/ComponentCodeDomSerializer.cs
mcs/class/System.Design/System.ComponentModel.Design.Serialization/DesignerSerializationManager.cs
mcs/class/System.Design/System.ComponentModel.Design.Serialization/EventCodeDomSerializer.cs
mcs/class/System.Design/System.ComponentModel.Design.Serialization/PropertyCodeDomSerializer.cs
mcs/class/System.Design/System.ComponentModel.Design.Serialization/RootCodeDomSerializer.cs

index c8db20f01465c166c1a07719458864a42fe55b33..f3948a5603addb465f5eff1e24d369184254661b 100644 (file)
@@ -1,3 +1,16 @@
+2008-01-04  Ivan N. Zlatev  <contact@i-nz.net>
+
+       * CodeDomComponentSerializationService.cs: implemented.
+       * ComponentCodeDomSerializer.cs, CollectionCodeDomSerializer.cs, 
+       CodeDomSerializerBase.cs, CodeDomSerializer.cs, 
+       EventCodeDomSerializer.cs, RootCodeDomSerializer.cs, 
+       PropertyCodeDomSerializer.cs:
+        - Change the serialization process logic not to require an 
+        ExpressionContext for full serialization of a component/instance.
+        - Provide statement ordering hints for the RootCodeDomSerializer.
+       * DesignerSerializationManager.cs: try-catch around CreateInstance 
+       just in case. 
+
 2008-01-04  Ivan N. Zlatev  <contact@i-nz.net>
 
        * CodeDomDesignerLoader.cs: Check for duplicate names in
index 3ffea8d6de463a8c1b256408bd441f65e5e46ff5..358e6e20f94017b4f0473332568399c54a04ac9c 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-// STUBS ONLY
-
 #if NET_2_0
 
 using System;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
 using System.ComponentModel;
+using System.ComponentModel.Design.Serialization;
 using System.Collections;
+using System.Collections.Generic;
 using System.IO;
 
 namespace System.ComponentModel.Design.Serialization
 {
+       // A ComponentSerializationService that uses a CodeDomSerializationStore 
+       // to serialize Components and MemberDescriptors to CodeStatement and CodeStatementCollection
+       //
        public sealed class CodeDomComponentSerializationService : ComponentSerializationService
        {
+               [Serializable]
+               private class CodeDomSerializationStore : SerializationStore
+               {
+
+                       [Serializable]
+                       private class Entry
+                       {
+                               private bool _isSerialized;
+                               private object _serialized;
+                               private object _deserialized;
+                               private bool _isDeserialized;
+                               private bool _absolute;
+                               private string _name;
+
+                               protected Entry ()
+                               {
+                               }
+
+                               public Entry (string name)
+                               {
+                                       if (name == null)
+                                               throw new ArgumentNullException ("name");
+                                       _name = name;
+                                       _isDeserialized = true;
+                                       _isSerialized = false;
+                                       _absolute = false;
+                               }
+
+                               public bool IsSerialized {
+                                       get { return _isSerialized; }
+                                       set { _isSerialized = value; }
+                               }
+
+                               public object Serialized {
+                                       get { return _serialized; }
+                                       set { 
+                                               _serialized = value;
+                                               _isSerialized = true;
+                                       }
+                               }
+
+                               public bool IsDeserialized {
+                                       get { return _isDeserialized; }
+                                       set { _isDeserialized = value; }
+                               }
+
+                               public object Deserialized {
+                                       get { return _deserialized; }
+                                       set { 
+                                               _deserialized = value;
+                                               _isDeserialized = true;
+                                       }
+                               }
+
+                               public bool Absolute {
+                                       get { return _absolute; }
+                                       set { _absolute = value; }
+                               }
+
+                               public string Name {
+                                       get { return _name; }
+                                       set { _name = value; }
+                               }
+                       }
+
+                       [Serializable]
+                       private class MemberEntry : Entry
+                       {
+                               private MemberDescriptor _descriptor;
+
+                               protected MemberEntry ()
+                               {
+                               }
+
+                               public MemberEntry (MemberDescriptor descriptor)
+                               {
+                                       if (descriptor == null)
+                                               throw new ArgumentNullException ("descriptor");
+                                       _descriptor = descriptor;
+                                       base.Name = descriptor.Name;
+                               }
+
+                               public MemberDescriptor Descriptor {
+                                       get { return _descriptor; }
+                                       set { _descriptor = value; }
+                               }
+                       }
+
+                       [Serializable]
+                       private class ObjectEntry : Entry
+                       {
+                               private Type _type;
+                               [NonSerialized]
+                               private object _instance;
+                               private Dictionary<string,MemberEntry> _members;
+                               private bool _entireObject;
+
+                               protected ObjectEntry ()
+                               {
+                               }
+
+                               public ObjectEntry (object instance, string name) : base (name)
+                               {
+                                       if (instance == null)
+                                               throw new ArgumentNullException ("instance");
+                                       _instance = instance;
+                                       _type = instance.GetType ();
+                                       _entireObject = false;
+                               }
+
+                               public Type Type {
+                                       get { return _type; }
+                               }
+
+                               public object Instance {
+                                       get { return _instance; }
+                                       set { 
+                                               _instance = value;
+                                               if (value != null)
+                                                       _type = value.GetType ();
+                                       }
+                               }
+
+                               public Dictionary<string,MemberEntry> Members {
+                                       get { 
+                                               if (_members == null)
+                                                       _members = new Dictionary <string, MemberEntry> ();
+                                               return _members; 
+                                       }
+                                       set { _members = value; }
+                               }
+
+                               public bool EntireObject {
+                                       get { return _entireObject; }
+                                       set { _entireObject = value; }
+                               }
+                       }
+
+                       private bool _closed;
+                       private Dictionary <string, ObjectEntry> _objects;
+                       private IServiceProvider _provider;
+                       private ICollection _errors;
+
+                       internal CodeDomSerializationStore () : this (null)
+                       {
+                       }
+
+                       internal CodeDomSerializationStore (IServiceProvider provider)
+                       {
+                               _provider = provider;
+                       }
+
+                       public override void Close () 
+                       {
+                               if (!_closed) {
+                                       Serialize (_provider);
+                                       _closed = true;
+                               }
+                       }
+
+                       internal static CodeDomSerializationStore Load (Stream stream)
+                       {
+                               return new BinaryFormatter ().Deserialize (stream) as CodeDomSerializationStore;
+                       }
+
+                       public override void Save (Stream stream) 
+                       {
+                               Close ();
+                               new BinaryFormatter ().Serialize (stream, this);
+                       }
+
+                       private void Serialize (IServiceProvider provider)
+                       {
+                               if (provider == null)
+                                       return;
+                               DesignerSerializationManager manager = provider.GetService (typeof (IDesignerSerializationManager)) as DesignerSerializationManager;
+                               if (manager == null)
+                                       return;
+
+                               using (IDisposable session = manager.CreateSession ()) {
+                                       foreach (ObjectEntry objectEntry in _objects.Values) {
+                                               if (objectEntry.EntireObject) {
+                                                       CodeDomSerializer serializer = (CodeDomSerializer) manager.GetSerializer (objectEntry.Type, 
+                                                                                                               typeof (CodeDomSerializer));
+                                                       if (serializer != null) {
+                                                               object serialized = null;
+                                                               if (objectEntry.Absolute)
+                                                                       serialized = serializer.SerializeAbsolute (manager, objectEntry.Instance);
+                                                               else
+                                                                       serialized = serializer.Serialize (manager, objectEntry.Instance);
+                                                               if (serialized != null)
+                                                                       objectEntry.Serialized = serialized;
+                                                       }
+                                               } else {
+                                                       foreach (MemberEntry memberEntry in objectEntry.Members.Values) {
+                                                               CodeDomSerializer serializer = (CodeDomSerializer) manager.GetSerializer (
+                                                                       objectEntry.Type, typeof (CodeDomSerializer));
+                                                               if (serializer != null) {
+                                                                       object serialized = null;
+                                                                       if (memberEntry.Absolute) {
+                                                                                       serialized = serializer.SerializeMemberAbsolute (manager, 
+                                                                                                                                        objectEntry.Instance, 
+                                                                                                                                        memberEntry.Descriptor);
+                                                                       } else {
+                                                                                       serialized = serializer.SerializeMember (manager,
+                                                                                                                                objectEntry.Instance, 
+                                                                                                                                memberEntry.Descriptor);
+                                                                       }
+                                                                       if (serialized != null)
+                                                                               memberEntry.Serialized = serialized;
+                                                               }
+                                                       }
+                                               }
+                                       }
+                                       _errors = manager.Errors;
+                               }
+                       }
+
+                       internal void AddObject (object instance, bool absolute)
+                       {
+                               if (_closed)
+                                       throw new InvalidOperationException ("store is closed");
+
+                               if (_objects == null)
+                                       _objects = new Dictionary <string, ObjectEntry> ();
+                               string objectName = GetName (instance);
+
+                               if (!_objects.ContainsKey (objectName)) {
+                                       ObjectEntry objectEntry = new ObjectEntry (instance, objectName);
+                                       objectEntry.Absolute = absolute;
+                                       objectEntry.EntireObject = true;
+                                       _objects[objectName] = objectEntry;
+                               }
+                       }
+
+                       internal void AddMember (object owner, MemberDescriptor member, bool absolute)
+                       {
+                               if (_closed)
+                                       throw new InvalidOperationException ("store is closed");
+                               if (member == null)
+                                       throw new ArgumentNullException ("member");
+                               if (owner == null)
+                                       throw new ArgumentNullException ("owner");
+
+                               if (_objects == null)
+                                       _objects = new Dictionary <string, ObjectEntry> ();
+                               string objectName = GetName (owner);
+
+                               if (!_objects.ContainsKey (objectName)) {
+                                       ObjectEntry objectEntry = new ObjectEntry (owner, objectName);
+                                       MemberEntry memberEntry = new MemberEntry (member);
+                                       memberEntry.Absolute = absolute;
+                                       objectEntry.Members[member.Name] = memberEntry;
+                                       _objects[objectName] = objectEntry;
+                               }
+                       }
+
+                       private string GetName (object value)
+                       {
+                               string name = null;
+
+                               IComponent component = value as IComponent;
+                               if (component != null) {
+                                       if (component.Site is INestedSite)
+                                               name = ((INestedSite)component.Site).FullName;
+                                       else
+                                               name = component.Site != null ? component.Site.Name : null;
+                               } else if (value is MemberDescriptor) {
+                                       name = ((MemberDescriptor) value).Name;
+                               } else {
+                                       name = value.GetHashCode ().ToString ();
+                               }
+
+                               return name;
+                       }
+
+                       internal ICollection Deserialize (IServiceProvider provider, IContainer container, 
+                                                         bool validateRecycledTypes, bool applyDefaults)
+                       {
+                               List<object> objectInstances = new List<object> ();
+
+                               if (provider == null)
+                                       return objectInstances;
+                               _provider = provider;
+
+                               DesignerSerializationManager manager = provider.GetService 
+                                       (typeof (IDesignerSerializationManager)) as DesignerSerializationManager;
+                               if (manager == null)
+                                       return objectInstances;
+
+                               bool validateRecycleBackup = manager.ValidateRecycledTypes;
+                               IContainer containerBackup = manager.Container;
+
+                               if (container != null)
+                                       manager.Container = container;
+
+                               using (IDisposable session = manager.CreateSession ()) {
+                                       ((IDesignerSerializationManager) manager).ResolveName += OnResolveInstance;
+                                       foreach (ObjectEntry entry in _objects.Values)
+                                               objectInstances.Add (DeserializeEntry (manager, entry));
+                                       ((IDesignerSerializationManager) manager).ResolveName -= OnResolveInstance;
+                                       _errors = manager.Errors;
+                               }
+
+                               manager.ValidateRecycledTypes = validateRecycleBackup;
+                               manager.Container = containerBackup;
+                               return objectInstances;
+                       }
+
+                       private void OnResolveInstance (object sender, ResolveNameEventArgs args)
+                       {
+                               if (args.Value == null && _objects != null && _objects.ContainsKey (args.Name)) {
+                                       IDesignerSerializationManager manager = _provider.GetService 
+                                               (typeof (IDesignerSerializationManager)) as IDesignerSerializationManager;
+                                       if (manager != null) {
+                                               ObjectEntry entry = _objects[args.Name];
+                                               if (entry.EntireObject)
+                                                       args.Value = DeserializeEntry (manager, entry);
+                                       }
+                               }
+                       }
+
+                       private object DeserializeEntry (IDesignerSerializationManager manager, ObjectEntry objectEntry)
+                       {
+                               object deserialized = null;
+
+                               if (objectEntry.EntireObject) {
+                                       if (objectEntry.IsDeserialized) {
+                                               deserialized = objectEntry.Deserialized;
+                                       } else {
+                                               CodeDomSerializer serializer = (CodeDomSerializer) manager.GetSerializer (objectEntry.Type, 
+                                                                                                                         typeof (CodeDomSerializer));
+                                               if (serializer != null) {
+                                                       deserialized = serializer.Deserialize (manager, objectEntry.Serialized);
+                                                       objectEntry.Deserialized = deserialized;
+                                                       // check if the name of the object has changed
+                                                       // (if it e.g clashes with another name)
+                                                       string newName = manager.GetName (deserialized);
+                                                       if (newName != objectEntry.Name)
+                                                               objectEntry.Name = newName;
+                                               }
+                                       }
+                               } else {
+                                       foreach (MemberEntry memberEntry in objectEntry.Members.Values) {
+                                               if (!memberEntry.IsDeserialized) {
+                                                       CodeDomSerializer serializer = (CodeDomSerializer) manager.GetSerializer (objectEntry.Type, 
+                                                                                                                                 typeof (CodeDomSerializer));
+                                                       if (serializer != null) {
+                                                               serializer.Deserialize (manager, memberEntry.Serialized);
+                                                               memberEntry.IsDeserialized = true;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               return deserialized;
+                       }
+
+                       public override ICollection Errors {
+                               get {
+                                       if (_errors == null)
+                                               _errors = new object[0];
+                                       return _errors;
+                               }
+                       }
+               } // CodeDomSerializationStore
+
+               private IServiceProvider _provider;
 
                public CodeDomComponentSerializationService () : this (null)
                {
@@ -47,51 +420,90 @@ namespace System.ComponentModel.Design.Serialization
 
                public CodeDomComponentSerializationService (IServiceProvider provider)
                {
+                       _provider = provider;
                }
 
                public override SerializationStore CreateStore ()
                {
-                       throw new NotImplementedException ();
+                       return new CodeDomSerializationStore (_provider);
+               }
+
+               public override SerializationStore LoadStore (Stream stream)
+               {
+                       return CodeDomSerializationStore.Load (stream);
                }
 
                public override ICollection Deserialize (SerializationStore store)
                {
-                       throw new NotImplementedException ();
+                       return this.Deserialize (store, null);
                }
 
                public override ICollection Deserialize (SerializationStore store, IContainer container)
                {
-                       throw new NotImplementedException ();
+                       return DeserializeCore (store, container, true, true);
                }
 
-               public override SerializationStore LoadStore (Stream stream)
+               public override void DeserializeTo (SerializationStore store, IContainer container, bool validateRecycledTypes, bool applyDefaults)
                {
-                       throw new NotImplementedException ();
+                       DeserializeCore (store, container, validateRecycledTypes, applyDefaults);
+               }
+
+               private ICollection DeserializeCore (SerializationStore store, IContainer container, bool validateRecycledTypes, 
+                                                    bool applyDefaults)
+               {
+                       CodeDomSerializationStore codeDomStore = store as CodeDomSerializationStore;
+                       if (codeDomStore == null)
+                               throw new InvalidOperationException ("store type unsupported");
+                       return codeDomStore.Deserialize (_provider, container, validateRecycledTypes, applyDefaults);
                }
 
                public override void Serialize (SerializationStore store, object value)
                {
-                       throw new NotImplementedException ();
+                       SerializeCore (store, value, false);
                }
 
                public override void SerializeAbsolute (SerializationStore store, object value)
                {
-                       throw new NotImplementedException ();
+                       SerializeCore (store, value, true);
                }
 
                public override void SerializeMember (SerializationStore store, object owningObject, MemberDescriptor member)
                {
-                       throw new NotImplementedException ();
+                       SerializeMemberCore (store, owningObject, member, false);
                }
 
                public override void SerializeMemberAbsolute (SerializationStore store, object owningObject, MemberDescriptor member)
                {
-                       throw new NotImplementedException ();
+                       SerializeMemberCore (store, owningObject, member, true);
                }
 
-               public override void DeserializeTo (SerializationStore store, IContainer container, bool validateRecycledTypes, bool applyDefaults)
+               private void SerializeCore (SerializationStore store, object value, bool absolute)
+               {
+                       if (value == null)
+                               throw new ArgumentNullException ("value");
+                       if (store == null)
+                               throw new ArgumentNullException ("store");
+
+                       CodeDomSerializationStore codeDomStore = store as CodeDomSerializationStore;
+                       if (store == null)
+                               throw new InvalidOperationException ("store type unsupported");
+
+                       codeDomStore.AddObject (value, absolute);
+               }
+
+               private void SerializeMemberCore (SerializationStore store, object owningObject, MemberDescriptor member, bool absolute)
                {
-                       throw new NotImplementedException ();
+                       if (member == null)
+                               throw new ArgumentNullException ("member");
+                       if (owningObject == null)
+                               throw new ArgumentNullException ("owningObject");
+                       if (store == null)
+                               throw new ArgumentNullException ("store");
+
+                       CodeDomSerializationStore codeDomStore = store as CodeDomSerializationStore;
+                       if (codeDomStore == null)
+                               throw new InvalidOperationException ("store type unsupported");
+                       codeDomStore.AddMember (owningObject, member, absolute);
                }
        }
 }
index 775ee312ced626f53857b5a34ddb7ca577640aad..bcd20768fa808bf52faa34cdcafd72e44a7e262d 100644 (file)
@@ -67,27 +67,24 @@ namespace System.ComponentModel.Design.Serialization
                        if (manager == null)
                                throw new ArgumentNullException ("manager");
 
+                       object serialized = null;
                        bool isComplete = false;
                        CodeExpression createExpr = base.SerializeCreationExpression (manager, value, out isComplete);
-                       if (!isComplete) {
-                               ExpressionContext context = manager.Context[typeof (ExpressionContext)] as ExpressionContext;
-                               if (context != null && context.PresetValue == value) {
+                       if (createExpr != null) {
+                               if (isComplete) {
+                                       serialized = createExpr;
+                               } else {
                                        CodeStatementCollection statements = new CodeStatementCollection ();
-                                       if (createExpr != null) {
-                                               statements.Add (new CodeAssignStatement (context.Expression, createExpr));
-                                               CodeExpression expression = base.GetExpression (manager, value);
-                                               if (expression == null)
-                                                       base.SetExpression (manager, value, createExpr);
-                                       }
                                        base.SerializeProperties (manager, statements, value, new Attribute[0]);
                                        base.SerializeEvents (manager, statements, value, new Attribute[0]);
+                                       serialized = statements;
                                }
+                               base.SetExpression (manager, value, createExpr);
                        }
-
-                       return createExpr;
+                       return serialized;
                }
 
-        [Obsolete ("This method has been deprecated. Use SerializeToExpression or GetExpression instead.")] 
+               [Obsolete ("This method has been deprecated. Use SerializeToExpression or GetExpression instead.")] 
                protected CodeExpression SerializeToReferenceExpression (IDesignerSerializationManager manager, object value)
                {
                        return base.SerializeToExpression (manager, value);
@@ -105,7 +102,7 @@ namespace System.ComponentModel.Design.Serialization
                }
 
                public virtual CodeStatementCollection SerializeMember (IDesignerSerializationManager manager, 
-                                                                                                                               object owningobject, MemberDescriptor member)
+                                                                       object owningobject, MemberDescriptor member)
                {
                        if (member == null)
                                throw new ArgumentNullException ("member");
@@ -125,8 +122,6 @@ namespace System.ComponentModel.Design.Serialization
                                base.SetExpression (manager, owningobject, expression);
                        }
 
-                       manager.Context.Push (new ExpressionContext (expression, expression.GetType (), null, owningobject));
-
                        if (member is PropertyDescriptor)
                                base.SerializeProperty (manager, statements, owningobject, (PropertyDescriptor) member);
                        if (member is EventDescriptor)
@@ -138,7 +133,7 @@ namespace System.ComponentModel.Design.Serialization
                }
 
                public virtual CodeStatementCollection SerializeMemberAbsolute (IDesignerSerializationManager manager, 
-                                                                                                                                               object owningobject, MemberDescriptor member)
+                                                                               object owningobject, MemberDescriptor member)
                {
                        if (member == null)
                                throw new ArgumentNullException ("member");
index 6f1698ca3710a112882089596591e65cb181a8b6..e77df748f7e9e8dc08e3f69ea6ab22a3f3befe85 100644 (file)
@@ -280,17 +280,13 @@ namespace System.ComponentModel.Design.Serialization
                                expression = new CodeFieldReferenceExpression (target, member.Name);
                        } else if (member is MethodInfo) {
                                CodeMethodInvokeExpression methodInvoke = new CodeMethodInvokeExpression (target, member.Name);
-                               manager.Context.Push (new ExpressionContext (methodInvoke, methodInvoke.GetType (), null, null));
                                if (descriptor.Arguments != null && descriptor.Arguments.Count > 0)
                                        methodInvoke.Parameters.AddRange (SerializeParameters (manager, descriptor.Arguments));
-                               manager.Context.Pop ();
                                expression = methodInvoke;
                        } else if (member is ConstructorInfo) {
                                CodeObjectCreateExpression createExpr = new CodeObjectCreateExpression (member.DeclaringType);
-                               manager.Context.Push (new ExpressionContext (createExpr, createExpr.GetType (), null, null));
                                if (descriptor.Arguments != null && descriptor.Arguments.Count > 0)
                                        createExpr.Parameters.AddRange (SerializeParameters (manager, descriptor.Arguments));
-                               manager.Context.Pop ();
                                expression = createExpr;
                        }
 
index 0e17ca8d0da698fbc58c7d0ebb972151e85c82b1..8e67470bb33dfc04aef05f721000af5d37479bfb 100644 (file)
@@ -81,7 +81,7 @@ namespace System.ComponentModel.Design.Serialization
                }
 
                protected virtual object SerializeCollection (IDesignerSerializationManager manager, CodeExpression targetExpression, 
-                                                                                                         Type targetType, ICollection originalCollection, ICollection valuesToSerialize)
+                                                             Type targetType, ICollection originalCollection, ICollection valuesToSerialize)
                {
                        if (valuesToSerialize == null)
                                throw new ArgumentNullException ("valuesToSerialize");
@@ -115,17 +115,15 @@ namespace System.ComponentModel.Design.Serialization
                        CodeStatementCollection statements = new CodeStatementCollection ();
 
                        foreach (object value in valuesToSerialize) {
+
                                CodeMethodInvokeExpression methodInvoke = new CodeMethodInvokeExpression ();
                                methodInvoke.Method = new CodeMethodReferenceExpression (targetExpression, "Add");
 
-                               manager.Context.Push (new ExpressionContext (methodInvoke, methodInvoke.GetType (), null, originalCollection));
                                CodeExpression expression = base.SerializeToExpression (manager, value);
-                               if (expression != null)
+                               if (expression != null) {
                                        methodInvoke.Parameters.AddRange (new CodeExpression[] { expression });
-                               manager.Context.Pop ();
-
-                               if (methodInvoke != null)
                                        statements.Add (methodInvoke);
+                               }
                        }
 
                        return statements;
index cc418460b48b3b4dc55c14ffc95facff8f306316..aed8e0f9cc064630ef559b66205ef49f56210ca5 100644 (file)
@@ -59,12 +59,13 @@ namespace System.ComponentModel.Design.Serialization
                        if (rootContext != null && rootContext.Value == value)
                                return rootContext.Expression;
 
+                       CodeStatementCollection statements = new CodeStatementCollection ();
+
                        if (((IComponent)value).Site == null) {
                                ReportError (manager, "Component of type '" + value.GetType().Name + "' not sited");
-                               return null;
+                               return statements;
                        }
 
-                       object serialized = null;
                        // the trick with the nested components is that GetName will return the full name
                        // e.g splitter1.Panel1 and thus the code below will create a reference to that.
                        // 
@@ -76,36 +77,39 @@ namespace System.ComponentModel.Design.Serialization
                        else
                                componentRef = new CodeFieldReferenceExpression (new CodeThisReferenceExpression () , name);
 
-                       ExpressionContext exprContext = manager.Context[typeof (ExpressionContext)] as ExpressionContext;
-                       if (exprContext != null && exprContext.PresetValue == value) {
+                       base.SetExpression (manager, value, componentRef);
+
+                       ExpressionContext context = manager.Context[typeof (ExpressionContext)] as ExpressionContext;
+                       // Perform some heuristics here. 
+                       // 
+                       // If there is an ExpressionContext of PropertyReference where PresetValue == this
+                       // partial serialization doesn't make sense, so perform full. E.g in the case of:
+                       // 
+                       // PropertyCodeDomSerializer.SerializeContentProperty and splitContainer1.*Panel1* 
+                       //
+                       if (context == null || context.PresetValue != value ||
+                           (context.PresetValue == value && (context.Expression is CodeFieldReferenceExpression ||
+                                                             context.Expression is CodePropertyReferenceExpression))) {
                                bool isComplete = true;
-                               CodeStatementCollection statements = new CodeStatementCollection ();
                                statements.Add (new CodeCommentStatement (String.Empty));
                                statements.Add (new CodeCommentStatement (name));
                                statements.Add (new CodeCommentStatement (String.Empty));
-
+       
                                // Do not serialize a creation expression for Nested components
                                //
-                               if (! (((IComponent)value).Site is INestedSite))
-                                       statements.Add (new CodeAssignStatement (componentRef, 
-                                                                                                                        base.SerializeCreationExpression (manager, value, out isComplete)));
-
-                               manager.Context.Push (new ExpressionContext (componentRef, componentRef.GetType (), null, value));
+                               if (! (((IComponent)value).Site is INestedSite)) {
+                                       CodeStatement assignment = new CodeAssignStatement (componentRef, 
+                                                                       base.SerializeCreationExpression (manager, value, 
+                                                                                                         out isComplete));
+                                       assignment.UserData["statement-order"] = "initializer";
+                                       statements.Add (assignment);
+                               }
+       
                                base.SerializeProperties (manager, statements, value, new Attribute[0]);
                                base.SerializeEvents (manager, statements, value);
-                               manager.Context.Pop ();
-
-                               serialized = statements;
-                       } else {
-                               serialized = base.GetExpression (manager, value);
-                               if (serialized == null)
-                                       serialized = componentRef;
                        }
 
-                       if (base.GetExpression (manager,value) == null)
-                               base.SetExpression (manager, value, componentRef);
-
-                       return serialized;
+                       return statements;
                }
        }
 }
index 12aee8ecdae159d316d425c607625ee7740a25e1..710d09849f575f98dd5765f9a386ac3d2dc77711 100644 (file)
@@ -260,10 +260,12 @@ namespace System.ComponentModel.Design.Serialization
                                DesignerSerializerAttribute serializerAttribute = attributes[typeof (DesignerSerializerAttribute)] as DesignerSerializerAttribute;
                                if (serializerAttribute != null && 
                                        this.GetType (serializerAttribute.SerializerBaseTypeName) == serializerType) {
-                                       serializer = Activator.CreateInstance (this.GetType (serializerAttribute.SerializerTypeName), 
-                                                                                                                  BindingFlags.CreateInstance | BindingFlags.Instance | 
-                                                                                                                  BindingFlags.Public | BindingFlags.NonPublic, 
-                                                                                                                  null, null, null);
+                                       try {
+                                               serializer = Activator.CreateInstance (this.GetType (serializerAttribute.SerializerTypeName), 
+                                                                                      BindingFlags.CreateInstance | BindingFlags.Instance | 
+                                                                                      BindingFlags.Public | BindingFlags.NonPublic, 
+                                                                                      null, null, null);
+                                       } catch {}
                                }
                                
                                if (serializer != null)
index 609241401d018a42ffbc3d6fce720ad98063d96c..5288b7c53cf392f6a8e67a216e3b328b03c4fa79 100644 (file)
@@ -50,7 +50,8 @@ namespace System.ComponentModel.Design.Serialization
                }
 
 
-               public override void Serialize (IDesignerSerializationManager manager, object value, MemberDescriptor descriptor, CodeStatementCollection statements)
+               public override void Serialize (IDesignerSerializationManager manager, object value, MemberDescriptor descriptor, 
+                                               CodeStatementCollection statements)
                {
                        if (statements == null)
                                throw new ArgumentNullException ("statements");
@@ -69,9 +70,7 @@ namespace System.ComponentModel.Design.Serialization
                                if (methodName != null) {
                                        CodeDelegateCreateExpression listener = new CodeDelegateCreateExpression (new CodeTypeReference (eventDescriptor.EventType),
                                                                                                                                                                                           _thisReference, methodName);
-                                       manager.Context.Push (new ExpressionContext (listener, listener.GetType (), null, eventDescriptor));
                                        CodeExpression targetObject = base.SerializeToExpression (manager, value);
-                                       manager.Context.Pop ();
                                        CodeEventReferenceExpression eventRef = new CodeEventReferenceExpression (targetObject, eventDescriptor.Name);
                                        statements.Add (new CodeAttachEventStatement (eventRef, listener));
                                }
index 7bfe7220a2ac702cbf35cf51a8a59cfffcc92661..d1952c6c257b32b2b521c76284bb5e879f8660d2 100644 (file)
@@ -65,7 +65,7 @@ namespace System.ComponentModel.Design.Serialization
 
 
                private void SerializeNormalProperty (IDesignerSerializationManager manager, 
-                                                                                         object component, PropertyDescriptor descriptor, CodeStatementCollection statements)
+                                                     object instance, PropertyDescriptor descriptor, CodeStatementCollection statements)
                {
                        CodeAssignStatement assignment = new CodeAssignStatement ();
 
@@ -74,34 +74,33 @@ namespace System.ComponentModel.Design.Serialization
                        ExpressionContext expression = manager.Context[typeof (ExpressionContext)] as ExpressionContext;
                        RootContext root = manager.Context[typeof (RootContext)] as RootContext;
 
-                       if (expression != null && expression.PresetValue == component && expression.Expression != null) {
+                       if (expression != null && expression.PresetValue == instance && expression.Expression != null) {
                                leftSide = new CodePropertyReferenceExpression (expression.Expression, descriptor.Name);
-                       } else if (root != null && root.Value == component) {
+                       } else if (root != null && root.Value == instance) {
                                leftSide = new CodePropertyReferenceExpression (root.Expression, descriptor.Name);
                        } else {
                                propRef = new CodePropertyReferenceExpression ();
                                propRef.PropertyName =  descriptor.Name;
-                               propRef.TargetObject = TryGetCachedExpression (manager, component, propRef);
+                               propRef.TargetObject = base.SerializeToExpression (manager, instance);
                                leftSide = propRef;
                        }
 
                        CodeExpression rightSide = null;
 
-                       MemberRelationship relationship = GetRelationship (manager, component, descriptor);
+                       MemberRelationship relationship = GetRelationship (manager, instance, descriptor);
                        if (!relationship.IsEmpty) {
                                propRef = new CodePropertyReferenceExpression ();
                                propRef.PropertyName = relationship.Member.Name;
-                               propRef.TargetObject = TryGetCachedExpression (manager, relationship.Owner, propRef);
+                               propRef.TargetObject = base.SerializeToExpression (manager, relationship.Owner);
                                rightSide = propRef;
                        } else {
-                               object rightSideValue = descriptor.GetValue (component);
-                               rightSide = TryGetCachedExpression (manager, rightSideValue, null, component);
+                               rightSide = base.SerializeToExpression (manager, descriptor.GetValue (instance));
                        }
 
                        if (rightSide == null || leftSide == null) {
-                               base.ReportError (manager, "Cannot serialize " + ((IComponent)component).Site.Name + "." + descriptor.Name,
-                                                                 "Property Name: " + descriptor.Name + System.Environment.NewLine +
-                                                                 "Property Type: " + descriptor.PropertyType.Name + System.Environment.NewLine);
+                               base.ReportError (manager, "Cannot serialize " + ((IComponent)instance).Site.Name + "." + descriptor.Name,
+                                                 "Property Name: " + descriptor.Name + System.Environment.NewLine +
+                                                 "Property Type: " + descriptor.PropertyType.Name + System.Environment.NewLine);
                        } else  {
                                assignment.Left = leftSide;
                                assignment.Right = rightSide;
@@ -109,59 +108,25 @@ namespace System.ComponentModel.Design.Serialization
                        }
                }
 
-               private CodeExpression TryGetCachedExpression (IDesignerSerializationManager manager, object value)
-               {
-                       return TryGetCachedExpression (manager, value, null);
-               }
-
-               private CodeExpression TryGetCachedExpression (IDesignerSerializationManager manager, object value, 
-                                                                                                          CodeExpression parentExpression)
-               {
-                       return TryGetCachedExpression (manager, value, parentExpression, null);
-               }
-
-               private CodeExpression TryGetCachedExpression (IDesignerSerializationManager manager, object value, 
-                                                                                                          CodeExpression parentExpression, object presetValue)
-               {
-                       CodeExpression expression = null;
-                       if (value != null) // in order to support null value serialization
-                               expression = base.GetExpression (manager, value);
-                       if (expression == null) {
-                               if (parentExpression == null)
-                                       manager.Context.Push (new ExpressionContext (null, null, value, presetValue));
-                               else
-                                       manager.Context.Push (new ExpressionContext (parentExpression, parentExpression.GetType (), value, presetValue));
-                               expression = base.SerializeToExpression (manager, value);
-                               manager.Context.Pop ();
-                       }
-                       return expression;
-               }
-
-               private void SerializeContentProperty (IDesignerSerializationManager manager, object component, 
-                                                                                          PropertyDescriptor descriptor, CodeStatementCollection statements)
+               private void SerializeContentProperty (IDesignerSerializationManager manager, object instance, 
+                                                      PropertyDescriptor descriptor, CodeStatementCollection statements)
                {
                        CodePropertyReferenceExpression propRef = new CodePropertyReferenceExpression ();
                        propRef.PropertyName = descriptor.Name;
-                       object value = descriptor.GetValue (component);
+                       object propertyValue = descriptor.GetValue (instance);
 
                        ExpressionContext expressionCtx = manager.Context[typeof (ExpressionContext)] as ExpressionContext;
-                       if (expressionCtx != null && expressionCtx.PresetValue == component) {
+                       if (expressionCtx != null && expressionCtx.PresetValue == instance)
                                propRef.TargetObject = expressionCtx.Expression;
-                       } else {
-                               manager.Context.Push (new CodeStatementCollection ());
-                               propRef.TargetObject = TryGetCachedExpression (manager, component, propRef, value);
-                               manager.Context.Pop ();
-                       }
-
-                       CodeDomSerializer serializer = manager.GetSerializer (value.GetType (), typeof (CodeDomSerializer)) as CodeDomSerializer;
+                       else
+                               propRef.TargetObject = base.SerializeToExpression (manager, instance);
 
+                       CodeDomSerializer serializer = manager.GetSerializer (propertyValue.GetType (), typeof (CodeDomSerializer)) as CodeDomSerializer;
                        if (propRef.TargetObject != null && serializer != null) {
-                               // request full serialization (presetvalue == instance)
-                               //
-                               manager.Context.Push (new ExpressionContext (propRef, propRef.GetType (), component, value));
-                               object serialized = serializer.Serialize (manager, value);
+                               manager.Context.Push (new ExpressionContext (propRef, propRef.GetType (), null, propertyValue));
+                               object serialized = serializer.Serialize (manager, propertyValue);
                                manager.Context.Pop ();
-                               
+
                                CodeStatementCollection serializedStatements = serialized as CodeStatementCollection;
                                if (serializedStatements != null)
                                        statements.AddRange (serializedStatements);
index 2a49f5cbf554632d81806292c5cd5e0f8a9699df..eb36c73a42cd0c5c6e84ff9735542bae17b0a730 100644 (file)
@@ -48,9 +48,11 @@ namespace System.ComponentModel.Design.Serialization
                        private string _className;
                        private Type _classType;
                        private List<CodeMemberField> _fields;
-                       private CodeStatementCollection _preInit;
-                       private CodeStatementCollection _init;
-                       private CodeStatementCollection _postInit;
+                       private CodeStatementCollection _initializers;
+                       private CodeStatementCollection _begin;
+                       private CodeStatementCollection _default;
+                       private CodeStatementCollection _end;
+
 
                        public CodeMap (Type classType, string className)
                        {
@@ -62,10 +64,10 @@ namespace System.ComponentModel.Design.Serialization
                                _classType = classType;
                                _className = className;
                                _fields = new List<CodeMemberField> ();
-                               _preInit = new CodeStatementCollection ();
-                               _init = new CodeStatementCollection ();
-                               _init = new CodeStatementCollection ();
-                               _postInit = new CodeStatementCollection ();
+                               _initializers = new CodeStatementCollection ();
+                               _begin = new CodeStatementCollection ();
+                               _default = new CodeStatementCollection ();
+                               _end = new CodeStatementCollection ();
                        }
 
                        public void AddField (CodeMemberField field)
@@ -73,24 +75,22 @@ namespace System.ComponentModel.Design.Serialization
                                _fields.Add (field);
                        }
 
-                       public void AddPreInitStatement (CodeStatement statement)
-                       {
-                               _preInit.Add (statement);
-                       }
-
-                       public void AddInitStatement (CodeStatement statement)
-                       {
-                               _init.Add (statement);
-                       }
-
-                       public void AddInitStatements (CodeStatementCollection statements)
+                       public void Add (CodeStatementCollection statements)
                        {
-                               _init.AddRange (statements);
+                               foreach (CodeStatement statement in statements)
+                                       this.Add (statement);
                        }
 
-                       public void AddPostInitStatement (CodeStatement statement)
+                       public void Add (CodeStatement statement)
                        {
-                               _postInit.Add (statement);
+                               if (statement.UserData["statement-order"] == null)
+                                       _default.Add (statement);
+                               else if ((string)statement.UserData["statement-order"] == "initializer")
+                                       _initializers.Add (statement);
+                               else if ((string)statement.UserData["statement-order"] == "begin")
+                                       _begin.Add (statement);
+                               else if ((string)statement.UserData["statement-order"] == "end")
+                                       _end.Add (statement);
                        }
 
                        /*
@@ -100,9 +100,13 @@ namespace System.ComponentModel.Design.Serialization
 
                                        private void InitializeComponent ()
                                        {
-                                               preInit;
-                                               init;
-                                               postInit;
+                                               // statement-order:
+                                               initializer
+                                               pre-begin - e.g: // ComponentName
+                                               begin - e.g: SuspendLayout
+                                               default
+                                               end - e.g: ResumeLayout
+                                               post-end
                                        }
 
                                        private field1;
@@ -110,7 +114,7 @@ namespace System.ComponentModel.Design.Serialization
 
                                        #endregion
                                }
-            */
+                       */
 
                        public CodeTypeDeclaration GenerateClass ()
                        {
@@ -124,9 +128,10 @@ namespace System.ComponentModel.Design.Serialization
                                initialize.ReturnType = new CodeTypeReference (typeof (void));
                                initialize.Attributes = MemberAttributes.Private;
 
-                               initialize.Statements.AddRange (_preInit);
-                               initialize.Statements.AddRange (_init);
-                               initialize.Statements.AddRange (_postInit);
+                               initialize.Statements.AddRange (_initializers);
+                               initialize.Statements.AddRange (_begin);
+                               initialize.Statements.AddRange (_default);
+                               initialize.Statements.AddRange (_end);
 
                                clas.Members.Add (initialize);
 
@@ -140,10 +145,10 @@ namespace System.ComponentModel.Design.Serialization
 
                        public void Clear ()
                        {
-                               _preInit.Clear ();
-                               _init.Clear ();
-                               _postInit.Clear ();
-                               _fields.Clear ();
+                               _initializers.Clear ();
+                               _begin.Clear ();
+                               _default.Clear ();
+                               _end.Clear ();
                        }
                }
 
@@ -181,7 +186,7 @@ namespace System.ComponentModel.Design.Serialization
                        // It will check for RootContext and return that.
                        base.SerializeProperties (manager, statements, value, new Attribute[0]);
                        base.SerializeEvents (manager, statements, value, new Attribute[0]);
-                       _codeMap.AddInitStatements (statements);
+                       _codeMap.Add (statements);
 
                        manager.Context.Pop ();
                        return _codeMap.GenerateClass ();
@@ -190,11 +195,8 @@ namespace System.ComponentModel.Design.Serialization
                private void SerializeComponents (IDesignerSerializationManager manager, ICollection components, IComponent rootComponent)
                {
                        foreach (IComponent component in components) {
-                               if (!Object.ReferenceEquals (component, rootComponent)) {
-                                       manager.Context.Push (new ExpressionContext (null, null, rootComponent, component));
+                               if (!Object.ReferenceEquals (component, rootComponent))
                                        SerializeComponent (manager, component);
-                                       manager.Context.Pop ();
-                               }
                        }
                }
 
@@ -202,48 +204,20 @@ namespace System.ComponentModel.Design.Serialization
                {
                        CodeDomSerializer serializer = base.GetSerializer (manager, component) as CodeDomSerializer; // ComponentCodeDomSerializer
                        if (serializer != null) {
-                               this.Code.AddField (new CodeMemberField (component.GetType (), manager.GetName (component)));
-
-                               CodeStatementCollection statements = (CodeStatementCollection) serializer.Serialize (manager, component);
-
-                               CodeStatement ctorStatement = ExtractCtorStatement (manager, statements, component);
-                               if (ctorStatement != null)
-                                       Code.AddPreInitStatement (ctorStatement);
-                               Code.AddInitStatements (statements);
+                               this._codeMap.AddField (new CodeMemberField (component.GetType (), manager.GetName (component)));
+                               // statements can be a CodeExpression if the full serialization has been completed prior 
+                               // to this serialization call (e.g when it is requested during the serialization of another 
+                               // component.
+                               // 
+                               CodeStatementCollection statements = serializer.Serialize (manager, component) as CodeStatementCollection;
+                               if (statements != null)
+                                       _codeMap.Add (statements);
+                               CodeStatement statement = serializer.Serialize (manager, component) as CodeStatement;
+                               if (statement != null)
+                                       _codeMap.Add (statement);
                        }
                }
 
-               internal CodeMap Code {
-                       get { return _codeMap; }
-               }
-
-               // Used to remove the ctor from the statement colletion in order for the ctor statement to be moved.
-               //
-               private CodeStatement ExtractCtorStatement (IDesignerSerializationManager manager, CodeStatementCollection statements, 
-                                                                                                       object component)
-               {
-                       CodeStatement result = null;
-                       CodeAssignStatement assignment = null;
-                       CodeObjectCreateExpression ctor = null;
-                       int toRemove = -1;
-
-                       for (int i=0; i < statements.Count; i++) {
-                               assignment = statements[i] as CodeAssignStatement;
-                               if (assignment != null) {
-                                       ctor = assignment.Right as CodeObjectCreateExpression;
-                                       if (ctor != null && manager.GetType (ctor.CreateType.BaseType) == component.GetType ()) {
-                                               result = assignment;
-                                               toRemove = i;
-                                       }
-                               }
-                       }
-
-                       if (toRemove != -1)
-                               statements.RemoveAt (toRemove);
-
-                       return result;
-               }
-
                public override object Deserialize (IDesignerSerializationManager manager, object codeObject)
                {
                        CodeTypeDeclaration declaration = (CodeTypeDeclaration) codeObject;