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