private void ProcessElementBody(BamlElement root, BamlElement elem) { foreach (BamlRecord rec in elem.Body) { // Resolve the type & property for simple property record too. TypeDef type = null; IDnlibDef attr = null; if (rec is PropertyRecord) { var propRec = (PropertyRecord)rec; Tuple<IDnlibDef, TypeDef> attrInfo = ResolveAttribute(propRec.AttributeId); type = attrInfo.Item2; attr = attrInfo.Item1; if (attr != null) type = GetAttributeType(attr); if (attrInfo.Item1 is EventDef) { MethodDef method = root.Type.FindMethod(propRec.Value); if (method == null) context.Logger.WarnFormat("Cannot resolve method '{0}' in '{1}'.", root.Type.FullName, propRec.Value); else { var reference = new BAMLAttributeReference(method, propRec); service.AddReference(method, reference); } } if (rec is PropertyWithConverterRecord) { ProcessConverter((PropertyWithConverterRecord)rec, type); } } else if (rec is PropertyComplexStartRecord) { Tuple<IDnlibDef, TypeDef> attrInfo = ResolveAttribute(((PropertyComplexStartRecord)rec).AttributeId); type = attrInfo.Item2; attr = attrInfo.Item1; if (attr != null) type = GetAttributeType(attr); } else if (rec is ContentPropertyRecord) { Tuple<IDnlibDef, TypeDef> attrInfo = ResolveAttribute(((ContentPropertyRecord)rec).AttributeId); type = attrInfo.Item2; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) type = GetAttributeType(attr); foreach (BamlElement child in elem.Children) { child.Type = type; child.Attribute = attr; } } else if (rec is PropertyCustomRecord) { var customRec = (PropertyCustomRecord)rec; Tuple<IDnlibDef, TypeDef> attrInfo = ResolveAttribute(customRec.AttributeId); type = attrInfo.Item2; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) type = GetAttributeType(attr); if ((customRec.SerializerTypeId & 0x4000) != 0 && (customRec.SerializerTypeId & 0x4000) == 0x89) { // See BamlRecordReader.GetCustomDependencyPropertyValue. // Umm... Well, actually nothing to do, since this record only describe DP, which already won't be renamed. } } else if (rec is PropertyWithExtensionRecord) { var extRec = (PropertyWithExtensionRecord)rec; Tuple<IDnlibDef, TypeDef> attrInfo = ResolveAttribute(extRec.AttributeId); type = attrInfo.Item2; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) type = GetAttributeType(attr); // Umm... Nothing to do here too, since the value only contains either typeId/memberId, which already have references attached. } } }
void ProcessElementBody(BamlElement root, BamlElement elem) { foreach (BamlRecord rec in elem.Body) { // Resolve the type & property for simple property record too. TypeDef type = null; IDnlibDef attr = null; if (rec is PropertyRecord) { var propRec = (PropertyRecord)rec; var attrInfo = ResolveAttribute(propRec.AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (attr != null) type = GetAttributeType(attr); if (attrInfo.Item1 is EventDef) { MethodDef method = root.Type.FindMethod(propRec.Value); if (method == null) context.Logger.WarnFormat("Cannot resolve method '{0}' in '{1}'.", root.Type.FullName, propRec.Value); else { var reference = new BAMLAttributeReference(method, propRec); service.AddReference(method, reference); } } if (rec is PropertyWithConverterRecord) { ProcessConverter((PropertyWithConverterRecord)rec, type); } } else if (rec is PropertyComplexStartRecord) { var attrInfo = ResolveAttribute(((PropertyComplexStartRecord)rec).AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (attr != null) type = GetAttributeType(attr); } else if (rec is ContentPropertyRecord) { var attrInfo = ResolveAttribute(((ContentPropertyRecord)rec).AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) type = GetAttributeType(attr); foreach (BamlElement child in elem.Children) { child.Type = type; child.Attribute = attr; } } else if (rec is PropertyCustomRecord) { var customRec = (PropertyCustomRecord)rec; var attrInfo = ResolveAttribute(customRec.AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) type = GetAttributeType(attr); if ((customRec.SerializerTypeId & 0x4000) != 0 && (customRec.SerializerTypeId & 0x4000) == 0x89) { // See BamlRecordReader.GetCustomDependencyPropertyValue. // Umm... Well, actually nothing to do, since this record only describe DP, which already won't be renamed. } } else if (rec is PropertyWithExtensionRecord) { var extRec = (PropertyWithExtensionRecord)rec; var attrInfo = ResolveAttribute(extRec.AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) type = GetAttributeType(attr); if (extRec.Flags == 602) { // Static Extension // We only care about the references in user-defined assemblies, so skip built-in attributes // Also, ValueId is a resource ID, which is not implemented, so just skip it. if ((short)extRec.ValueId >= 0) { attrInfo = ResolveAttribute(extRec.ValueId); var attrTarget = attrInfo.Item1; if (attrTarget == null) { TypeSig declType; TypeDef declTypeDef; if (typeRefs.TryGetValue(attrInfo.Item2.OwnerTypeId, out declType)) declTypeDef = declType.ToBasicTypeDefOrRef().ResolveTypeDefThrow(); else { Debug.Assert((short)attrInfo.Item2.OwnerTypeId < 0); declTypeDef = things.Types((KnownTypes)(-(short)attrInfo.Item2.OwnerTypeId)); } attrTarget = declTypeDef.FindField(attrInfo.Item2.Name); } if (attrTarget != null) service.AddReference(attrTarget, new BAMLAttributeReference(attrTarget, attrInfo.Item2)); } } } else if (rec is TextRecord) { var txt = (TextRecord)rec; string value = txt.Value; if (txt is TextWithIdRecord) value = strings[((TextWithIdRecord)txt).ValueId].Value; string prefix; TypeSig sig = ResolveType(value.Trim(), out prefix); if (sig != null && context.Modules.Contains((ModuleDefMD)sig.ToBasicTypeDefOrRef().ResolveTypeDefThrow().Module)) { var reference = new BAMLConverterTypeReference(xmlnsCtx, sig, txt); AddTypeSigReference(sig, reference); } else AnalyzePropertyPath(value); } } }
void ProcessElementBody(BamlElement root, BamlElement elem) { foreach (BamlRecord rec in elem.Body) { // Resolve the type & property for simple property record too. TypeDef type = null; IDnlibDef attr = null; if (rec is PropertyRecord) { var propRec = (PropertyRecord)rec; var attrInfo = ResolveAttribute(propRec.AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (attr != null) { type = GetAttributeType(attr); } if (attrInfo.Item1 is EventDef) { MethodDef method = root.Type.FindMethod(propRec.Value); if (method == null) { context.Logger.LogFormat("WARN: Cannot resolve method '{0}' in '{1}'.", root.Type.FullName, propRec.Value); } else { var reference = new BAMLAttributeReference(method, propRec); service.AddReference(method, reference); } } if (rec is PropertyWithConverterRecord) { ProcessConverter((PropertyWithConverterRecord)rec, type); } } else if (rec is PropertyComplexStartRecord) { var attrInfo = ResolveAttribute(((PropertyComplexStartRecord)rec).AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (attr != null) { type = GetAttributeType(attr); } } else if (rec is ContentPropertyRecord) { var attrInfo = ResolveAttribute(((ContentPropertyRecord)rec).AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) { type = GetAttributeType(attr); } foreach (BamlElement child in elem.Children) { child.Type = type; child.Attribute = attr; } } else if (rec is PropertyCustomRecord) { var customRec = (PropertyCustomRecord)rec; var attrInfo = ResolveAttribute(customRec.AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) { type = GetAttributeType(attr); } if ((customRec.SerializerTypeId & ~0x4000) != 0 && (customRec.SerializerTypeId & ~0x4000) == 0x89) { // See BamlRecordReader.GetCustomDependencyPropertyValue. // Umm... Well, actually nothing to do, since this record only describe DP, which already won't be renamed. } } else if (rec is PropertyWithExtensionRecord) { var extRec = (PropertyWithExtensionRecord)rec; var attrInfo = ResolveAttribute(extRec.AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) { type = GetAttributeType(attr); } if (extRec.Flags == 602) { // Static Extension // We only care about the references in user-defined assemblies, so skip built-in attributes // Also, ValueId is a resource ID, which is not implemented, so just skip it. if ((short)extRec.ValueId >= 0) { attrInfo = ResolveAttribute(extRec.ValueId); var attrTarget = attrInfo.Item1; if (attrTarget == null) { TypeSig declType; TypeDef declTypeDef; if (typeRefs.TryGetValue(attrInfo.Item2.OwnerTypeId, out declType)) { declTypeDef = declType.ToBasicTypeDefOrRef().ResolveTypeDefThrow(); } else { Debug.Assert((short)attrInfo.Item2.OwnerTypeId < 0); declTypeDef = things.Types((KnownTypes)(-(short)attrInfo.Item2.OwnerTypeId)); } attrTarget = declTypeDef.FindField(attrInfo.Item2.Name); } if (attrTarget != null) { service.AddReference(attrTarget, new BAMLAttributeReference(attrTarget, attrInfo.Item2)); } } } } else if (rec is TextRecord) { var txt = (TextRecord)rec; string value = txt.Value; if (txt is TextWithIdRecord) { value = strings[((TextWithIdRecord)txt).ValueId].Value; } string prefix; TypeSig sig = ResolveType(value.Trim(), out prefix); if (sig != null && context.Modules.Contains((ModuleDefMD)sig.ToBasicTypeDefOrRef().ResolveTypeDefThrow().Module)) { var reference = new BAMLConverterTypeReference(xmlnsCtx, sig, txt); AddTypeSigReference(sig, reference); } else { AnalyzePropertyPath(value); } } } }
private void ProcessElementBody(BamlElement root, BamlElement elem) { foreach (BamlRecord rec in elem.Body) { // Resolve the type & property for simple property record too. TypeDef type = null; IDnlibDef attr = null; if (rec is PropertyRecord) { var propRec = (PropertyRecord)rec; Tuple <IDnlibDef, TypeDef> attrInfo = ResolveAttribute(propRec.AttributeId); type = attrInfo.Item2; attr = attrInfo.Item1; if (attr != null) { type = GetAttributeType(attr); } if (attrInfo.Item1 is EventDef) { MethodDef method = root.Type.FindMethod(propRec.Value); if (method == null) { context.Logger.WarnFormat("Cannot resolve method '{0}' in '{1}'.", root.Type.FullName, propRec.Value); } else { var reference = new BAMLAttributeReference(method, propRec); service.AddReference(method, reference); } } if (rec is PropertyWithConverterRecord) { ProcessConverter((PropertyWithConverterRecord)rec, type); } } else if (rec is PropertyComplexStartRecord) { Tuple <IDnlibDef, TypeDef> attrInfo = ResolveAttribute(((PropertyComplexStartRecord)rec).AttributeId); type = attrInfo.Item2; attr = attrInfo.Item1; if (attr != null) { type = GetAttributeType(attr); } } else if (rec is ContentPropertyRecord) { Tuple <IDnlibDef, TypeDef> attrInfo = ResolveAttribute(((ContentPropertyRecord)rec).AttributeId); type = attrInfo.Item2; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) { type = GetAttributeType(attr); } foreach (BamlElement child in elem.Children) { child.Type = type; child.Attribute = attr; } } else if (rec is PropertyCustomRecord) { var customRec = (PropertyCustomRecord)rec; Tuple <IDnlibDef, TypeDef> attrInfo = ResolveAttribute(customRec.AttributeId); type = attrInfo.Item2; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) { type = GetAttributeType(attr); } if ((customRec.SerializerTypeId & 0x4000) != 0 && (customRec.SerializerTypeId & 0x4000) == 0x89) { // See BamlRecordReader.GetCustomDependencyPropertyValue. // Umm... Well, actually nothing to do, since this record only describe DP, which already won't be renamed. } } else if (rec is PropertyWithExtensionRecord) { var extRec = (PropertyWithExtensionRecord)rec; Tuple <IDnlibDef, TypeDef> attrInfo = ResolveAttribute(extRec.AttributeId); type = attrInfo.Item2; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) { type = GetAttributeType(attr); } // Umm... Nothing to do here too, since the value only contains either typeId/memberId, which already have references attached. } } }
private void ProcessElementBody(BamlElement root, BamlElement elem) { foreach (BamlRecord rec in elem.Body) { // Resolve the type & property for simple property record too. TypeDef type = null; IDnlibDef attr = null; if (rec is PropertyRecord) { var propRec = (PropertyRecord)rec; var attrInfo = ResolveAttribute(propRec.AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (attr != null) { type = GetAttributeType(attr); } if (attrInfo.Item1 is EventDef) { MethodDef method = root.Type.FindMethod(propRec.Value); if (method == null) { context.Logger.WarnFormat("Cannot resolve method '{0}' in '{1}'.", root.Type.FullName, propRec.Value); } else { var reference = new BAMLAttributeReference(method, propRec); service.AddReference(method, reference); } } if (rec is PropertyWithConverterRecord) { ProcessConverter((PropertyWithConverterRecord)rec, type); } } else if (rec is PropertyComplexStartRecord) { var attrInfo = ResolveAttribute(((PropertyComplexStartRecord)rec).AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (attr != null) { type = GetAttributeType(attr); } } else if (rec is ContentPropertyRecord) { var attrInfo = ResolveAttribute(((ContentPropertyRecord)rec).AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) { type = GetAttributeType(attr); } foreach (BamlElement child in elem.Children) { child.Type = type; child.Attribute = attr; } } else if (rec is PropertyCustomRecord) { var customRec = (PropertyCustomRecord)rec; var attrInfo = ResolveAttribute(customRec.AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) { type = GetAttributeType(attr); } if ((customRec.SerializerTypeId & 0x4000) != 0 && (customRec.SerializerTypeId & 0x4000) == 0x89) { // See BamlRecordReader.GetCustomDependencyPropertyValue. // Umm... Well, actually nothing to do, since this record only describe DP, which already won't be renamed. } } else if (rec is PropertyWithExtensionRecord) { var extRec = (PropertyWithExtensionRecord)rec; var attrInfo = ResolveAttribute(extRec.AttributeId); type = attrInfo.Item3; attr = attrInfo.Item1; if (elem.Attribute != null && attr != null) { type = GetAttributeType(attr); } if (extRec.Flags == 602) // Static Extension { attrInfo = ResolveAttribute(extRec.ValueId); var attrTarget = attrInfo.Item1; if (attrTarget == null) { TypeSig declType; TypeDef declTypeDef; if (typeRefs.TryGetValue(attrInfo.Item2.OwnerTypeId, out declType)) { declTypeDef = declType.ToBasicTypeDefOrRef().ResolveTypeDefThrow(); } else { Debug.Assert((short)attrInfo.Item2.OwnerTypeId < 0); declTypeDef = things.Types((KnownTypes)(-(short)attrInfo.Item2.OwnerTypeId)); } attrTarget = declTypeDef.FindField(attrInfo.Item2.Name); } if (attrTarget != null) { service.AddReference(attrTarget, new BAMLAttributeReference(attrTarget, attrInfo.Item2)); } } } } }