From 0ca8300d3fdd6ebd5cee4a13005738c0cb6c98cd Mon Sep 17 00:00:00 2001 From: jvbsl Date: Fri, 23 Sep 2022 13:01:36 +0200 Subject: [PATCH] Implemented NoImplicitConversionAttribute (#56) Allow the user to disable implicit construction of a variant from a value by adding the `[NoImplicitConversion]` attribute to the `VariantOf` parameter. This also silences the warning about no implicit conversions form interfaces or base classes. --- .../GeneratorTools.cs | 1 + .../RenderInfo.Params.cs | 10 + .../SourceGenerator.Test.cs | 1 + .../NoImplicitConversionForBaseClasses.cs | 6 + .../NoImplicitConversionForInterfaces.cs | 6 + .../dotVariant.Generator.Test.csproj | 2 +- .../Variant-no-implicit-conversion.in.cs | 16 + .../Variant-no-implicit-conversion.out.cs | 1389 +++++++++++++++++ src/dotVariant.Generator/Diagnose.cs | 4 +- src/dotVariant.Generator/Inspect.cs | 6 + src/dotVariant.Generator/RenderInfo.cs | 2 +- .../NoImplicitConversionAttribute.cs | 16 + 12 files changed, 1455 insertions(+), 4 deletions(-) create mode 100644 src/dotVariant.Generator.Test/samples/Variant-no-implicit-conversion.in.cs create mode 100644 src/dotVariant.Generator.Test/samples/Variant-no-implicit-conversion.out.cs create mode 100644 src/dotVariant.Runtime/NoImplicitConversionAttribute.cs diff --git a/src/dotVariant.Generator.Test/GeneratorTools.cs b/src/dotVariant.Generator.Test/GeneratorTools.cs index df5773a..eb87592 100644 --- a/src/dotVariant.Generator.Test/GeneratorTools.cs +++ b/src/dotVariant.Generator.Test/GeneratorTools.cs @@ -116,6 +116,7 @@ DiagnosticExpectation ToExpectation(Match m) new Dictionary() { { "VariantAttribute.cs", LoadSample("VariantAttribute.cs") }, + { "NoImplicitConversionAttribute.cs", LoadSample("NoImplicitConversionAttribute.cs") }, } .ToImmutableDictionary(); } diff --git a/src/dotVariant.Generator.Test/RenderInfo.Params.cs b/src/dotVariant.Generator.Test/RenderInfo.Params.cs index cd4b547..02c7e19 100644 --- a/src/dotVariant.Generator.Test/RenderInfo.Params.cs +++ b/src/dotVariant.Generator.Test/RenderInfo.Params.cs @@ -155,6 +155,16 @@ public partial class Variant }", ri => Assert.That(ri.Params[0].EmitImplicitCast, Is.True) ), + ( + "emit no implicit cast for explicitly attributed parameters", + @" + [dotVariant.Variant] + public partial class Variant + { + static partial void VariantOf([dotVariant.NoImplicitConversion] int a); + }", + ri => Assert.That(ri.Params[0].EmitImplicitCast, Is.False) + ), ( "emit no implicit cast for base types", @" diff --git a/src/dotVariant.Generator.Test/SourceGenerator.Test.cs b/src/dotVariant.Generator.Test/SourceGenerator.Test.cs index 30f2fda..b4dfbc8 100644 --- a/src/dotVariant.Generator.Test/SourceGenerator.Test.cs +++ b/src/dotVariant.Generator.Test/SourceGenerator.Test.cs @@ -83,6 +83,7 @@ public static IEnumerable TranslationCases() ("Variant-generic-unbounded", "Foo.Variant{T}"), ("Variant-nullable-value-type", "Foo.Variant_nullable_value_type"), ("Variant-public", "Foo.Variant_public"), + ("Variant-no-implicit-conversion", "Foo.Variant_no_implicit_conversion"), ("Variant-struct-nullable-disable", "Foo.Variant_struct_nullable_disable"), ("Variant-struct-nullable-enable", "Foo.Variant_struct_nullable_enable"), } diff --git a/src/dotVariant.Generator.Test/diagnostics/NoImplicitConversionForBaseClasses.cs b/src/dotVariant.Generator.Test/diagnostics/NoImplicitConversionForBaseClasses.cs index 058ada7..8319613 100644 --- a/src/dotVariant.Generator.Test/diagnostics/NoImplicitConversionForBaseClasses.cs +++ b/src/dotVariant.Generator.Test/diagnostics/NoImplicitConversionForBaseClasses.cs @@ -9,3 +9,9 @@ partial class Variant1 { static partial void VariantOf(int a, object b); // expected-warning:49 dotVariant.NoImplicitConversionForBaseClasses } + +[dotVariant.Variant] +partial class Variant2 +{ + static partial void VariantOf(int a, [dotVariant.NoImplicitConversion] object b); +} diff --git a/src/dotVariant.Generator.Test/diagnostics/NoImplicitConversionForInterfaces.cs b/src/dotVariant.Generator.Test/diagnostics/NoImplicitConversionForInterfaces.cs index 600634a..2202d27 100644 --- a/src/dotVariant.Generator.Test/diagnostics/NoImplicitConversionForInterfaces.cs +++ b/src/dotVariant.Generator.Test/diagnostics/NoImplicitConversionForInterfaces.cs @@ -9,3 +9,9 @@ partial class Variant1 { static partial void VariantOf(int a, System.Collections.IEnumerable b); // expected-warning:73 dotVariant.NoImplicitConversionForInterfaces } + +[dotVariant.Variant] +partial class Variant2 +{ + static partial void VariantOf(int a, [dotVariant.NoImplicitConversion] System.Collections.IEnumerable b); +} diff --git a/src/dotVariant.Generator.Test/dotVariant.Generator.Test.csproj b/src/dotVariant.Generator.Test/dotVariant.Generator.Test.csproj index 6893a8d..d799fba 100644 --- a/src/dotVariant.Generator.Test/dotVariant.Generator.Test.csproj +++ b/src/dotVariant.Generator.Test/dotVariant.Generator.Test.csproj @@ -26,7 +26,7 @@ - +