Skip to content

Commit c9108a2

Browse files
authored
Merge pull request #59 from Ted-Jin-Lab/development
✨New QuantityImplicitToValueTypeAttribute
2 parents ea84c1c + f95a841 commit c9108a2

4 files changed

Lines changed: 29 additions & 23 deletions

File tree

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project>
33
<PropertyGroup>
4-
<Version>2025.11.19.5</Version>
4+
<Version>2025.11.19.6</Version>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<LangVersion>preview</LangVersion>

Tests/TedToolkit.Console/Absorptance.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace TedToolkit.Quantities;
22

3+
[QuantityImplicitToValueType]
34
[QuantityOperator<AbsorbedDose, AbsorbedDose, double>(Operator.Divide)]
45
partial struct AbsorbedDose
56
{
@@ -8,5 +9,6 @@ public static void Test()
89
var a = new AbsorbedDose(10, AbsorbedDoseUnit.Centigray);
910
var b = new AbsorbedDose(10, AbsorbedDoseUnit.Centigray);
1011
var c = a / b;
12+
double d = a;
1113
}
1214
}

src/analyzers/TedToolkit.Quantities.Analyzer/QuantityStructGenerator.cs

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,6 @@ public void GenerateCode(SourceProductionContext context)
2121
{
2222
List<MemberDeclarationSyntax> operators = [];
2323

24-
if (!quantity.IsNoDimensions)
25-
{
26-
operators.Add(
27-
OperatorDeclaration(IdentifierName(quantity.Name), Token(SyntaxKind.AsteriskToken))
28-
.WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword),
29-
Token(SyntaxKind.StaticKeyword)))
30-
.WithAttributeLists([GeneratedCodeAttribute(typeof(QuantityStructGenerator))])
31-
.WithParameterList(ParameterList(
32-
[
33-
Parameter(Identifier("left")).WithType(IdentifierName(typeName.FullName)),
34-
Parameter(Identifier("right")).WithType(IdentifierName(quantity.Name)),
35-
]))
36-
.WithExpressionBody(ArrowExpressionClause(
37-
BinaryExpression(SyntaxKind.MultiplyExpression,
38-
IdentifierName("right"),
39-
IdentifierName("left"))))
40-
.WithSemicolonToken(Token(SyntaxKind.SemicolonToken)));
41-
}
42-
4324
if (quantitySymbol is not null)
4425
{
4526
foreach (var attributeData in quantitySymbol.GetAttributes()
@@ -461,7 +442,8 @@ public void GenerateCode(SourceProductionContext context)
461442
#region Conversions
462443

463444
ConversionOperatorDeclaration(
464-
Token(quantity.IsNoDimensions
445+
Token(quantitySymbol?.GetAttributes().Any(a => a.AttributeClass?.GetName().FullName
446+
is "global::TedToolkit.Quantities.QuantityImplicitToValueTypeAttribute") ?? false
465447
? SyntaxKind.ImplicitKeyword
466448
: SyntaxKind.ExplicitKeyword),
467449
IdentifierName(typeName.FullName)).WithModifiers(TokenList(
@@ -670,7 +652,7 @@ public void GenerateCode(SourceProductionContext context)
670652
])),
671653
LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(0)))))
672654
.WithSemicolonToken(Token(SyntaxKind.SemicolonToken)),
673-
655+
674656
OperatorDeclaration(PredefinedType(Token(SyntaxKind.BoolKeyword)),
675657
Token(SyntaxKind.LessThanToken))
676658
.WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword)))
@@ -714,7 +696,7 @@ public void GenerateCode(SourceProductionContext context)
714696
])),
715697
LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(0)))))
716698
.WithSemicolonToken(Token(SyntaxKind.SemicolonToken)),
717-
699+
718700
OperatorDeclaration(PredefinedType(Token(SyntaxKind.BoolKeyword)),
719701
Token(SyntaxKind.LessThanEqualsToken))
720702
.WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword)))
@@ -736,6 +718,7 @@ public void GenerateCode(SourceProductionContext context)
736718
])),
737719
LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(0)))))
738720
.WithSemicolonToken(Token(SyntaxKind.SemicolonToken)),
721+
739722
#endregion
740723

741724
#region Operators
@@ -829,6 +812,21 @@ public void GenerateCode(SourceProductionContext context)
829812
IdentifierName("right"))))))
830813
.WithSemicolonToken(Token(SyntaxKind.SemicolonToken)),
831814

815+
OperatorDeclaration(IdentifierName(quantity.Name), Token(SyntaxKind.AsteriskToken))
816+
.WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword),
817+
Token(SyntaxKind.StaticKeyword)))
818+
.WithAttributeLists([GeneratedCodeAttribute(typeof(QuantityStructGenerator))])
819+
.WithParameterList(ParameterList(
820+
[
821+
Parameter(Identifier("left")).WithType(IdentifierName(typeName.FullName)),
822+
Parameter(Identifier("right")).WithType(IdentifierName(quantity.Name)),
823+
]))
824+
.WithExpressionBody(ArrowExpressionClause(
825+
BinaryExpression(SyntaxKind.MultiplyExpression,
826+
IdentifierName("right"),
827+
IdentifierName("left"))))
828+
.WithSemicolonToken(Token(SyntaxKind.SemicolonToken)),
829+
832830
..operators,
833831

834832
#endregion
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
using System.Diagnostics.CodeAnalysis;
2+
3+
namespace TedToolkit.Quantities;
4+
[AttributeUsage(AttributeTargets.Struct)]
5+
[SuppressMessage("ReSharper", "UnusedTypeParameter")]
6+
public sealed class QuantityImplicitToValueTypeAttribute: Attribute;

0 commit comments

Comments
 (0)