private static void LookupMetadataDefinitions(
            MetadataReader reader, TypeDefinition typeDefinition,
            OrderPreservingMultiDictionary<string, MetadataDefinition> definitionMap)
        {
            // Only bother looking for extension methods in static types.
            if ((typeDefinition.Attributes & TypeAttributes.Abstract) != 0 &&
                (typeDefinition.Attributes & TypeAttributes.Sealed) != 0)
            {
                foreach (var child in typeDefinition.GetMethods())
                {
                    var method = reader.GetMethodDefinition(child);
                    if ((method.Attributes & MethodAttributes.SpecialName) != 0 ||
                        (method.Attributes & MethodAttributes.RTSpecialName) != 0)
                    {
                        continue;
                    }

                    // SymbolTreeInfo is only searched for types and extension methods.
                    // So we don't want to pull in all methods here.  As a simple approximation
                    // we just pull in methods that have attributes on them.
                    if ((method.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Public &&
                        (method.Attributes & MethodAttributes.Static) != 0 &&
                        method.GetCustomAttributes().Count > 0)
                    {
                        var definition = new MetadataDefinition(
                            MetadataDefinitionKind.Member, reader.GetString(method.Name));

                        definitionMap.Add(definition.Name, definition);
                    }
                }
            }

            foreach (var child in typeDefinition.GetNestedTypes())
            {
                var type = reader.GetTypeDefinition(child);

                // We don't include internals from metadata assemblies.  It's less likely that
                // a project would have IVT to it and so it helps us save on memory.  It also
                // means we can avoid loading lots and lots of obfuscated code in the case the
                // dll was obfuscated.
                if (IsPublic(type.Attributes))
                {
                    var definition = MetadataDefinition.Create(reader, type);
                    definitionMap.Add(definition.Name, definition);
                }
            }
        }
Example #2
0
File: DC.cs Project: airbrush/CSD
        void AddType(TypeDefinition type, Action<ModelType, string> add)
        {
            MetadataReader reader = _reader.Value.Reader;

            ModelType modelType = new ModelType { Name = reader.GetString(type.Name) };
            add(modelType, reader.GetString(type.Namespace));

            foreach (var hmember in type.GetFields())
            {
                FieldDefinition member = reader.GetFieldDefinition(hmember);
                modelType.Members.Add(new ModelTypeMember
                {
                    Name = "[f] " + reader.GetString(member.Name)
                });
            }

            foreach (var hmember in type.GetMethods())
            {
                MethodDefinition member = reader.GetMethodDefinition(hmember);
                modelType.Members.Add(new ModelMethod
                {
                    Name = reader.GetString(member.Name) + "()",
                    Handle = hmember,
                    Type = type,
                });
            }

            foreach (var hchild in type.GetNestedTypes())
            {
                TypeDefinition child = reader.GetTypeDefinition(hchild);
                AddType(child, (m, typeNs) => modelType.Members.Add(m));
            }
        }