public override Task <CodeFile> GetCodeFileAsync(string originalName, Stream stream, bool runAnalysis)
        {
            ZipArchive archive = null;

            try
            {
                Stream dllStream = stream;
                Stream docStream = null;

                if (IsNuget(originalName))
                {
                    archive = new ZipArchive(stream, ZipArchiveMode.Read, true);
                    foreach (var entry in archive.Entries)
                    {
                        if (IsDll(entry.Name))
                        {
                            dllStream = entry.Open();
                            var docEntry = archive.GetEntry(Path.ChangeExtension(entry.FullName, ".xml"));
                            if (docEntry != null)
                            {
                                docStream = docEntry.Open();
                            }
                            break;
                        }
                    }
                }

                var assemblySymbol = CompilationFactory.GetCompilation(dllStream, docStream);
                return(Task.FromResult(new CodeFileBuilder().Build(assemblySymbol, runAnalysis)));
            }
            finally
            {
                archive?.Dispose();
            }
        }
        private async Task AssertFormattingAsync(string code, string formatted)
        {
            var project = DiagnosticProject.Create(typeof(CodeFileBuilderTests).Assembly, LanguageVersion.Latest, new[] { code });

            project = project.WithCompilationOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            var compilation = await project.GetCompilationAsync();

            Assert.Empty(compilation.GetDiagnostics().Where(d => d.Severity > DiagnosticSeverity.Warning));

            var memoryStream = new MemoryStream();

            compilation.Emit(memoryStream);
            memoryStream.Position = 0;

            var compilationFromDll = CompilationFactory.GetCompilation(memoryStream, null);
            var codeModel          = new CodeFileBuilder()
            {
                SymbolOrderProvider = new NameSymbolOrderProvider()
            }.Build(compilationFromDll, false, null);
            var formattedModel  = new CodeFileRenderer().Render(codeModel);
            var formattedString = string.Join(Environment.NewLine, formattedModel.Select(l => l.DisplayString));

            _testOutputHelper.WriteLine(formattedString);
            Assert.Equal(formatted, formattedString);
        }
Example #3
0
        public override Task <CodeFile> GetCodeFileAsync(string originalName, Stream stream, bool runAnalysis)
        {
            ZipArchive archive = null;

            try
            {
                Stream dllStream = stream;
                Stream docStream = null;
                List <DependencyInfo> dependencies = new List <DependencyInfo>();

                if (IsNuget(originalName))
                {
                    archive = new ZipArchive(stream, ZipArchiveMode.Read, true);
                    foreach (var entry in archive.Entries)
                    {
                        if (IsDll(entry.Name))
                        {
                            dllStream = entry.Open();
                            var docEntry = archive.GetEntry(Path.ChangeExtension(entry.FullName, ".xml"));
                            if (docEntry != null)
                            {
                                docStream = docEntry.Open();
                            }
                        }
                        else if (IsNuspec(entry.Name))
                        {
                            using var nuspecStream = entry.Open();
                            var document           = XDocument.Load(nuspecStream);
                            var dependencyElements = document.Descendants().Where(e => e.Name.LocalName == "dependency");
                            dependencies.AddRange(
                                dependencyElements.Select(dependency => new DependencyInfo(
                                                              dependency.Attribute("id").Value,
                                                              dependency.Attribute("version").Value)));
                            // filter duplicates and sort
                            dependencies = dependencies
                                           .GroupBy(d => d.Name)
                                           .Select(d => d.First())
                                           .OrderBy(d => d.Name).ToList();
                        }
                    }
                }

                var assemblySymbol = CompilationFactory.GetCompilation(dllStream, docStream);
                if (assemblySymbol == null)
                {
                    return(Task.FromResult(GetDummyReviewCodeFile(originalName, dependencies)));
                }

                return(Task.FromResult(new CodeFileBuilder().Build(assemblySymbol, runAnalysis, dependencies)));
            }
            finally
            {
                archive?.Dispose();
            }
        }
Example #4
0
        public override Task <CodeFile> GetCodeFileAsync(string originalName, Stream stream, bool runAnalysis)
        {
            ZipArchive archive = null;

            try
            {
                Stream dllStream = stream;
                Stream docStream = null;
                List <DependencyInfo> dependencies = null;

                if (IsNuget(originalName))
                {
                    archive = new ZipArchive(stream, ZipArchiveMode.Read, true);

                    var nuspecEntry = archive.Entries.Single(entry => IsNuspec(entry.Name));

                    var dllEntries = archive.Entries.Where(entry => IsDll(entry.Name)).ToArray();

                    var dllEntry = dllEntries.First();
                    if (dllEntries.Length > 1)
                    {
                        // If there are multiple dlls in the nupkg (e.g. Cosmos), try to find the first that matches the nuspec name, but
                        // fallback to just using the first one.
                        dllEntry = dllEntries.FirstOrDefault(
                            dll => Path.GetFileNameWithoutExtension(nuspecEntry.Name)
                            .Equals(Path.GetFileNameWithoutExtension(dll.Name), StringComparison.OrdinalIgnoreCase)) ?? dllEntry;
                    }

                    dllStream = dllEntry.Open();
                    var docEntry = archive.GetEntry(Path.ChangeExtension(dllEntry.FullName, ".xml"));
                    if (docEntry != null)
                    {
                        docStream = docEntry.Open();
                    }
                    using var nuspecStream = nuspecEntry.Open();
                    var document           = XDocument.Load(nuspecStream);
                    var dependencyElements = document.Descendants().Where(e => e.Name.LocalName == "dependency");
                    dependencies = new List <DependencyInfo>();
                    dependencies.AddRange(
                        dependencyElements.Select(dependency => new DependencyInfo(
                                                      dependency.Attribute("id").Value,
                                                      dependency.Attribute("version").Value)));
                    // filter duplicates and sort
                    if (dependencies.Any())
                    {
                        dependencies = dependencies
                                       .GroupBy(d => d.Name)
                                       .Select(d => d.First())
                                       .OrderBy(d => d.Name).ToList();
                    }
                }

                var assemblySymbol = CompilationFactory.GetCompilation(dllStream, docStream);
                if (assemblySymbol == null)
                {
                    return(Task.FromResult(GetDummyReviewCodeFile(originalName, dependencies)));
                }

                return(Task.FromResult(new CodeFileBuilder().Build(assemblySymbol, runAnalysis, dependencies)));
            }
            finally
            {
                archive?.Dispose();
            }
        }