using System; using System.CodeDom; using System.CodeDom.Compiler; using System.Globalization; using System.IO; using System.Text; using Microsoft.CSharp; namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool { public class CodeDomCodeGenerator : CodeGenerator { private readonly string className; private readonly CodeNamespace codeNamespace; private readonly CodeCompileUnit compileUnit; private readonly CodeDomProvider provider; public CodeDomCodeGenerator(IResourceParser resourceParser, string className, string defaultNamespace, CodeDomProvider codeDomProvider = null) : base(resourceParser, defaultNamespace) { this.className = className; compileUnit = new CodeCompileUnit(); provider = codeDomProvider ?? new CSharpCodeProvider(); codeNamespace = new CodeNamespace(defaultNamespace); } public override string GenerateCode() { codeNamespace.Comments.Add(new CodeCommentStatement("--------------------------------------------------------------------------------------------------")); codeNamespace.Comments.Add(new CodeCommentStatement("")); codeNamespace.Comments.Add(new CodeCommentStatement("\tThis code was generated by ResW File Code Generator (http://reswcodegen.codeplex.com)")); codeNamespace.Comments.Add(new CodeCommentStatement("\tResW File Code Generator was written by Christian Resma Helle")); codeNamespace.Comments.Add(new CodeCommentStatement("\tand is under GNU General Public License version 2 (GPLv2)")); codeNamespace.Comments.Add(new CodeCommentStatement(string.Empty)); codeNamespace.Comments.Add(new CodeCommentStatement("\tThis code contains a helper class exposing property representations")); codeNamespace.Comments.Add(new CodeCommentStatement("\tof the string resources defined in the specified .ResW file")); codeNamespace.Comments.Add(new CodeCommentStatement(string.Empty)); codeNamespace.Comments.Add(new CodeCommentStatement("\tGenerated: " + DateTime.Now.ToString(CultureInfo.InvariantCulture))); codeNamespace.Comments.Add(new CodeCommentStatement("")); codeNamespace.Comments.Add(new CodeCommentStatement("--------------------------------------------------------------------------------------------------")); codeNamespace.Imports.Add(new CodeNamespaceImport("Windows.ApplicationModel.Resources")); var targetClass = new CodeTypeDeclaration(className) { IsClass = true, IsPartial = true, Attributes = MemberAttributes.Public | MemberAttributes.Static }; const string resourceLoaderType = "ResourceLoader"; var resourceLoaderField = new CodeMemberField(resourceLoaderType, "resourceLoader") { Attributes = MemberAttributes.Private | MemberAttributes.Static | MemberAttributes.Final, InitExpression = new CodeObjectCreateExpression(resourceLoaderType, new CodePrimitiveExpression(className)) }; targetClass.Members.Add(resourceLoaderField); var resources = ResourceParser.Parse(); foreach (var item in resources) { if (string.IsNullOrEmpty(item.Name) || item.Name.Contains(".")) continue; var property = new CodeMemberProperty { Name = item.Name.Trim(), Attributes = MemberAttributes.Public | MemberAttributes.Static, HasGet = true, Type = new CodeTypeReference(typeof(string)) }; property.Comments.Add(new CodeCommentStatement("", true)); property.Comments.Add(new CodeCommentStatement("Localized resource similar to \"" + (item.Value ?? item.Name) + "\"", true)); property.Comments.Add(new CodeCommentStatement("", true)); property.GetStatements.Add( new CodeMethodReturnStatement( new CodeMethodInvokeExpression( new CodeFieldReferenceExpression(null, "resourceLoader"), "GetString", new CodePrimitiveExpression(item.Name)))); targetClass.Members.Add(property); } codeNamespace.Types.Add(targetClass); compileUnit.Namespaces.Add(codeNamespace); return GenerateCodeFromCompileUnit(); } private string GenerateCodeFromCompileUnit() { var options = new CodeGeneratorOptions { BracingStyle = "C" }; var code = new StringBuilder(); using (var writer = new StringWriter(code)) provider.GenerateCodeFromCompileUnit(compileUnit, writer, options); return code.ToString(); } } }