فهرست منبع

Setup generators project in the repository, use in the control catalog

Max Katz 2 سال پیش
والد
کامیت
30d1dc7e61

+ 14 - 0
Avalonia.sln

@@ -244,6 +244,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Controls.ItemsRepe
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Controls.ItemsRepeater.UnitTests", "tests\Avalonia.Controls.ItemsRepeater.UnitTests\Avalonia.Controls.ItemsRepeater.UnitTests.csproj", "{F4E36AA8-814E-4704-BC07-291F70F45193}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Generators", "src\tools\Avalonia.Generators\Avalonia.Generators.csproj", "{DDA28789-C21A-4654-86CE-D01E81F095C5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Generators.Tests", "tests\Avalonia.Generators.Tests\Avalonia.Generators.Tests.csproj", "{2D7C812B-7E73-4252-8EFD-BC8A4D5CCB9F}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -571,6 +575,14 @@ Global
 		{C692FE73-43DB-49CE-87FC-F03ED61F25C9}.Debug|Any CPU.Build.0 = Release|Any CPU
 		{C692FE73-43DB-49CE-87FC-F03ED61F25C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{C692FE73-43DB-49CE-87FC-F03ED61F25C9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DDA28789-C21A-4654-86CE-D01E81F095C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DDA28789-C21A-4654-86CE-D01E81F095C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DDA28789-C21A-4654-86CE-D01E81F095C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DDA28789-C21A-4654-86CE-D01E81F095C5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2D7C812B-7E73-4252-8EFD-BC8A4D5CCB9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2D7C812B-7E73-4252-8EFD-BC8A4D5CCB9F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2D7C812B-7E73-4252-8EFD-BC8A4D5CCB9F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2D7C812B-7E73-4252-8EFD-BC8A4D5CCB9F}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -638,6 +650,8 @@ Global
 		{C810060E-3809-4B74-A125-F11533AF9C1B} = {9B9E3891-2366-4253-A952-D08BCEB71098}
 		{F4E36AA8-814E-4704-BC07-291F70F45193} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
 		{C692FE73-43DB-49CE-87FC-F03ED61F25C9} = {4ED8B739-6F4E-4CD4-B993-545E6B5CE637}
+		{DDA28789-C21A-4654-86CE-D01E81F095C5} = {4ED8B739-6F4E-4CD4-B993-545E6B5CE637}
+		{2D7C812B-7E73-4252-8EFD-BC8A4D5CCB9F} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {87366D66-1391-4D90-8999-95A620AD786A}

+ 16 - 1
build/SourceGenerators.props

@@ -1,5 +1,10 @@
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
+  <PropertyGroup>
+    <IncludeDevGenerators Condition="'$(IncludeDevGenerators)' == ''">true</IncludeDevGenerators>
+    <IncludeAvaloniaGenerators Condition="'$(IncludeAvaloniaGenerators)' == ''">false</IncludeAvaloniaGenerators>
+  </PropertyGroup>
+
+  <ItemGroup Condition="'$(IncludeDevGenerators)' == 'true'">
     <ProjectReference 
       Include="$(MSBuildThisFileDirectory)/../src/tools/DevGenerators/DevGenerators.csproj"
       OutputItemType="Analyzer" 
@@ -7,4 +12,14 @@
       PrivateAssets="all" />
     <Compile Include="$(MSBuildThisFileDirectory)/../src/Shared/SourceGeneratorAttributes.cs" />
   </ItemGroup>
+
+  <ItemGroup Condition="'$(IncludeAvaloniaGenerators)' == 'true'">
+    <ProjectReference
+      Include="../../src/tools/Avalonia.Generators/Avalonia.Generators.csproj"
+      OutputItemType="Analyzer"
+      ReferenceOutputAssembly="false"
+      PrivateAssets="all" />
+  </ItemGroup>
+  <Import Project="$(MSBuildThisFileDirectory)/../src/tools/Avalonia.Generators/Avalonia.Generators.props"
+          Condition="'$(IncludeDevGenerators)' == 'true'" />
 </Project>

+ 3 - 11
samples/ControlCatalog/ControlCatalog.csproj

@@ -2,7 +2,8 @@
   <PropertyGroup>
     <TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <Nullable>enable</Nullable>    
+    <Nullable>enable</Nullable>
+    <IncludeAvaloniaGenerators>true</IncludeAvaloniaGenerators>
   </PropertyGroup>
   <ItemGroup>
     <Compile Update="**\*.xaml.cs">
@@ -34,14 +35,5 @@
   </ItemGroup>
 
   <Import Project="..\..\build\BuildTargets.targets" />
-
-  <ItemGroup>
-    <None Remove="Pages\CustomDrawing.xaml" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <AvaloniaResource Update="Pages\CustomDrawing.xaml">
-      <Generator></Generator>
-    </AvaloniaResource>
-  </ItemGroup>
+  <Import Project="..\..\build\SourceGenerators.props" />
 </Project>

+ 1 - 7
samples/ControlCatalog/Pages/FlyoutsPage.axaml.cs

@@ -1,11 +1,10 @@
 using Avalonia.Controls;
 using Avalonia.Controls.Primitives;
-using Avalonia.Markup.Xaml;
 using Avalonia.Interactivity;
 
 namespace ControlCatalog.Pages
 {
-    public class FlyoutsPage : UserControl
+    public partial class FlyoutsPage : UserControl
     {
         public FlyoutsPage()
         {
@@ -28,11 +27,6 @@ namespace ControlCatalog.Pages
             }
         }
 
-        private void InitializeComponent()
-        {
-            AvaloniaXamlLoader.Load(this);
-        }
-
         private void SetXamlTexts()
         {
             var bfxt = this.Get<TextBlock>("ButtonFlyoutXamlText");

+ 2 - 9
samples/ControlCatalog/Pages/LabelsPage.axaml.cs

@@ -1,11 +1,9 @@
-using Avalonia;
-using Avalonia.Controls;
-using Avalonia.Markup.Xaml;
+using Avalonia.Controls;
 using ControlCatalog.Models;
 
 namespace ControlCatalog.Pages
 {
-    public class LabelsPage : UserControl
+    public partial class LabelsPage : UserControl
     {
         private Person? _person;
 
@@ -25,11 +23,6 @@ namespace ControlCatalog.Pages
             };
         }
 
-        private void InitializeComponent()
-        {
-            AvaloniaXamlLoader.Load(this);
-        }
-
         public void DoSave()
         {
             

+ 3 - 11
samples/ControlCatalog/Pages/RefreshContainerPage.axaml.cs

@@ -1,18 +1,15 @@
-using System.Threading.Tasks;
-using Avalonia;
-using Avalonia.Controls;
-using Avalonia.Markup.Xaml;
+using Avalonia.Controls;
 using ControlCatalog.ViewModels;
 
 namespace ControlCatalog.Pages
 {
-    public class RefreshContainerPage : UserControl
+    public partial class RefreshContainerPage : UserControl
     {
         private RefreshContainerViewModel _viewModel;
 
         public RefreshContainerPage()
         {
-            this.InitializeComponent();
+            InitializeComponent();
 
             _viewModel = new RefreshContainerViewModel();
 
@@ -27,10 +24,5 @@ namespace ControlCatalog.Pages
 
             deferral.Complete();
         }
-
-        private void InitializeComponent()
-        {
-            AvaloniaXamlLoader.Load(this);
-        }
     }
 }

+ 3 - 10
samples/ControlCatalog/Pages/RelativePanelPage.axaml.cs

@@ -1,19 +1,12 @@
-using Avalonia;
-using Avalonia.Controls;
-using Avalonia.Markup.Xaml;
+using Avalonia.Controls;
 
 namespace ControlCatalog.Pages
 {
-    public class RelativePanelPage : UserControl
+    public partial class RelativePanelPage : UserControl
     {
         public RelativePanelPage()
         {
-            this.InitializeComponent();
-        }
-
-        private void InitializeComponent()
-        {
-            AvaloniaXamlLoader.Load(this);
+            InitializeComponent();
         }
     }
 }

+ 8 - 12
samples/ControlCatalog/Pages/ThemePage.axaml.cs

@@ -1,35 +1,31 @@
-using Avalonia;
-using Avalonia.Controls;
+using Avalonia.Controls;
 using Avalonia.Markup.Xaml;
 using Avalonia.Styling;
 
 namespace ControlCatalog.Pages
 {
-    public class ThemePage : UserControl
+    public partial class ThemePage : UserControl
     {
         public static ThemeVariant Pink { get; } = new("Pink", ThemeVariant.Light);
         
         public ThemePage()
         {
-            AvaloniaXamlLoader.Load(this);
+            InitializeComponent();
 
-            var selector = this.FindControl<ComboBox>("Selector")!;
-            var themeVariantScope = this.FindControl<ThemeVariantScope>("ThemeVariantScope")!;
-
-            selector.Items = new[]
+            Selector.Items = new[]
             {
                 ThemeVariant.Default,
                 ThemeVariant.Dark,
                 ThemeVariant.Light,
                 Pink
             };
-            selector.SelectedIndex = 0;
+            Selector.SelectedIndex = 0;
 
-            selector.SelectionChanged += (_, _) =>
+            Selector.SelectionChanged += (_, _) =>
             {
-                if (selector.SelectedItem is ThemeVariant theme)
+                if (Selector.SelectedItem is ThemeVariant theme)
                 {
-                    themeVariantScope.RequestedThemeVariant = theme;
+                    ThemeVariantScope.RequestedThemeVariant = theme;
                 }
             };
         }

+ 29 - 28
src/tools/Avalonia.Generators/Avalonia.Generators.csproj

@@ -1,29 +1,30 @@
-<Project Sdk="Microsoft.NET.Sdk">
-    <PropertyGroup>
-        <TargetFramework>netstandard2.0</TargetFramework>
-        <LangVersion>preview</LangVersion>
-        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
-        <IncludeBuildOutput>false</IncludeBuildOutput>
-        <PackageId>XamlNameReferenceGenerator</PackageId>
-        <NoPackageAnalysis>true</NoPackageAnalysis>
-        <RootNamespace>Avalonia.Generators</RootNamespace>
-        <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
-    </PropertyGroup>
-    <ItemGroup>
-        <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.9.0" PrivateAssets="all" />
-        <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
-    </ItemGroup>
-    <ItemGroup>
-        <Compile Link="XamlX\filename" Include="../../external/XamlX/src/XamlX/**/*.cs" />
-        <Compile Remove="../../external/XamlX/src/XamlX/**/SreTypeSystem.cs" />
-    </ItemGroup>
-    <ItemGroup>
-      <None Include="Avalonia.Generators.props">
-         <Pack>true</Pack>
-         <PackagePath>buildTransitive\$(PackageId).props</PackagePath>
-      </None>
-    </ItemGroup>
-    <ItemGroup>
-        <None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
-    </ItemGroup>
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+    <IncludeBuildOutput>false</IncludeBuildOutput>
+    <PackageId>Avalonia.Generators</PackageId>
+    <DefineConstants>$(DefineConstants);XAMLX_INTERNAL</DefineConstants>
+    <IsPackable>true</IsPackable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.4.0" PrivateAssets="all" />
+    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Link="XamlX\filename" Include="../../Markup/Avalonia.Markup.Xaml.Loader/xamlil.github/src/XamlX/**/*.cs" />
+    <Compile Remove="../../Markup/Avalonia.Markup.Xaml.Loader/xamlil.github/src/XamlX/**/SreTypeSystem.cs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Include="Avalonia.Generators.props" Pack="true" PackagePath="buildTransitive/$(PackageId).props" />
+    <None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
+  </ItemGroup>
+
+  <ItemGroup Label="InternalsVisibleTo">
+    <InternalsVisibleTo Include="Avalonia.Generators.Tests, PublicKey=$(AvaloniaPublicKey)" />
+  </ItemGroup>
+
+  <Import Project="..\..\..\build\TrimmingEnable.props" />
 </Project>

+ 8 - 8
src/tools/Avalonia.Generators/Compiler/RoslynTypeSystem.cs

@@ -7,7 +7,7 @@ using XamlX.TypeSystem;
 
 namespace Avalonia.Generators.Compiler;
 
-public class RoslynTypeSystem : IXamlTypeSystem
+internal class RoslynTypeSystem : IXamlTypeSystem
 {
     private readonly List<IXamlAssembly> _assemblies = new();
 
@@ -42,7 +42,7 @@ public class RoslynTypeSystem : IXamlTypeSystem
             .FirstOrDefault(type => type != null);
 }
     
-public class RoslynAssembly : IXamlAssembly
+internal class RoslynAssembly : IXamlAssembly
 {
     private readonly IAssemblySymbol _symbol;
 
@@ -66,7 +66,7 @@ public class RoslynAssembly : IXamlAssembly
     }
 }
 
-public class RoslynAttribute : IXamlCustomAttribute
+internal class RoslynAttribute : IXamlCustomAttribute
 {
     private readonly AttributeData _data;
     private readonly RoslynAssembly _assembly;
@@ -94,7 +94,7 @@ public class RoslynAttribute : IXamlCustomAttribute
             pair => pair.Value.Value);
 }
     
-public class RoslynType : IXamlType
+internal class RoslynType : IXamlType
 {
     private static readonly SymbolDisplayFormat SymbolDisplayFormat = new SymbolDisplayFormat(
         typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces,
@@ -181,7 +181,7 @@ public class RoslynType : IXamlType
     public IReadOnlyList<IXamlType> GenericParameters { get; } = new List<IXamlType>();
 }
 
-public class RoslynConstructor : IXamlConstructor
+internal class RoslynConstructor : IXamlConstructor
 {
     private readonly IMethodSymbol _symbol;
     private readonly RoslynAssembly _assembly;
@@ -208,7 +208,7 @@ public class RoslynConstructor : IXamlConstructor
             .ToList();
 }
 
-public class RoslynProperty : IXamlProperty
+internal class RoslynProperty : IXamlProperty
 {
     private readonly IPropertySymbol _symbol;
     private readonly RoslynAssembly _assembly;
@@ -239,7 +239,7 @@ public class RoslynProperty : IXamlProperty
     public IReadOnlyList<IXamlType> IndexerParameters { get; } = new List<IXamlType>();
 }
 
-public class RoslynMethod : IXamlMethod
+internal class RoslynMethod : IXamlMethod
 {
     private readonly IMethodSymbol _symbol;
     private readonly RoslynAssembly _assembly;
@@ -273,4 +273,4 @@ public class RoslynMethod : IXamlMethod
     public IXamlMethod MakeGenericMethod(IReadOnlyList<IXamlType> typeArguments) => null;
 
     public IReadOnlyList<IXamlCustomAttribute> CustomAttributes { get; } = new List<IXamlCustomAttribute>();
-}
+}

+ 0 - 27
src/tools/Avalonia.Generators/Directory.Build.props

@@ -1,27 +0,0 @@
-<Project>
-    <PropertyGroup>
-        <Product>XamlNameReferenceGenerator</Product>
-        <PackageLicenseExpression>MIT</PackageLicenseExpression>
-        <PackageProjectUrl>https://github.com/avaloniaui/Avalonia.Generators/</PackageProjectUrl>
-        <Description>Generates typed x:Name references to Avalonia controls declared in XAML.</Description>
-        <PackageReleaseNotes>https://github.com/avaloniaui/Avalonia.Generators/releases</PackageReleaseNotes>
-        <RepositoryUrl>https://github.com/avaloniaui/Avalonia.Generators</RepositoryUrl>
-        <RepositoryType>git</RepositoryType>
-        <PublishRepositoryUrl>true</PublishRepositoryUrl>
-        <InstallAvalonia>false</InstallAvalonia>
-        <RestoreSources>
-            https://nuget.avaloniaui.net/repository/avalonia-all/index.json;
-            https://api.nuget.org/v3/index.json;
-        </RestoreSources>
-    </PropertyGroup>
-    <ItemGroup>
-        <PackageReference Include="Nerdbank.GitVersioning" Version="3.5.119" PrivateAssets="all" />
-    </ItemGroup>
-    <ItemGroup Condition="'$(InstallAvalonia)' == 'true'">
-        <PackageReference Include="Avalonia" Version="11.0.0-preview5" />
-        <PackageReference Include="Avalonia.Desktop" Version="11.0.0-preview5" />
-        <PackageReference Include="Avalonia.ReactiveUI" Version="11.0.0-preview5" />
-        <PackageReference Include="Avalonia.Diagnostics" Version="11.0.0-preview5" />
-        <PackageReference Include="Avalonia.Themes.Fluent" Version="11.0.0-preview5" />
-    </ItemGroup>
-</Project>

+ 1 - 3
src/tools/Avalonia.Generators/Generator.cs

@@ -6,8 +6,6 @@ using Avalonia.Generators.Generator;
 using Microsoft.CodeAnalysis;
 using Microsoft.CodeAnalysis.CSharp;
 
-[assembly: InternalsVisibleTo("Avalonia.Generators.Tests")]
-
 namespace Avalonia.Generators;
 
 [Generator]
@@ -50,4 +48,4 @@ public class AvaloniaNameSourceGenerator : ISourceGenerator
             new XamlXNameResolver(options.AvaloniaNameGeneratorDefaultFieldModifier),
             generator);
     }
-}
+}

+ 24 - 26
tests/Avalonia.Generators.Tests/Avalonia.Generators.Tests.csproj

@@ -1,28 +1,26 @@
 <Project Sdk="Microsoft.NET.Sdk">
-    <PropertyGroup>
-        <OutputType>Exe</OutputType>
-        <TargetFramework>net6</TargetFramework>
-        <LangVersion>preview</LangVersion>
-        <IsPackable>false</IsPackable>
-        <InstallAvalonia>true</InstallAvalonia>
-        <RootNamespace>Avalonia.Generators.Tests</RootNamespace>
-    </PropertyGroup>
-    <ItemGroup>
-        <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.9.0" />
-        <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="3.9.0" />
-        <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
-        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
-        <PackageReference Include="xunit" Version="2.4.2" />
-        <PackageReference Include="xunit.runner.console" Version="2.4.2" />
-        <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5" />
-    </ItemGroup>
-    <ItemGroup>
-        <EmbeddedResource Include="Views\*.xml" />
-        <EmbeddedResource Include="OnlyProperties\GeneratedCode\*.txt" />
-        <EmbeddedResource Include="InitializeComponent\GeneratedInitializeComponent\*.txt" />
-        <EmbeddedResource Include="InitializeComponent\GeneratedDevTools\*.txt" />
-    </ItemGroup>
-    <ItemGroup>
-      <ProjectReference Include="..\Avalonia.Generators\Avalonia.Generators.csproj" />
-    </ItemGroup>
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net6.0</TargetFramework>
+    <RootNamespace>Avalonia.Generators.Tests</RootNamespace>
+    <IsTestProject>true</IsTestProject>
+  </PropertyGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Avalonia.Base\Avalonia.Base.csproj" />
+    <ProjectReference Include="..\..\src\Avalonia.Controls\Avalonia.Controls.csproj" />
+    <ProjectReference Include="..\..\src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj" />
+    <ProjectReference Include="..\..\src\Avalonia.ReactiveUI\Avalonia.ReactiveUI.csproj" />
+    <ProjectReference Include="..\..\src\tools\Avalonia.Generators\Avalonia.Generators.csproj" />
+    <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.4.0" />
+    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Views\*.xml" />
+    <EmbeddedResource Include="OnlyProperties\GeneratedCode\*.txt" />
+    <EmbeddedResource Include="InitializeComponent\GeneratedInitializeComponent\*.txt" />
+    <EmbeddedResource Include="InitializeComponent\GeneratedDevTools\*.txt" />
+  </ItemGroup>
+  <Import Project="..\..\build\UnitTests.NetCore.targets" />
+  <Import Project="..\..\build\XUnit.props" />
+  <Import Project="..\..\build\SharedVersion.props" />
 </Project>