-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathCodeGenCounter.cs
More file actions
62 lines (48 loc) · 2.63 KB
/
Copy pathCodeGenCounter.cs
File metadata and controls
62 lines (48 loc) · 2.63 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
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?.Parent 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));
args.Logger.LogInformation("{Content}", $"Counting: {args.OutputDirectory.Parent.FullName}");
args.Logger.LogInformation("{Content}", $"Include: {string.Join(", ", _countExtensions)}");
args.Logger.LogInformation("{Content}", string.Empty);
var sw = Stopwatch.StartNew();
var dcs = new DirectoryCountStatistics(args.OutputDirectory.Parent);
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);
}
}
}