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 } } } }