Skip to content

Commit a81d982

Browse files
committed
C#: Fetch file info fewer times and make dependencies more clear.
1 parent 6573b1f commit a81d982

File tree

3 files changed

+28
-25
lines changed

3 files changed

+28
-25
lines changed

csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,13 @@ public DependencyManager(string srcDir, IDependencyOptions options, ILogger logg
5959
this.progressMonitor.FindingFiles(srcDir);
6060

6161
packageDirectory = new TemporaryDirectory(ComputeTempDirectory(sourceDir.FullName));
62-
63-
this.fileContent = new FileContent(progressMonitor, () => GetFiles("*.*"));
64-
this.allSources = GetFiles("*.cs").ToList();
65-
var allProjects = GetFiles("*.csproj");
62+
var allFiles = GetFiles("*.*").ToList();
63+
this.fileContent = new FileContent(progressMonitor, GetFileNames(allFiles));
64+
this.allSources = GetFileNames(allFiles, ".cs").ToList();
65+
var allProjects = GetFileNames(allFiles, ".csproj");
6666
var solutions = options.SolutionFile is not null
6767
? new[] { options.SolutionFile }
68-
: GetFiles("*.sln");
68+
: GetFileNames(allFiles, ".sln");
6969

7070
var dllDirNames = options.DllDirs.Select(Path.GetFullPath).ToList();
7171

@@ -107,7 +107,7 @@ public DependencyManager(string srcDir, IDependencyOptions options, ILogger logg
107107
{
108108
Restore(solutions);
109109
Restore(allProjects);
110-
DownloadMissingPackages();
110+
DownloadMissingPackages(allFiles);
111111
}
112112
}
113113

@@ -136,7 +136,7 @@ public DependencyManager(string srcDir, IDependencyOptions options, ILogger logg
136136
if (bool.TryParse(webViewExtractionOption, out var shouldExtractWebViews) &&
137137
shouldExtractWebViews)
138138
{
139-
GenerateSourceFilesFromWebViews();
139+
GenerateSourceFilesFromWebViews(allFiles);
140140
}
141141

142142
progressMonitor.Summary(
@@ -151,13 +151,11 @@ public DependencyManager(string srcDir, IDependencyOptions options, ILogger logg
151151
DateTime.Now - startTime);
152152
}
153153

154-
private void GenerateSourceFilesFromWebViews()
154+
private void GenerateSourceFilesFromWebViews(List<FileInfo> allFiles)
155155
{
156156
progressMonitor.LogInfo($"Generating source files from cshtml and razor files.");
157157

158-
var views = GetFiles("*.cshtml")
159-
.Concat(GetFiles("*.razor"))
160-
.ToArray();
158+
var views = GetFileNames(allFiles, ".cshtml", ".razor").ToArray();
161159

162160
if (views.Length > 0)
163161
{
@@ -185,15 +183,16 @@ private void GenerateSourceFilesFromWebViews()
185183

186184
public DependencyManager(string srcDir) : this(srcDir, DependencyOptions.Default, new ConsoleLogger(Verbosity.Info)) { }
187185

188-
private IEnumerable<string> GetFiles(string pattern, bool recurseSubdirectories = true) =>
186+
private IEnumerable<FileInfo> GetFiles(string pattern, bool recurseSubdirectories = true) =>
189187
sourceDir.GetFiles(pattern, new EnumerationOptions
190188
{
191189
RecurseSubdirectories = recurseSubdirectories,
192190
MatchCasing = MatchCasing.CaseInsensitive
193191
})
194-
.Where(d => d.Extension != ".dll")
195-
.Select(d => d.FullName)
196-
.Where(d => !options.ExcludesFile(d));
192+
.Where(d => d.Extension != ".dll" && !options.ExcludesFile(d.FullName));
193+
194+
private static IEnumerable<string> GetFileNames(IEnumerable<FileInfo> files, params string[] extensions) =>
195+
files.Where(fi => !extensions.Any() || extensions.Contains(fi.Extension)).Select(fi => fi.FullName);
197196

198197
/// <summary>
199198
/// Computes a unique temp directory for the packages associated
@@ -374,14 +373,19 @@ private void Restore(IEnumerable<string> targets, string? pathToNugetConfig = nu
374373
}
375374
}
376375

377-
private void DownloadMissingPackages()
376+
private void DownloadMissingPackages(List<FileInfo> allFiles)
378377
{
379-
var nugetConfigs = GetFiles("nuget.config", recurseSubdirectories: true).ToArray();
378+
var nugetConfigs = allFiles
379+
.Where(fi => fi.Name == "nuget.config")
380+
.Select(fi => fi.FullName)
381+
.ToArray();
380382
string? nugetConfig = null;
381383
if (nugetConfigs.Length > 1)
382384
{
383385
progressMonitor.MultipleNugetConfig(nugetConfigs);
384-
nugetConfig = GetFiles("nuget.config", recurseSubdirectories: false).FirstOrDefault();
386+
nugetConfig = GetFiles("nuget.config", recurseSubdirectories: false)
387+
.Select(fi => fi.FullName)
388+
.FirstOrDefault();
385389
if (nugetConfig == null)
386390
{
387391
progressMonitor.NoTopLevelNugetConfig();

csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileContent.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.IO;
4-
using System.Linq;
54
using System.Text.RegularExpressions;
65
using Semmle.Util;
76

@@ -18,7 +17,7 @@ internal partial class FileContent
1817
{
1918
private readonly ProgressMonitor progressMonitor;
2019
private readonly IUnsafeFileReader unsafeFileReader;
21-
private readonly Func<IEnumerable<string>> getFiles;
20+
private readonly IEnumerable<string> files;
2221
private readonly HashSet<string> allPackages = new HashSet<string>();
2322
private readonly Initializer initialize;
2423

@@ -50,17 +49,17 @@ public bool UseAspNetDlls
5049
}
5150

5251
internal FileContent(ProgressMonitor progressMonitor,
53-
Func<IEnumerable<string>> getFiles,
52+
IEnumerable<string> files,
5453
IUnsafeFileReader unsafeFileReader)
5554
{
5655
this.progressMonitor = progressMonitor;
57-
this.getFiles = getFiles;
56+
this.files = files;
5857
this.unsafeFileReader = unsafeFileReader;
5958
this.initialize = new Initializer(DoInitialize);
6059
}
6160

6261

63-
public FileContent(ProgressMonitor progressMonitor, Func<IEnumerable<string>> getFiles) : this(progressMonitor, getFiles, new UnsafeFileReader())
62+
public FileContent(ProgressMonitor progressMonitor, IEnumerable<string> files) : this(progressMonitor, files, new UnsafeFileReader())
6463
{ }
6564

6665
private static string GetGroup(ReadOnlySpan<char> input, ValueMatch valueMatch, string groupPrefix)
@@ -95,7 +94,7 @@ private static bool IsGroupMatch(ReadOnlySpan<char> line, Regex regex, string gr
9594

9695
private void DoInitialize()
9796
{
98-
foreach (var file in getFiles())
97+
foreach (var file in files)
9998
{
10099
try
101100
{

csharp/extractor/Semmle.Extraction.Tests/FileContent.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public IEnumerable<string> ReadLines(string file)
3535
internal class TestFileContent : FileContent
3636
{
3737
public TestFileContent(List<string> lines) : base(new ProgressMonitor(new LoggerStub()),
38-
() => new List<string>() { "test1.cs" },
38+
new List<string>() { "test1.cs" },
3939
new UnsafeFileReaderStub(lines))
4040
{ }
4141
}

0 commit comments

Comments
 (0)