-
Notifications
You must be signed in to change notification settings - Fork 29
/
CodeNormalizer.cs
59 lines (52 loc) · 3.23 KB
/
CodeNormalizer.cs
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
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
namespace PublicApiGenerator
{
internal static class CodeNormalizer
{
const string AutoGeneratedHeader = @"^//-+\s*$.*^//-+\s*$";
const string EmptyGetSet = @"\s+{\s+get\s+{\s+}\s+set\s+{\s+}\s+}";
const string EmptyGet = @"\s+{\s+get\s+{\s+}\s+}";
const string EmptySet = @"\s+{\s+set\s+{\s+}\s+}";
const string GetSet = @"\s+{\s+get;\s+set;\s+}";
const string Get = @"\s+{\s+get;\s+}";
const string Set = @"\s+{\s+set;\s+}";
// https://github.com/ApiApprover/ApiApprover/issues/80
internal const string StaticMarker = "static_C91E2709_C00B-4CAB_8BBC_B2B11DC75E50 ";
internal const string ReadonlyMarker = "readonly_79D3ED2A_0B60_4C3B_8432_941FE471A38B ";
internal const string AttributeMarker = "_attribute_292C96C3_C42E_4C07_BEED_73F5DAA0A6DF_";
public static string NormalizeGeneratedCode(StringWriter writer)
{
var gennedClass = writer.ToString();
gennedClass = Regex.Replace(gennedClass, AutoGeneratedHeader, string.Empty,
RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline | RegexOptions.Singleline);
gennedClass = Regex.Replace(gennedClass, EmptyGetSet, " { get; set; }", RegexOptions.IgnorePatternWhitespace);
gennedClass = Regex.Replace(gennedClass, GetSet, " { get; set; }", RegexOptions.IgnorePatternWhitespace);
gennedClass = Regex.Replace(gennedClass, EmptyGet, " { get; }", RegexOptions.IgnorePatternWhitespace);
gennedClass = Regex.Replace(gennedClass, EmptySet, " { set; }", RegexOptions.IgnorePatternWhitespace);
gennedClass = Regex.Replace(gennedClass, Get, " { get; }", RegexOptions.IgnorePatternWhitespace);
gennedClass = Regex.Replace(gennedClass, Set, " { set; }", RegexOptions.IgnorePatternWhitespace);
gennedClass = Regex.Replace(gennedClass, @"\s+{\s+}", " { }", RegexOptions.IgnorePatternWhitespace);
gennedClass = Regex.Replace(gennedClass, @"\)\s+;", ");", RegexOptions.IgnorePatternWhitespace);
var attributeMarkerEscaped = Regex.Escape(AttributeMarker);
gennedClass = Regex.Replace(gennedClass, $@"(Attribute)?({attributeMarkerEscaped}(\(\))?(?=\])|{attributeMarkerEscaped}(?=\(.+\)\])|{attributeMarkerEscaped}(?=new.+\}}\)\]))", string.Empty, RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
gennedClass = gennedClass.Replace("class " + StaticMarker, "static class ");
gennedClass = gennedClass.Replace("struct " + ReadonlyMarker, "readonly struct ");
gennedClass = Regex.Replace(gennedClass, @"\r\n|\n\r|\r|\n", Environment.NewLine);
gennedClass = RemoveUnnecessaryWhiteSpace(gennedClass);
return gennedClass;
}
static string RemoveUnnecessaryWhiteSpace(string publicApi)
{
return string.Join(Environment.NewLine, publicApi.Split(new[]
{
Environment.NewLine
}, StringSplitOptions.RemoveEmptyEntries)
.Where(l => !string.IsNullOrWhiteSpace(l))
.Select(l => l.TrimEnd())
);
}
}
}