// TODO: Revert to using Mono.Cecil when https://github.com/jbevain/cecil/issues/306 is fixed.
        public IEnumerable <PackageVerifierIssue> Validate(PackageAnalysisContext context)
        {
            var issues = new List <PackageVerifierIssue>();

            foreach (var currentFile in context.PackageReader.GetFiles())
            {
                var extension = Path.GetExtension(currentFile);
                if (!extension.Equals(".dll", StringComparison.OrdinalIgnoreCase) &&
                    !extension.Equals(".exe", StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }

                using (var packageFileStream = context.PackageReader.GetStream(currentFile))
                    using (var stream = new MemoryStream())
                    {
                        // packageFileStream is not a seekable stream. So wrap it in a memory stream for PEReader to consume.
                        packageFileStream.CopyTo(stream);
                        stream.Position = 0;
                        PEReader       peReader = null;
                        MetadataReader reader;
                        try
                        {
                            peReader = new PEReader(stream);
                            reader   = peReader.GetMetadataReader();
                        }
                        catch
                        {
                            // This assembly is not managed.
                            peReader?.Dispose();
                            continue;
                        }

                        using (peReader)
                        {
                            foreach (var handle in reader.CustomAttributes)
                            {
                                var    customAttribute = reader.GetCustomAttribute(handle);
                                string typeName;
                                if (customAttribute.Constructor.Kind == HandleKind.MemberReference)
                                {
                                    var ctor = reader.GetMemberReference((MemberReferenceHandle)customAttribute.Constructor);
                                    var type = reader.GetTypeReference((TypeReferenceHandle)ctor.Parent);
                                    typeName = reader.GetString(type.Name);
                                }
                                else if (customAttribute.Constructor.Kind == HandleKind.MethodDefinition)
                                {
                                    var method = reader.GetMethodDefinition((MethodDefinitionHandle)customAttribute.Constructor);
                                    var type   = reader.GetTypeDefinition(method.GetDeclaringType());
                                    typeName = reader.GetString(type.Name);
                                }
                                else
                                {
                                    throw new InvalidOperationException($"Unknown CustomAttribute constructor type '{customAttribute.Constructor.Kind}");
                                }

                                if (string.Equals(typeof(DebuggableAttribute).Name, typeName, StringComparison.Ordinal))
                                {
                                    var attribute = customAttribute.DecodeValue(NullProvider.Instance);

                                    var debuggingMode = (DebuggableAttribute.DebuggingModes)attribute.FixedArguments.Single().Value;
                                    if (debuggingMode.HasFlag(DebuggableAttribute.DebuggingModes.Default) ||
                                        debuggingMode.HasFlag(DebuggableAttribute.DebuggingModes.DisableOptimizations))
                                    {
                                        issues.Add(PackageIssueFactory.AssemblyHasIncorrectBuildConfiguration(currentFile));
                                    }
                                    ;

                                    break;
                                }
                            }
                        }
                    }
            }

            return(issues);
        }