Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
 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
                   );
     }
 }
Esempio n. 3
0
        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("}");
                }
            }
        }
Esempio n. 4
0
        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("}");
            }
        }