public void Clean(string sourcePath, string outputPath, WcfCleanerOptions options) { string src = File.ReadAllText(sourcePath).Replace("\r", ""); // Normalize to just \n for newlines // 1) Gather any existing using statements, set aside int namespaceIndex = src.IndexOf("namespace"); var usings = src.Substring(0, namespaceIndex); var usingNamespaces = new HashSet<string>(RegexHelper.ListGroups(@"using ([^;]+);", usings)); // 2) Gather namespace, set aside var fileNamespace = RegexHelper.FirstGroup(@"namespace ([\w_`\$\.]+)", src, namespaceIndex); // 3) Begin class loop int index = src.IndexOf('\n', namespaceIndex + 1) + 1; var codeSections = parseSections(src, index, usingNamespaces, options); // 8) Write out using (var text = new FileStreamWriter(outputPath)) { writeFile(text, usingNamespaces, fileNamespace, codeSections, options); } }
protected KeyValuePair<string, CodeBlock> writeProperty(FileStreamWriter text, WcfCleanerOptions options, CodeClass codeClass, KeyValuePair<string, CodeBlock> kv) { var prop = (CodeProperty)kv.Value; if (options.AutoSetSpecified && codeClass.Properties.ContainsKey(kv.Key + "Specified")) { text.WriteLine("\t\tprotected ", prop.Type, " _", kv.Key, ";") .WriteLine() .WriteLine(prop.Headings) .WriteLine("\t\tpublic ", prop.Type, " ", kv.Key) .WriteLine("\t\t{") .WriteLine("\t\t\tget { return _", kv.Key, "; }") .WriteLine("\t\t\tset {") .WriteLine("\t\t\t\t_", kv.Key, " = value;") .WriteLine("\t\t\t\t", kv.Key, "Specified = true;") .WriteLine("\t\t\t}") .WriteLine("\t\t}"); } else { text.WriteLine(prop.Headings) .WriteLine("\t\tpublic ", prop.Type, " ", kv.Key, " { get; set; }"); } return kv; }
protected void writeInterface(FileStreamWriter text, WcfCleanerOptions options, CodeInterface codeInterface) { text.WriteLine(codeInterface.Headings) .WriteLine(codeInterface.Text); }
protected void writeFile(FileStreamWriter text, HashSet<string> usingNamespaces, string fileNamespace, List<CodeSection> codeSections, WcfCleanerOptions options) { foreach (string usingNamespace in usingNamespaces) { text.WriteLine("using ", usingNamespace, ";"); } text.WriteLine(); text.WriteLine("namespace ", fileNamespace) .WriteLine("{"); var codeEnums = codeSections.Where(c => c is CodeEnum).Cast<CodeEnum>(); codeEnums.FencePostBefore( codeEnum => { text.WriteLine(); }, codeEnum => { writeEnum(text, options, codeEnum); } ); var codeInterfaces = codeSections.Where(c => c is CodeInterface).Cast<CodeInterface>(); var interfaceAction = new Action<CodeInterface>(codeInterface => writeInterface(text, options, codeInterface)); if (codeEnums.Count() == 0) codeInterfaces.FencePostBefore(c => text.WriteLine(), interfaceAction); else codeInterfaces.ForEach(interfaceAction); var codeClasses = codeSections.Where(c => c is CodeClass).Cast<CodeClass>(); var classAction = new Action<CodeClass>(codeClass => writeClass(text, options, codeClass)); if (codeEnums.Count() == 0 && codeInterfaces.Count() == 0) codeClasses.FencePostBefore(c => text.WriteLine(), classAction); else codeClasses.ForEach(classAction); text.WriteLine("}"); }
protected void writeEnumValue(FileStreamWriter text, CodeEnumValue enumValue) { text.WriteLine(enumValue.Headings) .WriteLine("\t\t", enumValue.Name, ","); }
protected void writeEnum(FileStreamWriter text, WcfCleanerOptions options, CodeEnum codeEnum) { text.WriteLine(codeEnum.Headings) .WriteLine("\tpublic enum ", codeEnum.Name) .WriteLine("\t{"); codeEnum.Values.FencePostBefore( enumValue => { text.WriteLine(); }, enumValue => { writeEnumValue(text, enumValue); } ); text.WriteLine("\t}"); }
protected void writeCodeChunk(FileStreamWriter text, string chunk) { text.WriteLine("\t\t", chunk); }
protected void writeClass(FileStreamWriter text, WcfCleanerOptions options, CodeClass codeClass) { text.WriteLine(codeClass.Headings) .WriteLine("\tpublic class ", codeClass.Name, " ", codeClass.Inheritance) .WriteLine("\t{"); int written = 0; codeClass.Chunks.FencePostBefore( chunk => { text.WriteLine(); }, chunk => { written++; writeCodeChunk(text, chunk); } ); if (written > 0) { foreach (var kv in codeClass.Properties) { text.WriteLine(); writeProperty(text, options, codeClass, kv); } } else { codeClass.Properties.FencePostBefore( kv => { text.WriteLine(); }, kv => { writeProperty(text, options, codeClass, kv); } ); } text.WriteLine("\t}"); }