public SortedSet <string> GetMemberSignaturesFromMetadata(string fullyQualifiedTypeName, string memberName, List <RuntimeModuleDataId> searchModules) { try { var signatures = new SortedSet <string>(); foreach (var id in searchModules.Select(x => x.Id)) // Check inside each assembly in the compilation { var assembly = GetAssembly(id.FullName, reflectionOnly: true); foreach (var signature in MetadataSignatureHelper.GetMemberSignatures(assembly, fullyQualifiedTypeName, memberName)) { signatures.Add(signature); } } return(signatures); } catch (Exception ex) { var builder = new StringBuilder(); builder.AppendLine($"Error getting signatures {fullyQualifiedTypeName}.{memberName}"); builder.AppendLine($"Assemblies"); foreach (var module in _fullNameToAssemblyDataMap.Values) { builder.AppendLine($"\t{module.Id.SimpleName} {module.Id.Mvid} - {module.Kind} {_assemblyCache.GetOrDefault(module.Id, reflectionOnly: false) != null} {_assemblyCache.GetOrDefault(module.Id, reflectionOnly: true) != null}"); } throw new Exception(builder.ToString(), ex); } }
public SortedSet <string> GetMemberSignaturesFromMetadata( string fullyQualifiedTypeName, string memberName, IEnumerable <ModuleDataId> searchModules ) { try { var signatures = new SortedSet <string>(); foreach (var id in searchModules) { var name = new AssemblyName(id.FullName); var assembly = LoadFromAssemblyName(name); foreach ( var signature in MetadataSignatureHelper.GetMemberSignatures( assembly, fullyQualifiedTypeName, memberName ) ) { signatures.Add(signature); } } return(signatures); } catch (Exception ex) { throw new Exception( $"Error getting signatures {fullyQualifiedTypeName}.{memberName}", ex ); } }
private static void AppendMethod(StringBuilder result, PEMethodSymbol method, string indent, bool includeTypeName = false) { MetadataSignatureHelper.AppendMethodAttributes(result, method.Flags); result.Append(" "); AppendSignatureType(result, method.ReturnType, RefKind.None); result.Append(" "); if (includeTypeName) { result.Append(method.ContainingType); result.Append("::"); } result.Append(method.Name); result.Append("("); bool hasParameterAttributes = false; int i = 0; foreach (PEParameterSymbol parameter in method.Parameters) { if (i > 0) { result.Append(", "); } if (parameter.GetAttributes().Length > 0) { hasParameterAttributes = true; } if (MetadataSignatureHelper.AppendParameterAttributes(result, parameter.Flags, all: true)) { result.Append(" "); } AppendSignatureType(result, parameter.Type, parameter.RefKind); result.Append(" "); result.Append(parameter.Name); i++; } result.Append(") "); MetadataSignatureHelper.AppendMethodImplAttributes(result, method.ImplementationAttributes); if (indent != null) { result.AppendLine(); if (hasParameterAttributes) { result.Append(indent); result.AppendLine("{"); string memberIndent = indent + " "; i = 1; foreach (PEParameterSymbol parameter in method.Parameters) { if (parameter.GetAttributes().Length > 0) { result.Append(memberIndent); result.AppendFormat(".param [{0}]", i); result.AppendLine(); AppendCustomAttributes(result, parameter, indent, inBlock: true); } i++; } result.Append(indent); result.AppendLine("}"); } } }
private void AppendMembers(StringBuilder result, NamespaceOrTypeSymbol container, string indent) { string memberIndent; if (container is NamedTypeSymbol) { memberIndent = indent + " "; result.Append(indent); result.AppendLine("{"); AppendCustomAttributes(result, container, indent, inBlock: true); if (container.GetAttributes().Length > 0) { result.AppendLine(); } } else { memberIndent = indent; } foreach (var member in container.GetMembers().OrderBy(m => m.Name, System.StringComparer.InvariantCulture)) { switch (member.Kind) { case SymbolKind.NamedType: var namedType = (PENamedTypeSymbol)member; result.Append(memberIndent); result.Append(".class "); MetadataSignatureHelper.AppendTypeAttributes(result, namedType.Flags); result.Append(" "); result.Append(member); if (namedType.BaseType() != null) { result.AppendLine(); result.Append(memberIndent); result.Append(" extends "); result.Append(namedType.BaseType()); } if (namedType.Interfaces().Length > 0) { result.AppendLine(); result.Append(memberIndent); result.Append(" implements "); result.Append(string.Join(", ", namedType.Interfaces())); } result.AppendLine(); AppendMembers(result, namedType, memberIndent); break; case SymbolKind.Namespace: var ns = member as PENamespaceSymbol; if ((object)ns != null) { AppendMembers(result, ns, indent); } break; case SymbolKind.Method: var method = member as PEMethodSymbol; if ((object)method != null && method.AssociatedSymbol == null) { result.Append(memberIndent); result.Append(".method "); AppendMethod(result, method, memberIndent); AppendCustomAttributes(result, member, memberIndent, inBlock: false); } break; case SymbolKind.Field: var field = (PEFieldSymbol)member; result.Append(memberIndent); result.Append(".field "); MetadataSignatureHelper.AppendFieldAttributes(result, field.Flags); result.Append(" "); result.Append(field.Type); result.Append(" "); result.Append(member.Name); result.AppendLine(); AppendCustomAttributes(result, member, memberIndent, inBlock: false); break; case SymbolKind.Property: var property = (PEPropertySymbol)member; string propertyName; result.Append(memberIndent); result.Append(".property "); PropertyAttributes propertyAttrs; ((PEModuleSymbol)container.ContainingModule).Module.GetPropertyDefPropsOrThrow(property.Handle, out propertyName, out propertyAttrs); if (MetadataSignatureHelper.AppendPropertyAttributes(result, propertyAttrs)) { result.Append(" "); } result.Append(property.Type); result.Append(" "); result.Append(property.Name); result.AppendLine(); result.Append(memberIndent); result.AppendLine("{"); AppendCustomAttributes(result, member, memberIndent, inBlock: true); if (property.GetMethod != null) { result.Append(memberIndent); result.Append(" .get "); AppendMethod(result, (PEMethodSymbol)property.GetMethod, memberIndent); } if (property.SetMethod != null) { result.Append(memberIndent); result.Append(" .set "); AppendMethod(result, (PEMethodSymbol)property.SetMethod, memberIndent); } result.Append(memberIndent); result.AppendLine("}"); break; case SymbolKind.Event: var evnt = (PEEventSymbol)member; result.Append(memberIndent); result.Append(".event "); string eventName; EventAttributes eventAttrs; EntityHandle type; ((PEModuleSymbol)container.ContainingModule).Module.GetEventDefPropsOrThrow(evnt.Handle, out eventName, out eventAttrs, out type); if (MetadataSignatureHelper.AppendEventAttributes(result, eventAttrs)) { result.Append(" "); } result.Append(evnt.Type); result.Append(" "); result.Append(evnt.Name); result.AppendLine(); result.Append(memberIndent); result.Append("{"); result.AppendLine(); AppendCustomAttributes(result, member, memberIndent, inBlock: true); if (evnt.RemoveMethod != null) { result.Append(memberIndent); result.Append(" .removeon "); AppendMethod(result, (PEMethodSymbol)evnt.RemoveMethod, memberIndent); } if (evnt.AddMethod != null) { result.Append(memberIndent); result.Append(" .addon "); AppendMethod(result, (PEMethodSymbol)evnt.AddMethod, memberIndent); } result.Append(memberIndent); result.AppendLine("}"); break; } } if (container is NamedTypeSymbol) { result.Append(indent); result.AppendLine("}"); } }