コード例 #1
0
 public string GetParameterString(FunctionFormatTagParameter info)
 {
     return(GetParameterTypeString(info.Type) +
            " " +
            (info.TypeToCast != null ? "(" + GetParameterTypeString(info.TypeToCast.Value) + ")" : null) +
            info.Name);
 }
コード例 #2
0
        private bool ManageFormattedFunction(Localization localization, string comment, IEnumerable <ReswItem> basicLocalizedItems, string resourceName)
        {
            FunctionFormatTagParametersInfo tagTypedInfo = null;

            var(format, isDotNetFormatting) = ParseTag(comment);
            if (format != null)
            {
                localization.IsDotNetFormatting = isDotNetFormatting;
                var types = FormatTag.SplitParameters(format);
                tagTypedInfo = FormatTag.ParseParameters(localization.Key, types, basicLocalizedItems, resourceName, _logger);
                if (tagTypedInfo != null)
                {
                    localization.Parameters = tagTypedInfo.Parameters;
                }
            }

            if (localization is IVariantLocalization variantLocalization)
            {
                FunctionFormatTagParameter variantParameter = null;
                // Add an extra parameter for variant if necessary
                if (tagTypedInfo?.VariantParameter == null)
                {
                    variantParameter = new FunctionFormatTagParameter
                    {
                        Type = ParameterType.Long, Name = "variantId", IsVariantId = true
                    };
                    localization.ExtraParameters.Add(variantParameter);
                }
                else
                {
                    variantParameter = tagTypedInfo.VariantParameter;
                }

                variantLocalization.ParameterToUseForVariant = variantParameter;
            }

            if (localization is PluralLocalization pluralLocalization)
            {
                FunctionFormatTagParameter pluralizationQuantifier = null;
                // Add an extra parameter for pluralization if necessary
                if (tagTypedInfo?.PluralizationParameter == null)
                {
                    pluralizationQuantifier = new FunctionFormatTagParameter
                    {
                        Type = ParameterType.Double, Name = "pluralizationReferenceNumber"
                    };
                    pluralLocalization.ExtraParameters.Add(pluralizationQuantifier);
                }
                else
                {
                    pluralizationQuantifier = tagTypedInfo.PluralizationParameter;
                }

                pluralLocalization.ParameterToUseForPluralization = pluralizationQuantifier;
            }

            return(true);
        }
コード例 #3
0
 protected abstract 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);
コード例 #4
0
        protected override void CppCreateFormatMethod(CodeStringBuilder builderCpp, string computedNamespace, string key, bool isProperty, bool isDotNetFormatting, IEnumerable <IFormatTagParameter> parameters, IEnumerable <FunctionFormatTagParameter> extraParameters = null, FunctionFormatTagParameter parameterForPluralization = null, bool supportNoneState = false, FunctionFormatTagParameter parameterForVariant = null)
        {
            if (isProperty)
            {
                builderCpp.AppendLine($"String^ {computedNamespace}{key}::get()");
            }
            else
            {
                var functionParameters = parameters != null?parameters.OfType <FunctionFormatTagParameter>().ToList() :
                                             new List <FunctionFormatTagParameter>();

                if (extraParameters != null && extraParameters.Any())
                {
                    functionParameters.InsertRange(0, extraParameters);
                }

                var parametersStr = functionParameters.Any() ?
                                    functionParameters.Select(p => GetParameterTypeString(p.Type, false) + " " + p.Name).Aggregate((a, b) => a + ", " + b)
                : "";

                builderCpp.AppendLine($"String^ {computedNamespace}{key}({parametersStr})");
            }

            builderCpp.AppendLine("{");
            builderCpp.AddLevel();

            string keyToUseStr = parameterForVariant != null ? $"ref new String(L\"{key}_Variant\") + {parameterForVariant.Name}" : $"L\"{key}\"";

            string localizationStr;

            if (parameterForPluralization != null)
            {
                var pluralNumber = parameterForPluralization.TypeToCast.HasValue ? $"static_cast<{GetParameterTypeString(parameterForPluralization.TypeToCast.Value, false)}>({parameterForPluralization.Name})" : parameterForPluralization.Name;

                var supportNoneStateStr = supportNoneState ? "true" : "false";

                localizationStr = $"ReswPlusLib::ResourceLoaderExtension::GetPlural(GetResourceLoader(), {keyToUseStr}, {pluralNumber}, {supportNoneStateStr})";
            }
            else
            {
                localizationStr = $"GetResourceLoader()->GetString({keyToUseStr})";
            }

            if (parameters != null && parameters.Any())
            {
                var formatParameters = parameters
                                       .Select(p =>
                {
                    switch (p)
                    {
                    case LiteralStringFormatTagParameter constStringParam:
                        {
                            return(isDotNetFormatting ? $"ref new String(L\"{constStringParam.Value}\")" : $"L\"{constStringParam.Value}\"");
                        }

                    case MacroFormatTagParameter macroParam:
                        {
                            return(isDotNetFormatting ? $"ReswPlusLib::Macros::{macroParam.Id}" : $"ReswPlusLib::Macros::{macroParam.Id}->Data()");
                        }

                    case StringRefFormatTagParameter localizationStringParameter:
                        {
                            return(isDotNetFormatting ? $"{localizationStringParameter.Id}" : $"{localizationStringParameter.Id}->Data()");
                        }

                    case FunctionFormatTagParameter functionParam:
                        {
                            switch (functionParam.Type)
                            {
                            case ParameterType.String:
                                return(isDotNetFormatting ? functionParam.Name : functionParam.Name + "->Data()");

                            case ParameterType.Object:
                                return(isDotNetFormatting ? functionParam.Name + "->ToString()" : functionParam.Name + "->ToString()->Data()");

                            default:
                                return(functionParam.Name);
                            }
                        }

                    default:
                        //should not happen
                        return("");
                    }
                }).Aggregate((a, b) => a + ", " + b);

                if (isDotNetFormatting)
                {
                    builderCpp.AppendLine($"return ReswPlusLib::StringFormatting::FormatDotNet({localizationStr}, ref new Array<Object^>({parameters.Count()}){{{formatParameters}}});");
                }
                else
                {
                    builderCpp.AppendLine($"size_t needed = _swprintf_p(nullptr, 0, {localizationStr}->Data(), {formatParameters});");
                    builderCpp.AppendLine($"wchar_t *buffer = new wchar_t[needed + 1];");
                    builderCpp.AppendLine($"_swprintf_p(buffer, needed + 1, {localizationStr}->Data(), {formatParameters});");
                    builderCpp.AppendLine($"return ref new String(buffer);");
                }
            }
            else
            {
                builderCpp.AppendLine($"return {localizationStr};");
            }
            builderCpp.RemoveLevel();
            builderCpp.AppendLine("}");
        }
コード例 #5
0
        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("}");
        }
コード例 #6
0
 protected abstract void CppCreateFormatMethod(CodeStringBuilder builderHeader, string computedNamespace, string key, bool isProperty, bool isDotNetFormatting, IEnumerable <IFormatTagParameter> parameters, IEnumerable <FunctionFormatTagParameter> extraParameters = null, FunctionFormatTagParameter parameterForPluralization = null, bool supportNoneState = false, FunctionFormatTagParameter parameterForVariant = null);