Skip to content

Commit 1de395c

Browse files
authored
Merge pull request #436 from CommunityToolkit/dev/use-fawmn
Use ForAttributeWithMetadataName<T> when possible
2 parents f73ff85 + f50c392 commit 1de395c

File tree

40 files changed

+778
-227
lines changed

40 files changed

+778
-227
lines changed

CommunityToolkit.Common/Extensions/TaskExtensions.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,10 @@ public static class TaskExtensions
2626
/// and uses reflection to access the <see cref="Task{TResult}.Result"/> property and boxes the result if it's
2727
/// a value type, which adds overhead. It should only be used when using generics is not possible.
2828
/// </remarks>
29-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
30-
public static object? GetResultOrDefault(
3129
#if NET6_0_OR_GREATER
32-
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
30+
[RequiresUnreferencedCode("This method uses reflection to try to access the Task<T>.Result property of the input Task instance.")]
3331
#endif
34-
this Task task)
32+
public static object? GetResultOrDefault(this Task task)
3533
{
3634
// Check if the instance is a completed Task
3735
if (
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<Import Project="..\CommunityToolkit.Mvvm.SourceGenerators\CommunityToolkit.Mvvm.SourceGenerators.props" />
4+
<Import Project="..\CommunityToolkit.Mvvm.SourceGenerators\CommunityToolkit.Mvvm.SourceGenerators.projitems" Label="Shared" />
5+
6+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<Import Project="..\CommunityToolkit.Mvvm.SourceGenerators\CommunityToolkit.Mvvm.SourceGenerators.props" />
4+
<Import Project="..\CommunityToolkit.Mvvm.SourceGenerators\CommunityToolkit.Mvvm.SourceGenerators.projitems" Label="Shared" />
5+
6+
</Project>

CommunityToolkit.Mvvm.SourceGenerators/Attributes/NullabilityAttributesGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
6767
private static string LoadAttributeSourceWithMetadataName(string typeFullName)
6868
{
6969
string typeName = typeFullName.Split('.').Last();
70-
string filename = $"CommunityToolkit.Mvvm.SourceGenerators.EmbeddedResources.{typeName}.cs";
70+
string filename = $"{typeName}.cs";
7171

7272
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(filename);
7373
StreamReader reader = new(stream);

CommunityToolkit.Mvvm.SourceGenerators/CommunityToolkit.Mvvm.SourceGenerators.csproj

Lines changed: 0 additions & 66 deletions
This file was deleted.
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<PropertyGroup>
4+
<MSBuildAllProjects Condition="'$(MSBuildVersion)' == '' Or '$(MSBuildVersion)' &lt; '16.0'">$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
5+
<HasSharedItems>true</HasSharedItems>
6+
<SharedGUID>5e7f1212-a54b-40ca-98c5-1ff5cd1a1638</SharedGUID>
7+
</PropertyGroup>
8+
<PropertyGroup Label="Configuration">
9+
<Import_RootNamespace>CommunityToolkit.Mvvm.SourceGenerators</Import_RootNamespace>
10+
</PropertyGroup>
11+
<ItemGroup>
12+
<EmbeddedResource Include="$(MSBuildThisFileDirectory)EmbeddedResources\INotifyPropertyChanged.cs">
13+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
14+
<LogicalName>INotifyPropertyChanged.cs</LogicalName>
15+
</EmbeddedResource>
16+
<EmbeddedResource Include="$(MSBuildThisFileDirectory)EmbeddedResources\NotNullAttribute.cs">
17+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
18+
<LogicalName>NotNullAttribute.cs</LogicalName>
19+
</EmbeddedResource>
20+
<EmbeddedResource Include="$(MSBuildThisFileDirectory)EmbeddedResources\NotNullIfNotNullAttribute.cs">
21+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
22+
<LogicalName>NotNullIfNotNullAttribute.cs</LogicalName>
23+
</EmbeddedResource>
24+
<EmbeddedResource Include="$(MSBuildThisFileDirectory)EmbeddedResources\ObservableObject.cs">
25+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
26+
<LogicalName>ObservableObject.cs</LogicalName>
27+
</EmbeddedResource>
28+
<EmbeddedResource Include="$(MSBuildThisFileDirectory)EmbeddedResources\ObservableRecipient.cs">
29+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
30+
<LogicalName>ObservableRecipient.cs</LogicalName>
31+
</EmbeddedResource>
32+
</ItemGroup>
33+
<ItemGroup>
34+
<Compile Include="$(MSBuildThisFileDirectory)Attributes\NotNullWhenAttribute.cs" />
35+
<Compile Include="$(MSBuildThisFileDirectory)Attributes\NullabilityAttributesGenerator.cs" />
36+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\INotifyPropertyChangedGenerator.cs" />
37+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\Models\AttributeInfo.cs" />
38+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\Models\INotifyPropertyChangedInfo.cs" />
39+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\Models\ObservableRecipientInfo.cs" />
40+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\Models\PropertyInfo.cs" />
41+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\Models\TypedConstantInfo.Comparer.cs" />
42+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\Models\TypedConstantInfo.cs" />
43+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\Models\TypedConstantInfo.Factory.cs" />
44+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\Models\ValidationInfo.cs" />
45+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\ObservableObjectGenerator.cs" />
46+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\ObservablePropertyGenerator.cs" />
47+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\ObservablePropertyGenerator.Execute.cs" />
48+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\ObservableRecipientGenerator.cs" />
49+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\ObservableValidatorValidateAllPropertiesGenerator.cs" />
50+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\ObservableValidatorValidateAllPropertiesGenerator.Execute.cs" />
51+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\TransitiveMembersGenerator.cs" />
52+
<Compile Include="$(MSBuildThisFileDirectory)ComponentModel\TransitiveMembersGenerator.Execute.cs" />
53+
<Compile Include="$(MSBuildThisFileDirectory)Diagnostics\Analyzers\FieldWithOrphanedDependentObservablePropertyAttributesAnalyzer.cs" />
54+
<Compile Include="$(MSBuildThisFileDirectory)Diagnostics\Analyzers\UnsupportedCSharpLanguageVersionAnalyzer.cs" />
55+
<Compile Include="$(MSBuildThisFileDirectory)Diagnostics\DiagnosticDescriptors.cs" />
56+
<Compile Include="$(MSBuildThisFileDirectory)Diagnostics\DiagnosticExtensions.cs" />
57+
<Compile Include="$(MSBuildThisFileDirectory)Extensions\AttributeDataExtensions.cs" />
58+
<Compile Include="$(MSBuildThisFileDirectory)Extensions\CompilationExtensions.cs" />
59+
<Compile Include="$(MSBuildThisFileDirectory)Extensions\HashCodeExtensions.cs" />
60+
<Compile Include="$(MSBuildThisFileDirectory)Extensions\IEqualityComparerExtensions.cs" />
61+
<Compile Include="$(MSBuildThisFileDirectory)Extensions\INamedTypeSymbolExtensions.cs" />
62+
<Compile Include="$(MSBuildThisFileDirectory)Extensions\IncrementalGeneratorInitializationContextExtensions.cs" />
63+
<Compile Include="$(MSBuildThisFileDirectory)Extensions\IncrementalValuesProviderExtensions.cs" />
64+
<Compile Include="$(MSBuildThisFileDirectory)Extensions\ISymbolExtensions.cs" />
65+
<Compile Include="$(MSBuildThisFileDirectory)Extensions\ITypeSymbolExtensions.cs" />
66+
<Compile Include="$(MSBuildThisFileDirectory)Extensions\MemberDeclarationSyntaxExtensions.cs" />
67+
<Compile Include="$(MSBuildThisFileDirectory)Extensions\SyntaxNodeExtensions.cs" />
68+
<Compile Include="$(MSBuildThisFileDirectory)Extensions\TypeDeclarationSyntaxExtensions.cs" />
69+
<Compile Include="$(MSBuildThisFileDirectory)Helpers\Comparer{T,TSelf}.cs" />
70+
<Compile Include="$(MSBuildThisFileDirectory)Helpers\HashCode.cs" />
71+
<Compile Include="$(MSBuildThisFileDirectory)Input\Models\CanExecuteExpressionType.cs" />
72+
<Compile Include="$(MSBuildThisFileDirectory)Input\Models\CommandInfo.cs" />
73+
<Compile Include="$(MSBuildThisFileDirectory)Input\RelayCommandGenerator.cs" />
74+
<Compile Include="$(MSBuildThisFileDirectory)Input\RelayCommandGenerator.Execute.cs" />
75+
<Compile Include="$(MSBuildThisFileDirectory)Messaging\IMessengerRegisterAllGenerator.cs" />
76+
<Compile Include="$(MSBuildThisFileDirectory)Messaging\IMessengerRegisterAllGenerator.Execute.cs" />
77+
<Compile Include="$(MSBuildThisFileDirectory)Messaging\Models\RecipientInfo.cs" />
78+
<Compile Include="$(MSBuildThisFileDirectory)Models\HierarchyInfo.cs" />
79+
<Compile Include="$(MSBuildThisFileDirectory)Models\HierarchyInfo.Syntax.cs" />
80+
<Compile Include="$(MSBuildThisFileDirectory)Models\Result.cs" />
81+
<Compile Include="$(MSBuildThisFileDirectory)Models\TypeInfo.cs" />
82+
<Compile Include="$(MSBuildThisFileDirectory)Polyfills\GeneratorAttributeSyntaxContext.cs" />
83+
<Compile Include="$(MSBuildThisFileDirectory)Polyfills\SyntaxValueProviderExtensions.cs" />
84+
<Compile Include="$(MSBuildThisFileDirectory)System.Runtime.CompilerServices\IsExternalInit.cs" />
85+
</ItemGroup>
86+
<ItemGroup>
87+
<AdditionalFiles Include="$(MSBuildThisFileDirectory)AnalyzerReleases.Shipped.md" />
88+
<AdditionalFiles Include="$(MSBuildThisFileDirectory)AnalyzerReleases.Unshipped.md" />
89+
</ItemGroup>
90+
<ItemGroup>
91+
<None Include="$(MSBuildThisFileDirectory)CommunityToolkit.Mvvm.SourceGenerators.props" />
92+
</ItemGroup>
93+
</Project>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<Project>
2+
3+
<PropertyGroup>
4+
<TargetFramework>netstandard2.0</TargetFramework>
5+
<IsPackable>false</IsPackable>
6+
</PropertyGroup>
7+
8+
<!--
9+
The MVVM Toolkit source generators rely on Roslyn multi-targeting to support multiple versions of the Microsoft.CodeAnalysis.CSharp package.
10+
This package reference actually needs a matching version of Roslyn to be available for consumers of the source generator, so if we always
11+
used the latest version, the MVVM Toolkit would just fail to load for users of eg. an older version of Visual Studio. Thankfully, Roslyn
12+
supports analyzers that bundle multiple versions in the same NuGet package, each in a subfolder with a name matching the Roslyn version.
13+
To leverage this, this project receives the MvvmToolkitSourceGeneratorRoslynVersion property as input, so that the MVVM Toolkit can build
14+
it multiple times with multiple versions during packing, to then extract each .dll and copy it to the right NuGet package folder.
15+
-->
16+
<PropertyGroup>
17+
18+
<!-- Set the assembly name to always be the same, regardless of the Roslyn version being targeted (cut the trailing ".RoslynXYZ" suffix) -->
19+
<AssemblyName>$(MSBuildProjectName.Substring(0, $([MSBuild]::Subtract($(MSBuildProjectName.Length), 10))))</AssemblyName>
20+
21+
<!--
22+
Get the Roslyn version to use from the name of the project importing this .props file.
23+
All projects will use the "<PROJECT_NAME>.Roslyn<MAJOR><MINOR><PATCH>.csproj" naming scheme.
24+
-->
25+
<MvvmToolkitSourceGeneratorRoslynMajorVersion>$(MSBuildProjectName.Substring($([MSBuild]::Subtract($(MSBuildProjectName.Length), 3)), 1))</MvvmToolkitSourceGeneratorRoslynMajorVersion>
26+
<MvvmToolkitSourceGeneratorRoslynMinorVersion>$(MSBuildProjectName.Substring($([MSBuild]::Subtract($(MSBuildProjectName.Length), 2)), 1))</MvvmToolkitSourceGeneratorRoslynMinorVersion>
27+
<MvvmToolkitSourceGeneratorRoslynPatchVersion>$(MSBuildProjectName.Substring($([MSBuild]::Subtract($(MSBuildProjectName.Length), 1)), 1))</MvvmToolkitSourceGeneratorRoslynPatchVersion>
28+
<MvvmToolkitSourceGeneratorRoslynVersion>$(MvvmToolkitSourceGeneratorRoslynMajorVersion).$(MvvmToolkitSourceGeneratorRoslynMinorVersion).$(MvvmToolkitSourceGeneratorRoslynPatchVersion)</MvvmToolkitSourceGeneratorRoslynVersion>
29+
30+
<!-- Workaround for https://github.com/dotnet/roslyn/issues/63919 -->
31+
<MvvmToolkitSourceGeneratorRoslynVersion Condition="'$(MvvmToolkitSourceGeneratorRoslynVersion)' == '4.3.0'">4.4.0-1.final</MvvmToolkitSourceGeneratorRoslynVersion>
32+
33+
<!-- Also define "ROSLYN_<MAJOR>_<MINOR>_OR_GREATER" build constants, so the generator code can multi-target whenever needed and add any required polyfills -->
34+
<DefineConstants Condition="$([MSBuild]::VersionGreaterThanOrEquals($(MvvmToolkitSourceGeneratorRoslynVersion), 4.3))">$(DefineConstants);ROSLYN_4_3_0_OR_GREATER</DefineConstants>
35+
</PropertyGroup>
36+
37+
<ItemGroup>
38+
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="$(MvvmToolkitSourceGeneratorRoslynVersion)" PrivateAssets="all" Pack="false" />
39+
</ItemGroup>
40+
41+
</Project>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<PropertyGroup Label="Globals">
4+
<ProjectGuid>5e7f1212-a54b-40ca-98c5-1ff5cd1a1638</ProjectGuid>
5+
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
6+
</PropertyGroup>
7+
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
8+
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.Default.props" />
9+
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.props" />
10+
<PropertyGroup />
11+
<Import Project="CommunityToolkit.Mvvm.SourceGenerators.projitems" Label="Shared" />
12+
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.CSharp.targets" />
13+
</Project>

CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/INotifyPropertyChangedGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public sealed class INotifyPropertyChangedGenerator : TransitiveMembersGenerator
2323
/// Initializes a new instance of the <see cref="INotifyPropertyChangedGenerator"/> class.
2424
/// </summary>
2525
public INotifyPropertyChangedGenerator()
26-
: base("global::CommunityToolkit.Mvvm.ComponentModel.INotifyPropertyChangedAttribute")
26+
: base("CommunityToolkit.Mvvm.ComponentModel.INotifyPropertyChangedAttribute")
2727
{
2828
}
2929

CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/ObservableObjectGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public sealed class ObservableObjectGenerator : TransitiveMembersGenerator<objec
2222
/// Initializes a new instance of the <see cref="ObservableObjectGenerator"/> class.
2323
/// </summary>
2424
public ObservableObjectGenerator()
25-
: base("global::CommunityToolkit.Mvvm.ComponentModel.ObservableObjectAttribute")
25+
: base("CommunityToolkit.Mvvm.ComponentModel.ObservableObjectAttribute")
2626
{
2727
}
2828

0 commit comments

Comments
 (0)