TypeSig ResolveType(string typeName, out string prefix) { List <Tuple <AssemblyDef, string> > clrNs; int index = typeName.IndexOf(':'); if (index == -1) { prefix = ""; if (!xmlns.TryGetValue(prefix, out clrNs)) { return(null); } } else { prefix = typeName.Substring(0, index); if (!xmlns.TryGetValue(prefix, out clrNs)) { return(null); } typeName = typeName.Substring(index + 1); } foreach (var ns in clrNs) { TypeSig sig = TypeNameParser.ParseAsTypeSigReflectionThrow(Module, ns.Item2 + "." + typeName, new DummyAssemblyRefFinder(ns.Item1)); if (sig.ToBasicTypeDefOrRef().ResolveTypeDef() != null) { return(sig); } } return(null); }
TypeSig ReadTypeRef(Node node) { var sig = ((Token)node[0]).Image; sig = sig.Substring(1, sig.Length - 2); return(TypeNameParser.ParseAsTypeSigReflectionThrow(module, sig, assemblyFinder)); }
private void PopulateReferences(BamlDocument document) { var clrNs = new Dictionary <string, List <Tuple <AssemblyDef, string> > >(); assemblyRefs.Clear(); foreach (AssemblyInfoRecord rec in document.OfType <AssemblyInfoRecord>()) { AssemblyDef assembly = context.Resolver.ResolveThrow(rec.AssemblyFullName, module); assemblyRefs.Add(rec.AssemblyId, assembly); if (!context.Modules.Any(m => m.Assembly == assembly)) { continue; } foreach (CustomAttribute attr in assembly.CustomAttributes.FindAll("System.Windows.Markup.XmlnsDefinitionAttribute")) { clrNs.AddListEntry( (UTF8String)attr.ConstructorArguments[0].Value, Tuple.Create(assembly, (string)(UTF8String)attr.ConstructorArguments[1].Value)); } } xmlnsCtx = new XmlNsContext(document, assemblyRefs); typeRefs.Clear(); foreach (TypeInfoRecord rec in document.OfType <TypeInfoRecord>()) { AssemblyDef assembly; var asmId = (short)(rec.AssemblyId & 0xfff); if (asmId == -1) { assembly = things.FrameworkAssembly; } else { assembly = assemblyRefs[(ushort)asmId]; } AssemblyDef assemblyRef = module.Assembly == assembly ? null : assembly; TypeSig typeSig = TypeNameParser.ParseAsTypeSigReflectionThrow(module, rec.TypeFullName, new DummyAssemblyRefFinder(assemblyRef)); typeRefs[rec.TypeId] = typeSig; AddTypeSigReference(typeSig, new BAMLTypeReference(typeSig, rec)); } attrRefs.Clear(); foreach (AttributeInfoRecord rec in document.OfType <AttributeInfoRecord>()) { TypeSig declType; if (typeRefs.TryGetValue(rec.OwnerTypeId, out declType)) { TypeDef type = declType.ToBasicTypeDefOrRef().ResolveTypeDefThrow(); attrRefs[rec.AttributeId] = AnalyzeAttributeReference(type, rec); } else { Debug.Assert((short)rec.OwnerTypeId < 0); TypeDef declTypeDef = things.Types((KnownTypes)(-(short)rec.OwnerTypeId)); attrRefs[rec.AttributeId] = AnalyzeAttributeReference(declTypeDef, rec); } } strings.Clear(); foreach (StringInfoRecord rec in document.OfType <StringInfoRecord>()) { strings[rec.StringId] = rec; } foreach (PIMappingRecord rec in document.OfType <PIMappingRecord>()) { var asmId = (short)(rec.AssemblyId & 0xfff); AssemblyDef assembly; if (asmId == -1) { assembly = things.FrameworkAssembly; } else { assembly = assemblyRefs[(ushort)asmId]; } Tuple <AssemblyDef, string> scope = Tuple.Create(assembly, rec.ClrNamespace); clrNs.AddListEntry(rec.XmlNamespace, scope); } xmlns.Clear(); foreach (XmlnsPropertyRecord rec in document.OfType <XmlnsPropertyRecord>()) { List <Tuple <AssemblyDef, string> > clrMap; if (clrNs.TryGetValue(rec.XmlNamespace, out clrMap)) { xmlns[rec.Prefix] = clrMap; foreach (var scope in clrMap) { xmlnsCtx.AddNsMap(scope, rec.Prefix); } } } }