Repository navigation
Expand file tree
/
Copy pathCodeGenCounter.cs
More file actions
68 lines (52 loc) · 2.88 KB
/
Copy pathCodeGenCounter.cs
File metadata and controls
68 lines (52 loc) · 2.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
namespace CoreEx.CodeGen.Counting;
internal class CodeGenCounter(CodeGeneratorArgs args)
{
private static readonly string[] _countExtensions = [".cs", ".json", ".jsn", ".yaml", ".yml", ".xml", ".sql", ".mysql", ".pgsql"];
public Task<CodeGenStatistics> CountAsync()
{
if (args is null || args.OutputDirectory is null || args.Logger is null)
throw new ArgumentNullException(nameof(args), "Arguments, and its OutputDirectory, and Logger cannot be null.");
if (!args.Logger.IsEnabled(LogLevel.Information))
throw new ArgumentException("Logger must be enabled for Information level.", nameof(args));
if (!args.OutputDirectory.Exists)
throw new DirectoryNotFoundException($"The specified output directory '{args.OutputDirectory.FullName}' does not exist.");
var countDir = args.OutputDirectory.Parent ?? args.OutputDirectory;
countDir = countDir.Parent ?? countDir;
args.Logger.LogInformation("{Content}", $"Counting: {countDir.FullName}");
args.Logger.LogInformation("{Content}", $"Include: {string.Join(", ", _countExtensions)}");
args.Logger.LogInformation("{Content}", string.Empty);
var sw = Stopwatch.StartNew();
var dcs = new DirectoryCountStatistics(countDir);
CountDirectoryAndItsChildren(dcs);
var columnLength = Math.Max(dcs.TotalLineCount.ToString().Length, 5);
dcs.Write(args.Logger, columnLength, 0, dcs.Directory.Parent is null ? 0 : dcs.Directory.Parent.FullName.Length + 1);
args.Logger.LogInformation("{Content}", string.Empty);
args.Logger.LogInformation("{Content}", "Note: Roslyn source generated files are excluded from the counts.");
sw.Stop();
return Task.FromResult(new CodeGenStatistics { ElapsedMilliseconds = sw.ElapsedMilliseconds });
}
/// <summary>
/// Count the directory and its children (recursive).
/// </summary>
private static void CountDirectoryAndItsChildren(DirectoryCountStatistics dcs)
{
foreach (var di in dcs.Directory.EnumerateDirectories())
{
if (di.Name.Equals("obj", StringComparison.InvariantCultureIgnoreCase) || di.Name.Equals("bin", StringComparison.InvariantCultureIgnoreCase) || di.Name.StartsWith('.'))
continue;
CountDirectoryAndItsChildren(dcs.AddChildDirectory(di));
}
foreach (var fi in dcs.Directory.EnumerateFiles())
{
if (!_countExtensions.Contains(fi.Extension, StringComparer.InvariantCultureIgnoreCase))
continue;
bool isGenerated = fi.Name.EndsWith($".g{fi.Extension}", StringComparison.OrdinalIgnoreCase);
using var sr = fi.OpenText();
while (sr.ReadLine() is not null)
{
dcs.IncrementLineCount(isGenerated);
}
dcs.IncrementFileCount(isGenerated);
}
}
}