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