// TODO [3]: less naming? -> value
        private static void WriteMethods(DataClassWriter writer, Property property)
        {
            if (property.CustomImpl)
            {
                return;
            }

            writer.WriteLine($"#region {property.Name}");

            if (!property.IsList() && !property.IsDictionary() && !property.IsLookupTable())
            {
                writer
                .WriteSummaryExtension($"Sets {property.GetCrefTag()}", property)
                .WriteMethod(
                    $"Set{property.Name}",
                    property,
                    $"toolSettings.{property.Name} = {property.Name.ToInstance().EscapeParameter()};")
                .WriteSummaryExtension($"Resets {property.GetCrefTag()}", property)
                .WriteMethod(
                    $"Reset{property.Name}",
                    $"toolSettings.{property.Name} = null;");
            }

            if (property.IsBoolean())
            {
                WriteBooleanExtensions(writer, property);
            }
            else if (property.IsList())
            {
                WriteListExtensions(writer, property);
            }
            else if (property.IsDictionary())
            {
                WriteDictionaryExtensions(writer, property);
            }
            else if (property.IsLookupTable())
            {
                WriteLookupExtensions(writer, property);
            }

            writer.WriteLine("#endregion");
        }
示例#2
0
        private static DataClassWriter WriteLogger(this DataClassWriter writer)
        {
            if (!writer.DataClass.IsToolSettingsClass)
            {
                return(writer);
            }

            var tool   = writer.DataClass.Tool;
            var logger = $"{tool.GetClassName()}.{tool.Name}Logger";

            return(writer.WriteLine($"public override Action<OutputType, string> CustomLogger => {logger};"));
        }
        public static void Run(DataClass dataClass, ToolWriter toolWriter)
        {
            var writer = new DataClassWriter(dataClass, toolWriter);

            writer
            .WriteLine($"#region {dataClass.Name}Extensions")
            .WriteSummary(dataClass)
            .WriteLine("[PublicAPI]")
            .WriteLine("[ExcludeFromCodeCoverage]")
            .WriteLine($"public static partial class {dataClass.Name}Extensions")
            .WriteBlock(w => w.ForEach(dataClass.Properties, WriteMethods))
            .WriteLine("#endregion");
        }
示例#4
0
        private static DataClassWriter WriteLogLevelParser(this DataClassWriter writer)
        {
            var tool = writer.DataClass.Tool;

            if (!tool.LogLevelParsing)
            {
                return(writer);
            }

            var logLevelParser = $"{tool.GetClassName()}.ParseLogLevel";

            return(writer.WriteLine($"protected override Func<string, LogLevel> LogLevelParser => {logLevelParser};"));
        }
 private static DataClassWriter WriteMethod(
     this DataClassWriter writer,
     string name,
     IEnumerable<string> additionalParameters,
     params string[] modifications)
 {
     // NOTE: methods cannot be generic because constraints are not taken into account for overload resolution
     var parameters = new[] { $"this {writer.DataClass.Name} toolSettings" }.Concat(additionalParameters);
     return writer
         .WriteLine("[Pure]")
         .WriteLine($"public static {writer.DataClass.Name} {name}({parameters.JoinComma()})")
         .WriteBlock(w => w
             .WriteLine("toolSettings = toolSettings.NewInstance();")
             .ForEachWriteLine(modifications)
             .WriteLine("return toolSettings;"));
 }
示例#6
0
        private static DataClassWriter WriteMethod(
            this DataClassWriter writer,
            string name,
            IEnumerable <string> additionalParameters,
            params string[] modifications)
        {
            var parameters = new[] { $"this {writer.DataClass.Name} toolSettings" }.Concat(additionalParameters);

            return(writer
                   .WriteLine("[Pure]")
                   .WriteLine($"public static {writer.DataClass.Name} {name}({parameters.Join()})")
                   .WriteBlock(w => w
                               .WriteLine("toolSettings = toolSettings.NewInstance();")
                               .ForEachWriteLine(modifications)
                               .WriteLine("return toolSettings;")));
        }
示例#7
0
        private static DataClassWriter WriteAssertValid(this DataClassWriter writer)
        {
            var validatedProperties = writer.DataClass.Properties.Where(x => x.Assertion != null).ToList();

            if (validatedProperties.Count == 0)
            {
                return(writer);
            }

            return(writer
                   .WriteLine("protected override void AssertValid()")
                   .WriteBlock(w => w
                               .WriteLine("base.AssertValid();")
                               .ForEach(
                                   validatedProperties.Select(GetAssertion),
                                   assertion => w.WriteLine($"ControlFlow.Assert({assertion}, {assertion.DoubleQuote()});"))
                               ));
        }
示例#8
0
        public static void Run(DataClass dataClass, ToolWriter toolWriter)
        {
            if (dataClass.ArgumentConstruction)
            {
                foreach (var property in dataClass.Properties)
                {
                    if (property.NoArgument)
                    {
                        continue;
                    }

                    if (new[] { "int", "bool" }.Contains(property.Type))
                    {
                        continue;
                    }

                    if (property.Format != null && property.Format.Contains("{value}"))
                    {
                        continue;
                    }

                    Console.WriteLine($"Format for '{dataClass.Name}.{property.Name}' doesn't contain '{{value}}'.");
                }
            }

            var writer   = new DataClassWriter(dataClass, toolWriter);
            var baseType = dataClass.BaseClass ?? (dataClass.Name.EndsWith("Settings") ? "ToolSettings" : "ISettingsEntity");

            writer
            .WriteLine($"#region {dataClass.Name}")
            .WriteSummary(dataClass)
            .WriteLine("[PublicAPI]")
            .WriteObsoleteAttributeWhenObsolete(dataClass)
            .WriteLine("[ExcludeFromCodeCoverage]")
            .WriteLine("[Serializable]")
            .WriteLine($"public partial class {dataClass.Name} : {baseType}")
            .WriteBlock(w => w
                        .WriteToolPath()
                        .WriteLogLevelParser()
                        .ForEach(dataClass.Properties, WritePropertyDeclaration)
                        .WriteAssertValid()
                        .WriteConfigureArguments())
            .WriteLine("#endregion");
        }
        private static void WriteDictionaryDelegateExtensions(DataClassWriter writer, Property property, Property delegateProperty)
        {
            writer.WriteLine($"#region {delegateProperty.Name}");

            var propertyAccess = $"toolSettings.{property.Name}Internal";
            var reference      = $"<c>{delegateProperty.Name}</c>";

            string GetModification(string newValue) => $"{propertyAccess}[{delegateProperty.Name.DoubleQuote()}] = {newValue};";

            if (!delegateProperty.IsList())
            {
                writer
                .WriteSummaryExtension($"Sets {reference} in {property.GetCrefTag()}", delegateProperty, property)
                .WriteMethod(
                    $"Set{delegateProperty.Name}",
                    delegateProperty,
                    GetModification(delegateProperty.Name.ToInstance()))
                .WriteSummaryExtension($"Resets {reference} in {property.GetCrefTag()}", delegateProperty, property)
                .WriteMethod(
                    $"Reset{delegateProperty.Name}",
                    $"{propertyAccess}.Remove({delegateProperty.Name.DoubleQuote()});");
            }

            if (delegateProperty.IsBoolean())
            {
                writer
                .WriteSummaryExtension($"Enables {reference} in {property.GetCrefTag()}", property)
                .WriteMethod($"Enable{delegateProperty.Name}", GetModification("true"))
                .WriteSummaryExtension($"Disables {reference} in {property.GetCrefTag()}", property)
                .WriteMethod($"Disable{delegateProperty.Name}", GetModification("false"))
                .WriteSummaryExtension($"Toggles {reference} in {property.GetCrefTag()}", property)
                .WriteMethod($"Toggle{delegateProperty.Name}",
                             $"ExtensionHelper.ToggleBoolean({propertyAccess}, {delegateProperty.Name.DoubleQuote()});");
            }

            if (delegateProperty.IsList())
            {
                var propertyInstance = delegateProperty.Name.ToInstance();
                var valueType        = delegateProperty.GetListValueType();
                var propertyPlural   = delegateProperty.Name.ToPlural();

                writer
                .WriteSummaryExtension($"Sets {reference} in {property.GetCrefTag()} to a new collection", delegateProperty, property)
                .WriteMethod($"Set{propertyPlural}",
                             $"params {valueType}[] {propertyInstance}",
                             $"ExtensionHelper.SetCollection({propertyAccess}, {delegateProperty.Name.DoubleQuote()}, {propertyInstance}, {delegateProperty.Separator.SingleQuote()});")
                .WriteSummaryExtension($"Sets {reference} in {property.GetCrefTag()} to a new collection", delegateProperty, property)
                .WriteMethod($"Set{propertyPlural}",
                             $"IEnumerable<{valueType}> {propertyInstance}",
                             $"ExtensionHelper.SetCollection({propertyAccess}, {delegateProperty.Name.DoubleQuote()}, {propertyInstance}, {delegateProperty.Separator.SingleQuote()});")
                .WriteSummaryExtension($"Adds values to {reference} in {property.GetCrefTag()}", delegateProperty, property)
                .WriteMethod($"Add{propertyPlural}",
                             $"params {valueType}[] {propertyInstance}",
                             $"ExtensionHelper.AddItems({propertyAccess}, {delegateProperty.Name.DoubleQuote()}, {propertyInstance}, {delegateProperty.Separator.SingleQuote()});")
                .WriteSummaryExtension($"Adds values to {reference} in existing {property.GetCrefTag()}", delegateProperty, property)
                .WriteMethod($"Add{propertyPlural}",
                             $"IEnumerable<{valueType}> {propertyInstance}",
                             $"ExtensionHelper.AddItems({propertyAccess}, {delegateProperty.Name.DoubleQuote()}, {propertyInstance}, {delegateProperty.Separator.SingleQuote()});")
                .WriteSummaryExtension($"Clears {reference} in {property.GetCrefTag()}", delegateProperty, property)
                .WriteMethod($"Clear{propertyPlural}",
                             $"{propertyAccess}.Remove({delegateProperty.Name.DoubleQuote()});")
                .WriteSummaryExtension($"Removes values from {reference} in {property.GetCrefTag()}", delegateProperty, property)
                .WriteMethod($"Remove{propertyPlural}",
                             $"params {valueType}[] {propertyInstance}",
                             $"ExtensionHelper.RemoveItems({propertyAccess}, {delegateProperty.Name.DoubleQuote()}, {propertyInstance}, {delegateProperty.Separator.SingleQuote()});")
                .WriteSummaryExtension($"Removes values from {reference} in {property.GetCrefTag()}", delegateProperty, property)
                .WriteMethod($"Remove{propertyPlural}",
                             $"IEnumerable<{valueType}> {propertyInstance}",
                             $"ExtensionHelper.RemoveItems({propertyAccess}, {delegateProperty.Name.DoubleQuote()}, {propertyInstance}, {delegateProperty.Separator.SingleQuote()});");
            }

            writer.WriteLine("#endregion");
        }