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)); }
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); } }