Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        TypeSig ReadTypeRef(Node node)
        {
            var sig = ((Token)node[0]).Image;

            sig = sig.Substring(1, sig.Length - 2);
            return(TypeNameParser.ParseAsTypeSigReflectionThrow(module, sig, assemblyFinder));
        }
Esempio n. 3
0
        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);
                    }
                }
            }
        }