Пример #1
0
        protected virtual void OnRead(IXmlCodeReader reader, XmlNode node)
        {
            //get local variable from method component list based on _memberId
            XmlNode varNode = DesignUtil.GetMethodVariableNode(node.OwnerDocument.DocumentElement, _memberId);

            if (varNode == null)
            {
                LocalVariable v = LocalVariable.GetUnsavedLocalVariable(_classId, _memberId);
                if (v == null)
                {
                    //it can be a variable in an exception handler
                    //get method id
                    UInt32  methodId = 0;
                    XmlNode mn       = node;
                    while (mn != null)
                    {
                        methodId = XmlUtil.GetAttributeUInt(mn, XmlTags.XMLATT_ScopeId);
                        if (methodId != 0)
                        {
                            break;
                        }
                        mn = mn.ParentNode;
                    }
                    if (methodId != 0)
                    {
                        ClassPointer root = ((XmlObjectReader)reader).ObjectList.GetTypedData <ClassPointer>();
                        MethodClass  mc   = root.GetCustomMethodById(methodId);
                        if (mc != null)
                        {
                            v = mc.GetLocalVariable(_memberId);
                        }
                    }
                    else
                    {
                        DesignUtil.WriteToOutputWindowAndLog("Error reading local variable. Variable node not found [{0},{1}]", _classId, _memberId);
                    }
                }
                if (v != null)
                {
                    _name        = v.Name;
                    _type        = v.ClassType;
                    _owner       = v._owner;
                    _instance    = v._instance;
                    _nameChecker = v._nameChecker;
                    _debug       = v._debug;
                }
            }
            else
            {
                _name = XmlUtil.GetNameAttribute(varNode);
                Type t = XmlUtil.GetLibTypeAttribute(varNode);
                if (t != null)
                {
                    if (t.Equals(typeof(ParameterClass)))
                    {
                        MethodClass mc = _owner as MethodClass;
                        if (mc != null)
                        {
                            _type = (DataTypePointer)Activator.CreateInstance(t, mc);
                        }
                    }
                    else
                    {
                        _type = (DataTypePointer)Activator.CreateInstance(t);
                    }
                    reader.ReadObjectFromXmlNode(varNode, _type, t, this);
                }
                else
                {
                    UInt32 id = XmlUtil.GetAttributeUInt(node, XmlTags.XMLATT_ComponentID);
                    if (id != 0)
                    {
                        //try to get it from exception handler of a method
                        ClassPointer  root = ClassPointer.CreateClassPointer(((XmlObjectReader)reader).ObjectList);
                        LocalVariable v    = root.GetLocalVariable(id);
                        if (v != null)
                        {
                            _name        = v.Name;
                            _type        = v.ClassType;
                            _owner       = v._owner;
                            _instance    = v._instance;
                            _nameChecker = v._nameChecker;
                            _debug       = v._debug;
                        }
                    }
                    else
                    {
#if DEBUG
                        throw new DesignerException("Error reading local variable from class [{0}]. XPath:[{1}]", reader.ClassId, XmlUtil.GetPath(node));
#endif
                    }
                }
            }
        }