private void Add_TryRecoverUnitFromName()
        {
            var resultTypeName = Cfg.Name.ToUnitTypeName().GetTypename();

            string c()
            {
                var cw = Ext.Create(GetType());

                const ArgChecking flags = ArgChecking.NormalizedString;

                cw.CheckArgument("unitName", flags, Target);
                cw.Open("foreach (var i in All)");
                cw.SingleLineIf("unitName == i.UnitName", "return i.Unit;");
                cw.Close();

                RelatedUnit cfg = Cfg;

                {
                    var type = typeof(Power).Assembly.GetTypes().FirstOrDefault(a => a.Name == resultTypeName);
                    if (type != null)
                    {
                        var t = GetFractionalUnit(type);
                        if (t.Item1 != null)
                        {
                            cw.WriteLine("// try to split");
                            cw.WriteLine("var parts = unitName.Split('/');");
                            cw.OpenIf("parts.Length == 2");
                            cw.WriteLine("var counterUnit = " + t.Item1.Name + "s.TryRecoverUnitFromName(parts[0]);");
                            cw.WriteLine("var denominatorUnit = " + t.Item2.Name + "s.TryRecoverUnitFromName(parts[1]);");
                            cw.WriteLine("return new " + resultTypeName + "(counterUnit, denominatorUnit);");
                            cw.Close();
                            cw.WriteLine("throw new ArgumentException(nameof(unitName));");
                            return(cw.Code);
                        }
                    }
                }
                cw.WriteReturn(new CsArguments("unitName").Create(resultTypeName));
                return(cw.Code);
            }

            var body = c();
            // koniec body
            var m = Target.AddMethod("TryRecoverUnitFromName", resultTypeName).WithStatic().WithBody(body);
            var p = m.AddParam("unitName", "string");

            p.WithAttribute(CsAttribute.Make <NotNullAttribute>(Target));
        }
Esempio n. 2
0
        public static void CheckArgument(this CsCodeWriter code, string argName, ArgChecking flags,
                                         ITypeNameResolver resolver)
        {
            if (flags == ArgChecking.None)
            {
                return;
            }

            var canBeNull     = true;
            var argNameToRead = argName + "?";

            if ((flags & ArgChecking.NotNull) != 0)
            {
                var throwCode = new CsArguments($"nameof({argName})")
                                .Throw <NullReferenceException>(resolver);
                code.SingleLineIf($"{argName} is null", throwCode);
                canBeNull     = false;
                argNameToRead = argName;
            }

            if ((flags & ArgChecking.TrimValue) != 0)
            {
                code.WriteLine("{0} = {1}.Trim();", argName, argNameToRead);
                flags &= ~ArgChecking.TrimValue;

                if ((flags & ArgChecking.NotWhitespace) != 0)
                {
                    flags &= ~ArgChecking.NotWhitespace;
                    flags |= ArgChecking.NotEmpty;
                }
            }

            if ((flags & ArgChecking.NotNull) != 0 && canBeNull)
            {
                flags &= ~ArgChecking.NotNull;
                //p.Attributes.Add(CsAttribute.Make<NotNullAttribute>(target));
                var throwCode = new CsArguments($"nameof({argName})")
                                .Throw <NullReferenceException>(resolver);
                code.SingleLineIf($"{argName} is null", throwCode);
            }

            if ((flags & ArgChecking.NotWhitespace) != 0)
            {
                flags &= ~(ArgChecking.NotEmpty | ArgChecking.NotWhitespace);
                // var m = nameof(string.IsNullOrWhiteSpace);
                var throwCode = new CsArguments($"nameof({argName})")
                                .Throw <ArgumentException>(resolver);
                code.SingleLineIf($"string.IsNullOrWhiteSpace({argName})", throwCode);

                flags &= ~(ArgChecking.NotNullOrWhitespace | ArgChecking.NotNullOrEmpty);
            }

            if ((flags & ArgChecking.NotEmpty) != 0)
            {
                flags &= ~ArgChecking.NotEmpty;
                var throwCode = new CsArguments($"nameof({argName})")
                                .Throw <ArgumentException>(resolver);
                var condition =
                    canBeNull
                        ? $"string.IsNullOrEmpty({argName})"
                        : $"{argName}.Length == 0";

                code.SingleLineIf(condition, throwCode);
            }
        }