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);
});
}
}