protected override void HeaderAddExtra(CodeStringBuilder builderHeader, StronglyTypedClass info) { var namespaces = new List <string> { "winrt" }; if (info.Namespaces != null) { namespaces.AddRange(info.Namespaces); } namespaces.Add("factory_implementation"); builderHeader.AppendEmptyLine(); HeaderOpenNamespace(builderHeader, namespaces, true); builderHeader.AppendLine($"struct {info.ClassName} : {info.ClassName}T<{info.ClassName}, implementation::{info.ClassName}>"); builderHeader.AppendLine("{"); builderHeader.AppendLine("};"); builderHeader.AppendEmptyLine(); builderHeader.AppendLine($"struct {info.ClassName}Extension : {info.ClassName}ExtensionT<{info.ClassName}Extension, implementation::{info.ClassName}Extension>"); builderHeader.AppendLine("{"); builderHeader.AppendLine("};"); HeaderCloseNamespace(builderHeader, namespaces, true); }
protected override void CppCreateMarkupExtension(CodeStringBuilder builderHeader, string computedNamespace, string resourceFileName, string className, IEnumerable <string> keys) { builderHeader.AppendLine($"{computedNamespace}{className}()"); builderHeader.AppendLine("{"); builderHeader.AddLevel(); builderHeader.AppendLine($"_resourceLoader = ResourceLoader::GetForViewIndependentUse(L\"{resourceFileName}\");"); builderHeader.RemoveLevel(); builderHeader.AppendLine("}"); builderHeader.AppendEmptyLine(); builderHeader.AppendLine($"Object^ {computedNamespace}ProvideValue()"); builderHeader.AppendLine("{"); builderHeader.AddLevel(); builderHeader.AppendLine("String^ res;"); builderHeader.AppendLine("if(Key == KeyEnum::__Undefined)"); builderHeader.AppendLine("{"); builderHeader.AddLevel(); builderHeader.AppendLine("res = L\"\";"); builderHeader.RemoveLevel(); builderHeader.AppendLine("}"); builderHeader.AppendLine("else"); builderHeader.AppendLine("{"); builderHeader.AddLevel(); builderHeader.AppendLine("res = _resourceLoader->GetString(Key.ToString());"); builderHeader.RemoveLevel(); builderHeader.AppendLine("}"); builderHeader.AppendLine("return Converter == nullptr ? res : Converter->Convert(res, TypeName(String::typeid), ConverterParameter, nullptr);"); builderHeader.RemoveLevel(); builderHeader.AppendLine("}"); }
protected override void HeaderCreateMarkupExtension(CodeStringBuilder builderHeader, string resourceFileName, string className, IEnumerable <string> keys, IEnumerable <string> namespaces) { builderHeader.AppendLine("public enum class KeyEnum"); builderHeader.AppendLine("{"); builderHeader.AddLevel(); builderHeader.AppendLine("__Undefined = 0,"); foreach (var key in keys) { builderHeader.AppendLine($"{key},"); } builderHeader.RemoveLevel(); builderHeader.AppendLine("};"); builderHeader.AppendEmptyLine(); builderHeader.AppendLine($"public ref class {className} sealed: public Windows::UI::Xaml::Markup::MarkupExtension"); builderHeader.AppendLine("{"); builderHeader.AppendLine("private:"); builderHeader.AddLevel(); builderHeader.AppendLine("Windows::ApplicationModel::Resources::ResourceLoader^ _resourceLoader;"); builderHeader.RemoveLevel(); builderHeader.AppendLine("public:"); builderHeader.AddLevel(); builderHeader.AppendLine($"{className}();"); builderHeader.AppendLine("property KeyEnum Key;"); builderHeader.AppendLine("property Windows::UI::Xaml::Data::IValueConverter^ Converter;"); builderHeader.AppendLine("property Platform::Object^ ConverterParameter;"); builderHeader.RemoveLevel(); builderHeader.AppendLine("protected:"); builderHeader.AddLevel(); builderHeader.AppendLine("virtual Platform::Object^ ProvideValue() override;"); builderHeader.RemoveLevel(); builderHeader.RemoveLevel(); builderHeader.AppendLine("};"); }
protected override void CreateMarkupExtension(CodeStringBuilder builder, string resourceFileName, string className, IEnumerable <string> keys) { builder.AppendLine($"<System.CodeDom.Compiler.GeneratedCodeAttribute(\"{Constants.ReswPlusName}\", \"{Constants.ReswPlusExtensionVersion}\")>"); builder.AppendLine("<System.Diagnostics.DebuggerNonUserCodeAttribute()>"); builder.AppendLine("<System.Runtime.CompilerServices.CompilerGeneratedAttribute()>"); builder.AppendLine("<MarkupExtensionReturnType(ReturnType:=GetType(String))>"); builder.AppendLine($"Public Class {className}"); builder.AddLevel(); builder.AppendLine("Inherits MarkupExtension"); builder.AppendLine("Public Enum KeyEnum"); builder.AddLevel(); builder.AppendLine("__Undefined = 0"); foreach (var key in keys) { builder.AppendLine(key); } builder.RemoveLevel(); builder.AppendLine("End Enum"); builder.AppendEmptyLine(); builder.AppendLine("Private Shared _resourceLoader as ResourceLoader"); builder.AppendLine("Shared Sub New()"); builder.AddLevel(); builder.AppendLine($"_resourceLoader = ResourceLoader.GetForViewIndependentUse(\"{resourceFileName}\")"); builder.RemoveLevel(); builder.AppendLine("End Sub"); builder.AppendEmptyLine(); builder.AppendLine("Public Property Key As KeyEnum"); builder.AppendLine("Public Property Converter As IValueConverter"); builder.AppendLine("Public Property ConverterParameter As Object"); builder.AppendLine("Protected Overrides Function ProvideValue() As Object"); builder.AddLevel(); builder.AppendLine("Dim res As String"); builder.AppendLine("If Key = KeyEnum.__Undefined Then"); builder.AddLevel(); builder.AppendLine("res = \"\""); builder.RemoveLevel(); builder.AppendLine("Else"); builder.AddLevel(); builder.AppendLine("res = _resourceLoader.GetString(Key.ToString())"); builder.RemoveLevel(); builder.AppendLine("End If"); builder.AppendLine("Return If(Converter Is Nothing, res, Converter.Convert(res, GetType(String), ConverterParameter, Nothing))"); builder.RemoveLevel(); builder.AppendLine("End Function"); builder.RemoveLevel(); builder.AppendLine("End Class"); }
protected override void CreateMarkupExtension(CodeStringBuilder builder, string resourceFileName, string className, IEnumerable <string> keys) { builder.AppendLine($"[global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"{Constants.ReswPlusName}\", \"{Constants.ReswPlusExtensionVersion}\")]"); builder.AppendLine("[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); builder.AppendLine("[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]"); builder.AppendLine("[MarkupExtensionReturnType(ReturnType = typeof(string))]"); builder.AppendLine($"public class {className}: MarkupExtension"); builder.AppendLine("{"); builder.AddLevel(); builder.AppendLine("public enum KeyEnum"); builder.AppendLine("{"); builder.AddLevel(); builder.AppendLine("__Undefined = 0,"); foreach (var key in keys) { builder.AppendLine($"{key},"); } builder.RemoveLevel(); builder.AppendLine("}"); builder.AppendEmptyLine(); builder.AppendLine("private static ResourceLoader _resourceLoader;"); builder.AppendLine($"static {className}()"); builder.AppendLine("{"); builder.AddLevel(); builder.AppendLine($"_resourceLoader = ResourceLoader.GetForViewIndependentUse(\"{resourceFileName}\");"); builder.RemoveLevel(); builder.AppendLine("}"); builder.AppendLine("public KeyEnum Key { get; set;}"); builder.AppendLine("public IValueConverter Converter { get; set;}"); builder.AppendLine("public object ConverterParameter { get; set;}"); builder.AppendLine("protected override object ProvideValue()"); builder.AppendLine("{"); builder.AddLevel(); builder.AppendLine("string res;"); builder.AppendLine("if(Key == KeyEnum.__Undefined)"); builder.AppendLine("{"); builder.AddLevel(); builder.AppendLine("res = \"\";"); builder.RemoveLevel(); builder.AppendLine("}"); builder.AppendLine("else"); builder.AppendLine("{"); builder.AddLevel(); builder.AppendLine("res = _resourceLoader.GetString(Key.ToString());"); builder.RemoveLevel(); builder.AppendLine("}"); builder.AppendLine("return Converter == null ? res : Converter.Convert(res, typeof(String), ConverterParameter, null);"); builder.RemoveLevel(); builder.AppendLine("}"); builder.RemoveLevel(); builder.AppendLine("}"); }
protected override void OpenStronglyTypedClass(CodeStringBuilder builder, string resourceFilename, string className) { builder.AppendLine($"<System.CodeDom.Compiler.GeneratedCodeAttribute(\"{Constants.ReswPlusName}\", \"{Constants.ReswPlusExtensionVersion}\")>"); builder.AppendLine("<System.Diagnostics.DebuggerNonUserCodeAttribute()>"); builder.AppendLine("<System.Runtime.CompilerServices.CompilerGeneratedAttribute()>"); builder.AppendLine($"Public Class {className}"); builder.AddLevel(); builder.AppendLine("Private Shared _resourceLoader as ResourceLoader"); builder.AppendEmptyLine(); builder.AppendLine($"Shared Sub New()"); builder.AddLevel(); builder.AppendLine($"_resourceLoader = ResourceLoader.GetForViewIndependentUse(\"{resourceFilename}\")"); builder.RemoveLevel(); builder.AppendLine("End Sub"); }
protected override void CppFileGenerateHeaders(CodeStringBuilder builderHeader, string precompiledHeader, string headerFilePath, string localNamespace, string className, IEnumerable <string> namespaces, bool supportPluralization) { //Header builderHeader.AppendLine("// File generated automatically by ReswPlus. https://github.com/DotNetPlus/ReswPlus"); if (supportPluralization) { builderHeader.AppendLine("// The NuGet package ReswPlusLib is necessary to support Pluralization."); } if (!string.IsNullOrEmpty(precompiledHeader)) { builderHeader.AppendLine($"#include <{precompiledHeader}>"); } builderHeader.AppendLine($"#include \"{headerFilePath}\""); builderHeader.AppendLine("#include <stdio.h>"); builderHeader.AppendEmptyLine(); builderHeader.AppendLine("using namespace Platform;"); builderHeader.AppendLine("using namespace Windows::ApplicationModel::Resources;"); builderHeader.AppendLine("using namespace Windows::UI::Xaml::Interop;"); builderHeader.AppendLine($"namespace {LocalNamespaceName} = {localNamespace};"); }
private GeneratedFile GenerateIdlFile(CodeStringBuilder builderIdl, string baseFilename, StronglyTypedClass info) { HeaderOpenNamespace(builderIdl, info.Namespaces, false); IdlOpenStronglyTypedClass(builderIdl, info.ClassName); foreach (var item in info.Localizations) { IdlCreateFormatMethod(builderIdl, item.Key, item.IsProperty, item.Parameters.OfType <FunctionFormatTagParameter>(), item.Summary, item.ExtraParameters); } IdlCloseStronglyTypedClass(builderIdl); builderIdl.AppendEmptyLine(); IdlCreateMarkupExtension(builderIdl, info.ClassName + "Extension", info.Localizations.Where(i => i is Localization).Select(s => s.Key)); HeaderCloseNamespace(builderIdl, info.Namespaces, false); return(new GeneratedFile() { Filename = baseFilename + ".idl", Content = builderIdl.GetString() }); }
private void IdlCreateMarkupExtension(CodeStringBuilder builderHeader, string className, IEnumerable <string> keys) { builderHeader.AppendLine("enum KeyEnum"); builderHeader.AppendLine("{"); builderHeader.AddLevel(); builderHeader.AppendLine("__Undefined = 0,"); foreach (var key in keys) { builderHeader.AppendLine($"{key},"); } builderHeader.RemoveLevel(); builderHeader.AppendLine("};"); builderHeader.AppendEmptyLine(); builderHeader.AppendLine($"runtimeclass {className}: Windows.UI.Xaml.Markup.MarkupExtension"); builderHeader.AppendLine("{"); builderHeader.AddLevel(); builderHeader.AppendLine($"{className}();"); builderHeader.AppendLine("KeyEnum Key;"); builderHeader.AppendLine("Windows.UI.Xaml.Data.IValueConverter Converter;"); builderHeader.AppendLine("Object ConverterParameter;"); builderHeader.AppendLine("overridable Object ProvideValue();"); builderHeader.RemoveLevel(); builderHeader.AppendLine("};"); }
protected override void AddNewLine(CodeStringBuilder builder) { builder.AppendEmptyLine(); }
protected override void CreateFormatMethod(CodeStringBuilder builder, string key, bool isProperty, IEnumerable <IFormatTagParameter> parameters, string summary = null, IEnumerable <FunctionFormatTagParameter> extraParameters = null, FunctionFormatTagParameter parameterForPluralization = null, bool supportNoneState = false, FunctionFormatTagParameter parameterForVariant = null) { builder.AppendLine("/// <summary>"); builder.AppendLine($"/// {summary}"); builder.AppendLine("/// </summary>"); if (isProperty) { builder.AppendLine($"public static string {key}"); builder.AppendLine("{"); builder.AddLevel(); builder.AppendLine("get"); } else { var functionParameters = parameters != null?parameters.OfType <FunctionFormatTagParameter>().ToList() : new List <FunctionFormatTagParameter>(); if (extraParameters != null && extraParameters.Any()) { functionParameters.InsertRange(0, extraParameters); } if (parameters.Any(p => p is FunctionFormatTagParameter functionParam && functionParam.IsVariantId) || extraParameters.Any(p => p.IsVariantId)) { // one of the parameter is a variantId, we must create a second method with object as the variantId type. var genericParametersStr = functionParameters.Select(p => (p.IsVariantId ? "object" : GetParameterTypeString(p.Type)) + " " + p.Name).Aggregate((a, b) => a + ", " + b); builder.AppendLine($"public static string {key}({genericParametersStr})"); builder.AppendLine("{"); builder.AddLevel(); builder.AppendLine("try"); builder.AppendLine("{"); builder.AddLevel(); builder.AppendLine($"return {key}({functionParameters.Select(p => p.IsVariantId ? $"Convert.ToInt64({p.Name})" : p.Name).Aggregate((a, b) => a + ", " + b)});"); builder.RemoveLevel(); builder.AppendLine("}"); builder.AppendLine("catch"); builder.AppendLine("{"); builder.AddLevel(); builder.AppendLine("return \"\";"); builder.RemoveLevel(); builder.AppendLine("}"); builder.RemoveLevel(); builder.AppendLine("}"); builder.AppendEmptyLine(); builder.AppendLine("/// <summary>"); builder.AppendLine($"/// {summary}"); builder.AppendLine("/// </summary>"); } var parametersStr = functionParameters.Select(p => GetParameterTypeString(p.Type) + " " + p.Name).Aggregate((a, b) => a + ", " + b); builder.AppendLine($"public static string {key}({parametersStr})"); } builder.AppendLine("{"); builder.AddLevel(); string keyToUseStr = $"\"{key}\""; if (parameterForVariant != null) { keyToUseStr = $"\"{key}_Variant\" + {parameterForVariant.Name}"; } string localizationStr; if (parameterForPluralization != null) { var pluralNumber = parameterForPluralization.TypeToCast.HasValue ? $"({GetParameterTypeString(parameterForPluralization.TypeToCast.Value)}){parameterForPluralization.Name}" : parameterForPluralization.Name; var supportNoneStateStr = supportNoneState ? "true" : "false"; localizationStr = $"ReswPlusLib.ResourceLoaderExtension.GetPlural(_resourceLoader, {keyToUseStr}, {pluralNumber}, {supportNoneStateStr})"; } else { localizationStr = $"_resourceLoader.GetString({keyToUseStr})"; } if (parameters != null && parameters.Any()) { var formatParameters = parameters.Select(p => { switch (p) { case FunctionFormatTagParameter functionParam: return(functionParam.Name); case MacroFormatTagParameter macroParam: return($"ReswPlusLib.Macros.{macroParam.Id}"); case LiteralStringFormatTagParameter constStringParameter: return($"\"{constStringParameter.Value}\""); case StringRefFormatTagParameter localizationStringParameter: return(localizationStringParameter.Id); default: //should not happen return(""); } }).Aggregate((a, b) => a + ", " + b); builder.AppendLine($"return string.Format({localizationStr}, {formatParameters});"); } else { builder.AppendLine($"return {localizationStr};"); } if (isProperty) { builder.RemoveLevel(); builder.AppendLine("}"); } builder.RemoveLevel(); builder.AppendLine("}"); }
public virtual IEnumerable <GeneratedFile> GeneratedFiles(string baseFilename, StronglyTypedClass info, ResourceFileInfo resourceInfo, IEnumerable <string> namespaceOverride) { var supportMultiNamespaceDeclaration = SupportMultiNamespaceDeclaration(); var namespacesToUse = namespaceOverride ?? info.Namespaces; var markupClassName = info.ClassName + "Extension"; var headerFileName = baseFilename + ".h"; var cppFileName = baseFilename + ".cpp"; var baseNamespace = namespacesToUse == null || !namespacesToUse.Any() ? "" : namespacesToUse.Aggregate((a, b) => a + "::" + b); var indentStr = resourceInfo.Project.GetIndentString(); var builderHeader = new CodeStringBuilder(indentStr); var builderCpp = new CodeStringBuilder(indentStr); var precompiledHeader = resourceInfo.Project.GetPrecompiledHeader(); var localNamespace = baseNamespace == "" ? "" : $"{LocalNamespaceName}::"; var namespaceResourceClass = $"{localNamespace}{info.ClassName}::"; var namespaceMarkupExtensionClass = $"{localNamespace}{markupClassName}::"; HeaderFileGenerateHeaders(builderHeader, info.ClassName, info.Namespaces, info.IsAdvanced); builderHeader.AppendEmptyLine(); HeaderOpenNamespace(builderHeader, namespacesToUse, supportMultiNamespaceDeclaration); HeaderOpenStronglyTypedClass(builderHeader, info.ResoureFile, info.ClassName); builderHeader.AppendEmptyLine(); CppFileGenerateHeaders(builderCpp, precompiledHeader, headerFileName, baseNamespace, info.ClassName, info.Namespaces, info.IsAdvanced); builderCpp.AppendEmptyLine(); CppGenerateStronglyTypedClassStaticFunc(builderCpp, namespaceResourceClass, info.ResoureFile); builderCpp.AppendEmptyLine(); var firstLocalization = true; foreach (var item in info.Localizations) { if (firstLocalization) { firstLocalization = false; } else { builderHeader.AppendEmptyLine(); builderCpp.AppendEmptyLine(); } HeaderOpenRegion(builderHeader, item.Key); HeaderCreateFormatMethod(builderHeader, item.Key, item.IsProperty, item.Parameters.OfType <FunctionFormatTagParameter>(), item.Summary, item.ExtraParameters); builderCpp.AppendEmptyLine(); CppCreateFormatMethod(builderCpp, namespaceResourceClass, item.Key, item.IsProperty, item.IsDotNetFormatting, item.Parameters, item.ExtraParameters, (item as PluralLocalization)?.ParameterToUseForPluralization, (item as PluralLocalization)?.SupportNoneState ?? false, (item as IVariantLocalization)?.ParameterToUseForVariant ); HeaderCloseRegion(builderHeader); } HeaderCloseStronglyTypedClass(builderHeader); builderHeader.AppendEmptyLine(); HeaderCreateMarkupExtension(builderHeader, info.ResoureFile, markupClassName, info.Localizations.Where(i => i is Localization).Select(s => s.Key), info.Namespaces); HeaderCloseNamespace(builderHeader, namespacesToUse, supportMultiNamespaceDeclaration); HeaderAddExtra(builderHeader, info); builderCpp.AppendEmptyLine(); CppCreateMarkupExtension(builderCpp, namespaceMarkupExtensionClass, info.ResoureFile, markupClassName, info.Localizations.Where(i => i is Localization).Select(s => s.Key)); yield return(new GeneratedFile() { Filename = headerFileName, Content = builderHeader.GetString() }); yield return(new GeneratedFile() { Filename = cppFileName, Content = builderCpp.GetString() }); }
protected override void CppCreateMarkupExtension(CodeStringBuilder builderCpp, string computedNamespace, string resourceFileName, string className, IEnumerable <string> keys) { builderCpp.AppendLine($"{computedNamespace}{className}()"); builderCpp.AppendLine("{"); builderCpp.AddLevel(); builderCpp.AppendLine($"_resourceLoader = ResourceLoader::GetForViewIndependentUse(L\"{resourceFileName}\");"); builderCpp.RemoveLevel(); builderCpp.AppendLine("}"); builderCpp.AppendEmptyLine(); builderCpp.AppendLine($"IInspectable {computedNamespace}ProvideValue()"); builderCpp.AppendLine("{"); builderCpp.AddLevel(); builderCpp.AppendLine("hstring res;"); builderCpp.AppendLine("if(Key() == KeyEnum::__Undefined)"); builderCpp.AppendLine("{"); builderCpp.AddLevel(); builderCpp.AppendLine("res = L\"\";"); builderCpp.RemoveLevel(); builderCpp.AppendLine("}"); builderCpp.AppendLine("else"); builderCpp.AppendLine("{"); builderCpp.AddLevel(); builderCpp.AppendLine("auto keyStr = KeyEnumToString(Key());"); builderCpp.AppendLine("if(keyStr == L\"\")"); builderCpp.AppendLine("{"); builderCpp.AddLevel(); builderCpp.AppendLine("return box_value(L\"\");"); builderCpp.RemoveLevel(); builderCpp.AppendLine("}"); builderCpp.AppendLine("res = _resourceLoader.GetString(keyStr);"); builderCpp.RemoveLevel(); builderCpp.AppendLine("}"); builderCpp.AppendLine("return Converter() == nullptr ? box_value(res) : Converter().Convert(box_value(res), xaml_typename<hstring>(), ConverterParameter(), L\"\");"); builderCpp.RemoveLevel(); builderCpp.AppendLine("}"); builderCpp.AppendEmptyLine(); builderCpp.AppendLine($"hstring {computedNamespace}KeyEnumToString(KeyEnum key)"); builderCpp.AppendLine("{"); builderCpp.AddLevel(); builderCpp.AppendLine("switch(key)"); builderCpp.AppendLine("{"); builderCpp.AddLevel(); foreach (var key in keys) { builderCpp.AppendLine($"case KeyEnum::{key}:"); builderCpp.AddLevel(); builderCpp.AppendLine($"return hstring(L\"{key}\");"); builderCpp.RemoveLevel(); } builderCpp.AppendLine("default:"); builderCpp.AddLevel(); builderCpp.AppendLine("return hstring(L\"\");"); builderCpp.RemoveLevel(); builderCpp.RemoveLevel(); builderCpp.AppendLine("}"); builderCpp.RemoveLevel(); builderCpp.AppendLine("}"); }