From 1dd1cd1c19488cfcac309a56e72437ece702a2d9 Mon Sep 17 00:00:00 2001 From: Sergio Pedri Date: Tue, 14 Feb 2023 13:44:46 +0100 Subject: [PATCH] Fix AddSource operations on Roslyn 4.0.1 --- ...ityToolkit.Mvvm.SourceGenerators.projitems | 1 + .../ObservablePropertyGenerator.cs | 7 ++-- ...ValidatorValidateAllPropertiesGenerator.cs | 5 ++- .../TransitiveMembersGenerator.cs | 3 +- .../SourceProductionContextExtensions.cs | 33 +++++++++++++++++++ .../Input/RelayCommandGenerator.cs | 3 +- .../IMessengerRegisterAllGenerator.cs | 5 ++- 7 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 src/CommunityToolkit.Mvvm.SourceGenerators/Extensions/SourceProductionContextExtensions.cs diff --git a/src/CommunityToolkit.Mvvm.SourceGenerators/CommunityToolkit.Mvvm.SourceGenerators.projitems b/src/CommunityToolkit.Mvvm.SourceGenerators/CommunityToolkit.Mvvm.SourceGenerators.projitems index 91866191..5e950360 100644 --- a/src/CommunityToolkit.Mvvm.SourceGenerators/CommunityToolkit.Mvvm.SourceGenerators.projitems +++ b/src/CommunityToolkit.Mvvm.SourceGenerators/CommunityToolkit.Mvvm.SourceGenerators.projitems @@ -55,6 +55,7 @@ + diff --git a/src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/ObservablePropertyGenerator.cs b/src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/ObservablePropertyGenerator.cs index e97cfed2..a1f4e942 100644 --- a/src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/ObservablePropertyGenerator.cs +++ b/src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/ObservablePropertyGenerator.cs @@ -4,7 +4,6 @@ using System.Collections.Immutable; using System.Linq; -using System.Text; using CommunityToolkit.Mvvm.SourceGenerators.ComponentModel.Models; using CommunityToolkit.Mvvm.SourceGenerators.Extensions; using CommunityToolkit.Mvvm.SourceGenerators.Helpers; @@ -75,7 +74,7 @@ public sealed partial class ObservablePropertyGenerator : IIncrementalGenerator // Insert all members into the same partial type declaration CompilationUnitSyntax compilationUnit = item.Hierarchy.GetCompilationUnit(memberDeclarations); - context.AddSource($"{item.Hierarchy.FilenameHint}.g.cs", compilationUnit.GetText(Encoding.UTF8)); + context.AddSource($"{item.Hierarchy.FilenameHint}.g.cs", compilationUnit); }); // Gather all property changing names @@ -92,7 +91,7 @@ public sealed partial class ObservablePropertyGenerator : IIncrementalGenerator if (compilationUnit is not null) { - context.AddSource("__KnownINotifyPropertyChangingArgs.g.cs", compilationUnit.GetText(Encoding.UTF8)); + context.AddSource("__KnownINotifyPropertyChangingArgs.g.cs", compilationUnit); } }); @@ -110,7 +109,7 @@ public sealed partial class ObservablePropertyGenerator : IIncrementalGenerator if (compilationUnit is not null) { - context.AddSource("__KnownINotifyPropertyChangedArgs.g.cs", compilationUnit.GetText(Encoding.UTF8)); + context.AddSource("__KnownINotifyPropertyChangedArgs.g.cs", compilationUnit); } }); } diff --git a/src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/ObservableValidatorValidateAllPropertiesGenerator.cs b/src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/ObservableValidatorValidateAllPropertiesGenerator.cs index 66ddec01..b4a5b153 100644 --- a/src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/ObservableValidatorValidateAllPropertiesGenerator.cs +++ b/src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/ObservableValidatorValidateAllPropertiesGenerator.cs @@ -3,7 +3,6 @@ // See the LICENSE file in the project root for more information. using System.Linq; -using System.Text; using CommunityToolkit.Mvvm.SourceGenerators.ComponentModel.Models; using CommunityToolkit.Mvvm.SourceGenerators.Extensions; using Microsoft.CodeAnalysis; @@ -79,7 +78,7 @@ public sealed partial class ObservableValidatorValidateAllPropertiesGenerator : { CompilationUnitSyntax compilationUnit = Execute.GetSyntax(item); - context.AddSource("__ObservableValidatorExtensions.g.cs", compilationUnit.GetText(Encoding.UTF8)); + context.AddSource("__ObservableValidatorExtensions.g.cs", compilationUnit); }); // Generate the class with all validation methods @@ -87,7 +86,7 @@ public sealed partial class ObservableValidatorValidateAllPropertiesGenerator : { CompilationUnitSyntax compilationUnit = Execute.GetSyntax(item); - context.AddSource($"{item.FilenameHint}.g.cs", compilationUnit.GetText(Encoding.UTF8)); + context.AddSource($"{item.FilenameHint}.g.cs", compilationUnit); }); } } diff --git a/src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/TransitiveMembersGenerator.cs b/src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/TransitiveMembersGenerator.cs index fc430a04..f2d766fe 100644 --- a/src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/TransitiveMembersGenerator.cs +++ b/src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/TransitiveMembersGenerator.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Immutable; using System.Linq; -using System.Text; using CommunityToolkit.Mvvm.SourceGenerators.Extensions; using CommunityToolkit.Mvvm.SourceGenerators.Models; using Microsoft.CodeAnalysis; @@ -108,7 +107,7 @@ public abstract partial class TransitiveMembersGenerator : IIncrementalGe ImmutableArray updatedMemberDeclarations = Execute.AdjustMemberDeclarationNullabilityAnnotations(filteredMemberDeclarations, item.MetadataInfo.IsNullabilitySupported); CompilationUnitSyntax compilationUnit = item.Hierarchy.GetCompilationUnit(updatedMemberDeclarations, this.classDeclaration.BaseList); - context.AddSource($"{item.Hierarchy.FilenameHint}.g.cs", compilationUnit.GetText(Encoding.UTF8)); + context.AddSource($"{item.Hierarchy.FilenameHint}.g.cs", compilationUnit); }); } diff --git a/src/CommunityToolkit.Mvvm.SourceGenerators/Extensions/SourceProductionContextExtensions.cs b/src/CommunityToolkit.Mvvm.SourceGenerators/Extensions/SourceProductionContextExtensions.cs new file mode 100644 index 00000000..6eed14e6 --- /dev/null +++ b/src/CommunityToolkit.Mvvm.SourceGenerators/Extensions/SourceProductionContextExtensions.cs @@ -0,0 +1,33 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace CommunityToolkit.Mvvm.SourceGenerators.Extensions; + +/// +/// Extension methods for the type. +/// +internal static class SourceProductionContextExtensions +{ + /// + /// Adds a new source file to a target instance. + /// + /// The input instance to use. + /// The name of the source file to add. + /// The instance representing the syntax tree to add. + public static void AddSource(this SourceProductionContext context, string name, CompilationUnitSyntax compilationUnit) + { +#if !ROSLYN_4_3_1_OR_GREATER + // We're fine with the extra allocation in the few cases where adjusting the filename is necessary. + // This will only ever be done when code generation is executed again anyway, which is a slow path. + name = name.Replace('+', '_').Replace('`', '_'); +#endif + + // Add the UTF8 text for the input compilation unit + context.AddSource(name, compilationUnit.GetText(Encoding.UTF8)); + } +} diff --git a/src/CommunityToolkit.Mvvm.SourceGenerators/Input/RelayCommandGenerator.cs b/src/CommunityToolkit.Mvvm.SourceGenerators/Input/RelayCommandGenerator.cs index 78bdb229..46b64a56 100644 --- a/src/CommunityToolkit.Mvvm.SourceGenerators/Input/RelayCommandGenerator.cs +++ b/src/CommunityToolkit.Mvvm.SourceGenerators/Input/RelayCommandGenerator.cs @@ -4,7 +4,6 @@ using System.Collections.Immutable; using System.Linq; -using System.Text; using CommunityToolkit.Mvvm.SourceGenerators.Extensions; using CommunityToolkit.Mvvm.SourceGenerators.Input.Models; using CommunityToolkit.Mvvm.SourceGenerators.Models; @@ -61,7 +60,7 @@ public sealed partial class RelayCommandGenerator : IIncrementalGenerator ImmutableArray memberDeclarations = Execute.GetSyntax(item.Info.Value); CompilationUnitSyntax compilationUnit = item.Hierarchy.GetCompilationUnit(memberDeclarations); - context.AddSource($"{item.Hierarchy.FilenameHint}.{item.Info.Value.MethodName}.g.cs", compilationUnit.GetText(Encoding.UTF8)); + context.AddSource($"{item.Hierarchy.FilenameHint}.{item.Info.Value.MethodName}.g.cs", compilationUnit); }); } } diff --git a/src/CommunityToolkit.Mvvm.SourceGenerators/Messaging/IMessengerRegisterAllGenerator.cs b/src/CommunityToolkit.Mvvm.SourceGenerators/Messaging/IMessengerRegisterAllGenerator.cs index 03d8319e..a9ee5b06 100644 --- a/src/CommunityToolkit.Mvvm.SourceGenerators/Messaging/IMessengerRegisterAllGenerator.cs +++ b/src/CommunityToolkit.Mvvm.SourceGenerators/Messaging/IMessengerRegisterAllGenerator.cs @@ -4,7 +4,6 @@ using System.Collections.Immutable; using System.Linq; -using System.Text; using CommunityToolkit.Mvvm.SourceGenerators.Extensions; using CommunityToolkit.Mvvm.SourceGenerators.Messaging.Models; using Microsoft.CodeAnalysis; @@ -84,7 +83,7 @@ public sealed partial class IMessengerRegisterAllGenerator : IIncrementalGenerat { CompilationUnitSyntax compilationUnit = Execute.GetSyntax(item); - context.AddSource("__IMessengerExtensions.g.cs", compilationUnit.GetText(Encoding.UTF8)); + context.AddSource("__IMessengerExtensions.g.cs", compilationUnit); }); // Generate the class with all registration methods @@ -92,7 +91,7 @@ public sealed partial class IMessengerRegisterAllGenerator : IIncrementalGenerat { CompilationUnitSyntax compilationUnit = Execute.GetSyntax(item); - context.AddSource($"{item.FilenameHint}.g.cs", compilationUnit.GetText(Encoding.UTF8)); + context.AddSource($"{item.FilenameHint}.g.cs", compilationUnit); }); } }