diff --git a/.gitignore b/.gitignore index dfcfd56..13d9b05 100644 --- a/.gitignore +++ b/.gitignore @@ -348,3 +348,6 @@ MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ + +# JetBrains IDE metadata +.idea/ \ No newline at end of file diff --git a/Directory.Build.props b/Directory.Build.props index 81bd430..4ea991f 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,24 @@ + + enable + 1.11.0 + False + + + + domn1995 + + A simple source generator for discriminated unions in C#. + https://github.com/domn1995/dunet + Readme.md + https://github.com/domn1995/dunet + source; generator; discriminated; union; functional; tagged; + MIT + https://github.com/domn1995/dunet/releases + git + favicon.png @@ -10,4 +28,9 @@ + + + + + \ No newline at end of file diff --git a/Dunet.sln b/Dunet.sln index b6b0d2a..cf44f29 100644 --- a/Dunet.sln +++ b/Dunet.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.2.32519.379 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dunet", "src\Dunet.csproj", "{13C0B629-4C48-4C73-AECB-06A476871C5B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dunet.Generator", "src\Dunet.Generator\Dunet.Generator.csproj", "{13C0B629-4C48-4C73-AECB-06A476871C5B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dunet.Test", "test\Dunet.Test.csproj", "{573E6767-C044-415B-9AD3-A1734B0DD684}" EndProject @@ -25,6 +25,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExpressionCalculatorWithSta EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dunet.Benchmark", "benchmark\Dunet.Benchmark\Dunet.Benchmark.csproj", "{44A04A62-D495-4450-8C15-2BD67DF5159A}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dunet", "src\Dunet\Dunet.csproj", "{9CC5D86B-26B5-47B5-8305-D099B171B1CD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -71,6 +73,10 @@ Global {44A04A62-D495-4450-8C15-2BD67DF5159A}.Debug|Any CPU.Build.0 = Debug|Any CPU {44A04A62-D495-4450-8C15-2BD67DF5159A}.Release|Any CPU.ActiveCfg = Release|Any CPU {44A04A62-D495-4450-8C15-2BD67DF5159A}.Release|Any CPU.Build.0 = Release|Any CPU + {9CC5D86B-26B5-47B5-8305-D099B171B1CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9CC5D86B-26B5-47B5-8305-D099B171B1CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9CC5D86B-26B5-47B5-8305-D099B171B1CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9CC5D86B-26B5-47B5-8305-D099B171B1CD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/benchmark/Dunet.Benchmark/Dunet.Benchmark.csproj b/benchmark/Dunet.Benchmark/Dunet.Benchmark.csproj index 3d3bb6c..1ce6b7b 100644 --- a/benchmark/Dunet.Benchmark/Dunet.Benchmark.csproj +++ b/benchmark/Dunet.Benchmark/Dunet.Benchmark.csproj @@ -12,7 +12,8 @@ - + + diff --git a/benchmark/Dunet.Benchmark/SourceGeneratorBenchmark.cs b/benchmark/Dunet.Benchmark/SourceGeneratorBenchmark.cs index ebecd13..67cc791 100644 --- a/benchmark/Dunet.Benchmark/SourceGeneratorBenchmark.cs +++ b/benchmark/Dunet.Benchmark/SourceGeneratorBenchmark.cs @@ -1,9 +1,8 @@ using BenchmarkDotNet.Attributes; -using Dunet.UnionAttributeGeneration; -using Dunet.UnionGeneration; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using System.Reflection; +using Dunet.Generator.UnionGeneration; namespace Dunet.Benchmark; @@ -58,9 +57,8 @@ partial record None(); throw new InvalidOperationException("Compilation returned null"); var unionGenerator = new UnionGenerator(); - var unionAttributeGenerator = new UnionAttributeGenerator(); - var driver = CSharpGeneratorDriver.Create(unionGenerator, unionAttributeGenerator); + var driver = CSharpGeneratorDriver.Create(unionGenerator); return (compilation, driver); } @@ -87,7 +85,12 @@ private static Compilation CreateCompilation(params string[] sources) => sources.Select(static source => CSharpSyntaxTree.ParseText(source)), new[] { - MetadataReference.CreateFromFile(typeof(Binder).GetTypeInfo().Assembly.Location) + // Resolves to System.Private.CoreLib.dll + MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location), + // Resolves to System.Runtime.dll, which is needed for the Attribute type + // Can't use typeof(Attribute).GetTypeInfo().Assembly.Location because it resolves to System.Private.CoreLib.dll + MetadataReference.CreateFromFile(AppDomain.CurrentDomain.GetAssemblies().First(f => f.FullName?.Contains("System.Runtime") == true).Location), + MetadataReference.CreateFromFile(typeof(UnionAttribute).GetTypeInfo().Assembly.Location) }, new CSharpCompilationOptions(OutputKind.ConsoleApplication) ); diff --git a/integration/Dunet.Integration.csproj b/integration/Dunet.Integration.csproj index 2627d70..33c3eec 100644 --- a/integration/Dunet.Integration.csproj +++ b/integration/Dunet.Integration.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/Dunet.Generator/Dunet.Generator.csproj b/src/Dunet.Generator/Dunet.Generator.csproj new file mode 100644 index 0000000..90418a8 --- /dev/null +++ b/src/Dunet.Generator/Dunet.Generator.csproj @@ -0,0 +1,30 @@ + + + netstandard2.0 + enable + enable + 12.0 + True + $(NoWarn);NU5128 + true + Dunet.Generator + true + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/src/IdentifierExtensions.cs b/src/Dunet.Generator/IdentifierExtensions.cs similarity index 96% rename from src/IdentifierExtensions.cs rename to src/Dunet.Generator/IdentifierExtensions.cs index 71afcfa..14dd1fa 100644 --- a/src/IdentifierExtensions.cs +++ b/src/Dunet.Generator/IdentifierExtensions.cs @@ -1,4 +1,4 @@ -namespace Dunet; +namespace Dunet.Generator; internal static class IdentifierExtensions { diff --git a/src/SyntaxExtensions.cs b/src/Dunet.Generator/SyntaxExtensions.cs similarity index 98% rename from src/SyntaxExtensions.cs rename to src/Dunet.Generator/SyntaxExtensions.cs index c2e2fdd..0912f18 100644 --- a/src/SyntaxExtensions.cs +++ b/src/Dunet.Generator/SyntaxExtensions.cs @@ -2,7 +2,7 @@ using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; -namespace Dunet; +namespace Dunet.Generator; internal static class SyntaxExtensions { diff --git a/src/Dunet.Generator/UnionAttributeGeneration/UnionAttributeSource.cs b/src/Dunet.Generator/UnionAttributeGeneration/UnionAttributeSource.cs new file mode 100644 index 0000000..378c059 --- /dev/null +++ b/src/Dunet.Generator/UnionAttributeGeneration/UnionAttributeSource.cs @@ -0,0 +1,8 @@ +namespace Dunet.Generator.UnionAttributeGeneration; + +internal static class UnionAttributeSource +{ + public const string Namespace = "Dunet"; + public const string Name = "UnionAttribute"; + public const string FullyQualifiedName = $"{Namespace}.{Name}"; +} diff --git a/src/UnionExtensionsGeneration/UnionExtensionsSourceBuilder.cs b/src/Dunet.Generator/UnionExtensionsGeneration/UnionExtensionsSourceBuilder.cs similarity index 98% rename from src/UnionExtensionsGeneration/UnionExtensionsSourceBuilder.cs rename to src/Dunet.Generator/UnionExtensionsGeneration/UnionExtensionsSourceBuilder.cs index 5a8adf2..874311f 100644 --- a/src/UnionExtensionsGeneration/UnionExtensionsSourceBuilder.cs +++ b/src/Dunet.Generator/UnionExtensionsGeneration/UnionExtensionsSourceBuilder.cs @@ -1,7 +1,7 @@ -using Dunet.UnionGeneration; -using System.Text; +using System.Text; +using Dunet.Generator.UnionGeneration; -namespace Dunet.UnionExtensionsGeneration; +namespace Dunet.Generator.UnionExtensionsGeneration; internal static class UnionExtensionsSourceBuilder { diff --git a/src/UnionGeneration/ImmutableEquatableArray.cs b/src/Dunet.Generator/UnionGeneration/ImmutableEquatableArray.cs similarity index 94% rename from src/UnionGeneration/ImmutableEquatableArray.cs rename to src/Dunet.Generator/UnionGeneration/ImmutableEquatableArray.cs index 4331bf7..959a5c3 100644 --- a/src/UnionGeneration/ImmutableEquatableArray.cs +++ b/src/Dunet.Generator/UnionGeneration/ImmutableEquatableArray.cs @@ -1,9 +1,6 @@ -namespace Dunet.UnionGeneration; +using System.Collections; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; +namespace Dunet.Generator.UnionGeneration; public static class ImmutableEquatableArray { diff --git a/src/UnionGeneration/IncrementalValuesProviderExtensions.cs b/src/Dunet.Generator/UnionGeneration/IncrementalValuesProviderExtensions.cs similarity index 94% rename from src/UnionGeneration/IncrementalValuesProviderExtensions.cs rename to src/Dunet.Generator/UnionGeneration/IncrementalValuesProviderExtensions.cs index 45bfa71..f53808b 100644 --- a/src/UnionGeneration/IncrementalValuesProviderExtensions.cs +++ b/src/Dunet.Generator/UnionGeneration/IncrementalValuesProviderExtensions.cs @@ -1,6 +1,6 @@ using Microsoft.CodeAnalysis; -namespace Dunet.UnionGeneration; +namespace Dunet.Generator.UnionGeneration; /// /// Provides extension methods for an . diff --git a/src/UnionGeneration/RecordDeclarationSyntaxParser.cs b/src/Dunet.Generator/UnionGeneration/RecordDeclarationSyntaxParser.cs similarity index 98% rename from src/UnionGeneration/RecordDeclarationSyntaxParser.cs rename to src/Dunet.Generator/UnionGeneration/RecordDeclarationSyntaxParser.cs index 7fb2b61..1e20da7 100644 --- a/src/UnionGeneration/RecordDeclarationSyntaxParser.cs +++ b/src/Dunet.Generator/UnionGeneration/RecordDeclarationSyntaxParser.cs @@ -1,9 +1,9 @@ -using Dunet.UnionAttributeGeneration; +using Dunet.Generator.UnionAttributeGeneration; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; -namespace Dunet.UnionGeneration; +namespace Dunet.Generator.UnionGeneration; /// /// Retrieves semantic information from record declarations. diff --git a/src/UnionGeneration/StringBuilderExtensions.cs b/src/Dunet.Generator/UnionGeneration/StringBuilderExtensions.cs similarity index 96% rename from src/UnionGeneration/StringBuilderExtensions.cs rename to src/Dunet.Generator/UnionGeneration/StringBuilderExtensions.cs index 5c9b7ab..a410b8a 100644 --- a/src/UnionGeneration/StringBuilderExtensions.cs +++ b/src/Dunet.Generator/UnionGeneration/StringBuilderExtensions.cs @@ -1,6 +1,6 @@ using System.Text; -namespace Dunet.UnionGeneration; +namespace Dunet.Generator.UnionGeneration; internal static class StringBuilderExtensions { diff --git a/src/UnionGeneration/UnionDeclaration.cs b/src/Dunet.Generator/UnionGeneration/UnionDeclaration.cs similarity index 98% rename from src/UnionGeneration/UnionDeclaration.cs rename to src/Dunet.Generator/UnionGeneration/UnionDeclaration.cs index cafdabf..144b899 100644 --- a/src/UnionGeneration/UnionDeclaration.cs +++ b/src/Dunet.Generator/UnionGeneration/UnionDeclaration.cs @@ -1,6 +1,6 @@ using Microsoft.CodeAnalysis; -namespace Dunet.UnionGeneration; +namespace Dunet.Generator.UnionGeneration; internal sealed record UnionDeclaration( ImmutableEquatableArray Imports, diff --git a/src/UnionGeneration/UnionGenerator.cs b/src/Dunet.Generator/UnionGeneration/UnionGenerator.cs similarity index 96% rename from src/UnionGeneration/UnionGenerator.cs rename to src/Dunet.Generator/UnionGeneration/UnionGenerator.cs index 3cba0b1..9e463b2 100644 --- a/src/UnionGeneration/UnionGenerator.cs +++ b/src/Dunet.Generator/UnionGeneration/UnionGenerator.cs @@ -1,12 +1,12 @@ -using Dunet.UnionExtensionsGeneration; +using System.Collections.Immutable; +using System.Text; +using Dunet.Generator.UnionExtensionsGeneration; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Text; -using System.Collections.Immutable; -using System.Text; -namespace Dunet.UnionGeneration; +namespace Dunet.Generator.UnionGeneration; [Generator] public sealed class UnionGenerator : IIncrementalGenerator diff --git a/src/UnionGeneration/UnionSourceBuilder.cs b/src/Dunet.Generator/UnionGeneration/UnionSourceBuilder.cs similarity index 99% rename from src/UnionGeneration/UnionSourceBuilder.cs rename to src/Dunet.Generator/UnionGeneration/UnionSourceBuilder.cs index fe6d5f7..32bb5aa 100644 --- a/src/UnionGeneration/UnionSourceBuilder.cs +++ b/src/Dunet.Generator/UnionGeneration/UnionSourceBuilder.cs @@ -1,6 +1,6 @@ using System.Text; -namespace Dunet.UnionGeneration; +namespace Dunet.Generator.UnionGeneration; internal static class UnionSourceBuilder { diff --git a/src/Dunet.csproj b/src/Dunet.csproj deleted file mode 100644 index 76b73b4..0000000 --- a/src/Dunet.csproj +++ /dev/null @@ -1,52 +0,0 @@ - - - netstandard2.0 - enable - enable - 12.0 - True - false - True - domn1995 - - A simple source generator for discriminated unions in C#. - https://github.com/domn1995/dunet - Readme.md - https://github.com/domn1995/dunet - source; generator; discriminated; union; functional; tagged; - 1.10.0 - 1.10.0 - MIT - https://github.com/domn1995/dunet/releases - git - favicon.png - False - 1.10.0 - en - true - $(NoWarn);NU5128 - true - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - diff --git a/src/Dunet/Dunet.csproj b/src/Dunet/Dunet.csproj new file mode 100644 index 0000000..a2bd15e --- /dev/null +++ b/src/Dunet/Dunet.csproj @@ -0,0 +1,15 @@ + + + + netstandard2.0;net8.0 + enable + enable + 12.0 + True + True + + + + + + diff --git a/src/Dunet/UnionAttribute.cs b/src/Dunet/UnionAttribute.cs new file mode 100644 index 0000000..b5ca138 --- /dev/null +++ b/src/Dunet/UnionAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace Dunet; + +/// +/// Enables dunet union source generation for the decorated partial record. +/// +[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] +public sealed class UnionAttribute : Attribute {} \ No newline at end of file diff --git a/src/UnionAttributeGeneration/UnionAttributeGenerator.cs b/src/UnionAttributeGeneration/UnionAttributeGenerator.cs deleted file mode 100644 index 24018d9..0000000 --- a/src/UnionAttributeGeneration/UnionAttributeGenerator.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Text; -using System.Text; - -namespace Dunet.UnionAttributeGeneration; - -[Generator] -public sealed class UnionAttributeGenerator : IIncrementalGenerator -{ - public void Initialize(IncrementalGeneratorInitializationContext context) => - context.RegisterPostInitializationOutput( - ctx => - ctx.AddSource( - $"{UnionAttributeSource.Name}.g.cs", - SourceText.From(UnionAttributeSource.SourceCode, Encoding.UTF8) - ) - ); -} diff --git a/src/UnionAttributeGeneration/UnionAttributeSource.cs b/src/UnionAttributeGeneration/UnionAttributeSource.cs deleted file mode 100644 index bb03f28..0000000 --- a/src/UnionAttributeGeneration/UnionAttributeSource.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace Dunet.UnionAttributeGeneration; - -internal static class UnionAttributeSource -{ - public const string Namespace = "Dunet"; - public const string Name = "UnionAttribute"; - public const string FullyQualifiedName = $"{Namespace}.{Name}"; - - public const string SourceCode = """ -using System; - -namespace Dunet; - -/// -/// Enables dunet union source generation for the decorated partial record. -/// -[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] -internal sealed class UnionAttribute : Attribute {} -"""; -} diff --git a/test/Compilation/Compiler.cs b/test/Compilation/Compiler.cs index 0232bb3..2441513 100644 --- a/test/Compilation/Compiler.cs +++ b/test/Compilation/Compiler.cs @@ -1,19 +1,15 @@ using System.Reflection; -using Dunet.UnionAttributeGeneration; -using Dunet.UnionGeneration; +using Dunet.Generator.UnionGeneration; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; namespace Dunet.Test.Compilation; /// -/// Enables compilation of C# source code with Dunet source generation. +/// Enables compilation of C# source code with Dunet.Generator source generation. /// internal sealed class Compiler { - private static readonly IIncrementalGenerator unionAttributeGenerator = - new UnionAttributeGenerator(); - private static readonly IIncrementalGenerator unionGenerator = new UnionGenerator(); public static CompilationResult Compile(params string[] sources) @@ -47,14 +43,21 @@ private static Microsoft.CodeAnalysis.Compilation CreateCompilation(params strin CSharpCompilation.Create( "compilation", sources.Select(static source => CSharpSyntaxTree.ParseText(source)), - [MetadataReference.CreateFromFile(typeof(Binder).GetTypeInfo().Assembly.Location)], + [ + // Resolves to System.Private.CoreLib.dll + MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location), + // Resolves to System.Runtime.dll, which is needed for the Attribute type + // Can't use typeof(Attribute).GetTypeInfo().Assembly.Location because it resolves to System.Private.CoreLib.dll + MetadataReference.CreateFromFile(AppDomain.CurrentDomain.GetAssemblies().First(f => f.FullName?.Contains("System.Runtime") == true).Location), + MetadataReference.CreateFromFile(typeof(UnionAttribute).GetTypeInfo().Assembly.Location) + ], new CSharpCompilationOptions(OutputKind.ConsoleApplication) ); private static GenerationResult RunGenerator(Microsoft.CodeAnalysis.Compilation compilation) { CSharpGeneratorDriver - .Create(unionGenerator, unionAttributeGenerator) + .Create(unionGenerator) .RunGeneratorsAndUpdateCompilation( compilation, out var outputCompilation, diff --git a/test/Dunet.Test.csproj b/test/Dunet.Test.csproj index 02c15d4..7c67d50 100644 --- a/test/Dunet.Test.csproj +++ b/test/Dunet.Test.csproj @@ -22,7 +22,8 @@ - + + diff --git a/test/Runtime/AssemblyExtensions.cs b/test/Runtime/AssemblyExtensions.cs index 6032a5e..fcc617b 100644 --- a/test/Runtime/AssemblyExtensions.cs +++ b/test/Runtime/AssemblyExtensions.cs @@ -6,7 +6,7 @@ namespace Dunet.Test.Runtime; /// Provides extension methods for executing methods within an assembly. /// /// -/// This helps Dunet ensure that match methods are working correctly. +/// This helps Dunet.Generator ensure that match methods are working correctly. /// internal static class AssemblyExtensions { diff --git a/test/UnionExtensionsGeneration/GenerationTests.cs b/test/UnionExtensionsGeneration/GenerationTests.cs index 82a0fd1..eca8675 100644 --- a/test/UnionExtensionsGeneration/GenerationTests.cs +++ b/test/UnionExtensionsGeneration/GenerationTests.cs @@ -9,6 +9,7 @@ public void CanUseMatchAsyncOnAsyncMethodsThatReturnUnions(string taskType) { // Arrange. const string shapeCs = """ +using System; using Dunet; namespace Shapes;