Skip to content

Commit 947a32a

Browse files
authored
Move abbreviation mapping to individual quantity types (#1031)
1 parent eca1139 commit 947a32a

File tree

239 files changed

+4997
-3788
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

239 files changed

+4997
-3788
lines changed

CodeGen/Generators/UnitsNetGen/QuantityGenerator.cs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ private void GenerateStaticConstructor()
165165
}},
166166
BaseUnit, Zero, BaseDimensions, QuantityType.{_quantity.Name});
167167
168+
DefaultConversionFunctions = new UnitConverter();
169+
168170
RegisterDefaultConversions(DefaultConversionFunctions);
169171
}}
170172
");
@@ -229,7 +231,7 @@ private void GenerateStaticProperties()
229231
/// <summary>
230232
/// The <see cref=""UnitConverter"" /> containing the default generated conversion functions for <see cref=""{_quantity.Name}"" /> instances.
231233
/// </summary>
232-
public static UnitConverter DefaultConversionFunctions {{ get; }} = new UnitConverter();
234+
public static UnitConverter DefaultConversionFunctions {{ get; }}
233235
234236
/// <inheritdoc cref=""IQuantity.QuantityInfo""/>
235237
public static QuantityInfo<{_unitEnumName}> Info {{ get; }}
@@ -384,14 +386,33 @@ internal static void RegisterDefaultConversions(UnitConverter unitConverter)
384386
if(unit.SingularName == _quantity.BaseUnit)
385387
continue;
386388

387-
var func = unit.FromUnitToBaseFunc.Replace("{x}", "quantity.Value");
388-
Writer.WL($@"
389+
var func = unit.FromUnitToBaseFunc.Replace("{x}", "quantity.Value");
390+
Writer.WL($@"
389391
unitConverter.SetConversionFunction<{_quantity.Name}>({_quantity.Name}Unit.{unit.SingularName}, {_unitEnumName}.{_quantity.BaseUnit}, quantity => new {_quantity.Name}({func}, {_unitEnumName}.{_quantity.BaseUnit}));");
390392
}
391393

392394
Writer.WL($@"
393395
}}
394396
397+
internal static void MapGeneratedLocalizations(UnitAbbreviationsCache unitAbbreviationsCache)
398+
{{");
399+
foreach(var unit in _quantity.Units)
400+
{
401+
foreach(var localization in unit.Localization)
402+
{
403+
// All units must have a unit abbreviation, so fallback to "" for units with no abbreviations defined in JSON
404+
var abbreviationParams = localization.Abbreviations.Any() ?
405+
string.Join(", ", localization.Abbreviations.Select(abbr => $@"""{abbr}""")) :
406+
$@"""""";
407+
408+
Writer.WL($@"
409+
unitAbbreviationsCache.MapUnitToAbbreviation({_unitEnumName}.{unit.SingularName}, new CultureInfo(""{localization.Culture}""), new string[]{{{abbreviationParams}}});");
410+
}
411+
}
412+
413+
Writer.WL($@"
414+
}}
415+
395416
/// <summary>
396417
/// Get unit abbreviation string.
397418
/// </summary>

CodeGen/Generators/UnitsNetGen/StaticQuantityGenerator.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,14 @@ public static bool TryParse(IFormatProvider? formatProvider, Type quantityType,
155155
return false;
156156
}
157157
}
158+
159+
internal static IEnumerable<Type> GetQuantityTypes()
160+
{");
161+
foreach (var quantity in _quantities)
162+
Writer.WL($@"
163+
yield return typeof({quantity.Name});");
164+
Writer.WL(@"
165+
}
158166
}
159167
}");
160168
return Writer.ToString();

CodeGen/Generators/UnitsNetGen/UnitAbbreviationsCacheGenerator.cs

Lines changed: 0 additions & 58 deletions
This file was deleted.

CodeGen/Generators/UnitsNetGenerator.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ public static void Generate(string rootDir, Quantity[] quantities)
6666

6767
Log.Information("");
6868
GenerateIQuantityTests(quantities, $"{testProjectDir}/GeneratedCode/IQuantityTests.g.cs");
69-
GenerateUnitAbbreviationsCache(quantities, $"{outputDir}/UnitAbbreviationsCache.g.cs");
7069
GenerateQuantityType(quantities, $"{outputDir}/QuantityType.g.cs");
7170
GenerateStaticQuantity(quantities, $"{outputDir}/Quantity.g.cs");
7271

@@ -122,13 +121,6 @@ private static void GenerateIQuantityTests(Quantity[] quantities, string filePat
122121
Log.Information("✅ IQuantityTests.g.cs");
123122
}
124123

125-
private static void GenerateUnitAbbreviationsCache(Quantity[] quantities, string filePath)
126-
{
127-
var content = new UnitAbbreviationsCacheGenerator(quantities).Generate();
128-
File.WriteAllText(filePath, content);
129-
Log.Information("✅ UnitAbbreviationsCache.g.cs");
130-
}
131-
132124
private static void GenerateQuantityType(Quantity[] quantities, string filePath)
133125
{
134126
var content = new QuantityTypeGenerator(quantities).Generate();

CodeGen/Generators/UnitsNetWrcGen/QuantityGenerator.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,25 @@ private void GenerateStaticMethods()
281281
282282
#region Static Methods
283283
284+
internal static void MapGeneratedLocalizations(UnitAbbreviationsCache unitAbbreviationsCache)
285+
{{");
286+
foreach(var unit in _quantity.Units)
287+
{
288+
foreach(var localization in unit.Localization)
289+
{
290+
// All units must have a unit abbreviation, so fallback to "" for units with no abbreviations defined in JSON
291+
var abbreviationParams = localization.Abbreviations.Any() ?
292+
string.Join(", ", localization.Abbreviations.Select(abbr => $@"""{abbr}""")) :
293+
$@"""""";
294+
295+
Writer.WL($@"
296+
unitAbbreviationsCache.MapUnitToAbbreviation({_unitEnumName}.{unit.SingularName}, new CultureInfo(""{localization.Culture}""), new string[]{{{abbreviationParams}}});");
297+
}
298+
}
299+
300+
Writer.WL($@"
301+
}}
302+
284303
/// <summary>
285304
/// Get unit abbreviation string.
286305
/// </summary>

CodeGen/Generators/UnitsNetWrcGen/StaticQuantityGenerator.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public override string Generate()
1717
Writer.WL(GeneratedFileHeader);
1818
Writer.WL(@"
1919
using System;
20-
using System.Linq;
20+
using System.Collections.Generic;
2121
using JetBrains.Annotations;
2222
using UnitsNet.InternalHelpers;
2323
using UnitsNet.Units;
@@ -114,6 +114,14 @@ internal static bool TryParse([CanBeNull] IFormatProvider formatProvider, Type q
114114
throw new ArgumentException(
115115
$""Type {{quantityType}} is not a known quantity type. Did you pass in a third-party quantity type defined outside UnitsNet library?"");
116116
}}
117+
118+
internal static IEnumerable<Type> GetQuantityTypes()
119+
{{");
120+
foreach (var quantity in _quantities)
121+
Writer.WL($@"
122+
yield return typeof({quantity.Name});");
123+
Writer.WL($@"
124+
}}
117125
}}
118126
}}");
119127
return Writer.ToString();

CodeGen/Generators/UnitsNetWrcGen/UnitAbbreviationsCacheGenerator.cs

Lines changed: 0 additions & 58 deletions
This file was deleted.

CodeGen/Generators/UnitsNetWrcGenerator.cs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Licensed under MIT No Attribution, see LICENSE file at the root.
1+
// Licensed under MIT No Attribution, see LICENSE file at the root.
22
// Copyright 2013 Andreas Gullberg Larsen ([email protected]). Maintained at https://github.com/angularsen/UnitsNet.
33

44
using System.IO;
@@ -51,7 +51,6 @@ public static void Generate(string rootDir, Quantity[] quantities)
5151
}
5252

5353
Log.Information("");
54-
GenerateUnitAbbreviationsCache(quantities, $"{outputDir}/UnitAbbreviationsCache.g.cs");
5554
GenerateQuantityType(quantities, $"{outputDir}/QuantityType.g.cs");
5655
GenerateStaticQuantity(quantities, $"{outputDir}/Quantity.g.cs");
5756

@@ -73,13 +72,6 @@ private static void GenerateUnitType(Quantity quantity, string filePath)
7372
File.WriteAllText(filePath, content);
7473
}
7574

76-
private static void GenerateUnitAbbreviationsCache(Quantity[] quantities, string filePath)
77-
{
78-
var content = new UnitAbbreviationsCacheGenerator(quantities).Generate();
79-
File.WriteAllText(filePath, content);
80-
Log.Information("✅ UnitAbbreviationsCache.g.cs (WRC)");
81-
}
82-
8375
private static void GenerateQuantityType(Quantity[] quantities, string filePath)
8476
{
8577
var content = new QuantityTypeGenerator(quantities).Generate();

UnitsNet.WindowsRuntimeComponent/CustomCode/UnitAbbreviationsCache.cs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Collections.Generic;
66
using System.Globalization;
77
using System.Linq;
8+
using System.Reflection;
89
using JetBrains.Annotations;
910
using UnitsNet.InternalHelpers;
1011
using UnitsNet.Units;
@@ -14,7 +15,7 @@
1415
// ReSharper disable once CheckNamespace
1516
namespace UnitsNet
1617
{
17-
public sealed partial class UnitAbbreviationsCache
18+
public sealed class UnitAbbreviationsCache
1819
{
1920
private readonly Dictionary<IFormatProvider, UnitTypeToLookup> _lookupsForCulture;
2021

@@ -45,10 +46,10 @@ static UnitAbbreviationsCache()
4546

4647
private void LoadGeneratedAbbreviations()
4748
{
48-
foreach(var localization in GeneratedLocalizations)
49+
foreach(var quantity in Quantity.GetQuantityTypes())
4950
{
50-
var culture = new CultureInfo(localization.CultureName);
51-
MapUnitToAbbreviation(localization.UnitType, localization.UnitValue, culture, localization.UnitAbbreviations);
51+
var mapGeneratedLocalizationsMethod = quantity.GetMethod(nameof(Length.MapGeneratedLocalizations), BindingFlags.NonPublic | BindingFlags.Static);
52+
mapGeneratedLocalizationsMethod?.Invoke(null, new object[]{this});
5253
}
5354
}
5455

@@ -57,13 +58,18 @@ private void LoadGeneratedAbbreviations()
5758
/// This is used to dynamically add abbreviations for existing unit enums such as <see cref="LengthUnit"/> or to extend with third-party unit enums
5859
/// in order to <see cref="UnitParser.Parse{TUnitType}"/> or <see cref="GetDefaultAbbreviation{TUnitType}"/> on them later.
5960
/// </summary>
60-
/// <param name="unitType">The unit enum type.</param>
61-
/// <param name="unitValue">The unit enum value.</param>
62-
/// <param name="formatProvider">The format provider to use for lookup. Defaults to <see cref="GlobalConfiguration.DefaultCulture" /> if null.</param>
61+
/// <param name="unit">The unit enum value.</param>
62+
/// <param name="formatProvider">The format provider to use for lookup. Defaults to <see cref="CultureInfo.CurrentUICulture" /> if null.</param>
6363
/// <param name="abbreviations">Unit abbreviations to add.</param>
64-
// Windows Runtime Component does not allow public methods/ctors with same number of parameters: https://msdn.microsoft.com/en-us/library/br230301.aspx#Overloaded methods
65-
private void MapUnitToAbbreviation(Type unitType, int unitValue, IFormatProvider formatProvider, [NotNull] params string[] abbreviations)
64+
/// <typeparam name="TUnitType">The type of unit enum.</typeparam>
65+
internal void MapUnitToAbbreviation<TUnitType>(TUnitType unit, IFormatProvider formatProvider, params string[] abbreviations) where TUnitType : Enum
6666
{
67+
// Assuming TUnitType is an enum, this conversion is safe. Seems not possible to enforce this today.
68+
// Src: http://stackoverflow.com/questions/908543/how-to-convert-from-system-enum-to-base-integer
69+
// http://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to-an-enum
70+
var unitValue = Convert.ToInt32(unit);
71+
var unitType = typeof(TUnitType);
72+
6773
PerformAbbreviationMapping(unitType, unitValue, formatProvider, false, abbreviations);
6874
}
6975

UnitsNet.WindowsRuntimeComponent/GeneratedCode/Quantities/Acceleration.g.cs

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)