From 8efbca47a11402cc457933025d0a537d271b3c0f Mon Sep 17 00:00:00 2001 From: Stephane Delcroix Date: Fri, 1 Aug 2025 17:27:01 +0200 Subject: [PATCH] [XSG] inflator parameter removes newly introduced XamlProcessing attribute in favor of msbuild item metadata. prepare the work to obsolete XamlCompilationAttribute too --- Directory.Build.props | 10 ++ .../Resources/Styles/Colors.xaml | 1 - .../Resources/Styles/Styles.xaml | 1 - src/Controls/src/Build.Tasks/XamlCTask.cs | 120 ++++-------------- .../Microsoft.Maui.Controls.Common.targets | 10 +- .../Microsoft.Maui.Controls.targets | 40 +++++- .../src/SourceGen/CodeBehindCodeWriter.cs | 74 +++++------ .../src/SourceGen/CodeBehindGenerator.cs | 31 +++-- .../src/SourceGen/GeneratorHelpers.cs | 28 +++- .../src/SourceGen/ITypeSymbolExtensions.cs | 32 ----- .../InitializeComponentCodeWriter.cs | 80 ++++++------ src/Controls/src/SourceGen/ProjectItem.cs | 28 ++-- src/Controls/src/SourceGen/compat.cs | 47 +++++++ .../net-android/PublicAPI.Unshipped.txt | 8 -- .../PublicAPI/net-ios/PublicAPI.Unshipped.txt | 8 -- .../net-maccatalyst/PublicAPI.Unshipped.txt | 8 -- .../net-tizen/PublicAPI.Unshipped.txt | 8 -- .../net-windows/PublicAPI.Unshipped.txt | 8 -- .../PublicAPI/net/PublicAPI.Unshipped.txt | 8 -- .../netstandard/PublicAPI.Unshipped.txt | 8 -- .../src/Xaml/XamlCompilationAttribute.cs | 14 +- src/Controls/src/Xaml/XamlInflator.cs | 21 +-- .../src/Xaml/XamlProcessingAttribute.cs | 28 ---- .../SourceGeneratorDriver.cs | 1 + .../HeaderFooterView.xaml | 2 +- ...ols.Xaml.UnitTests.ExternalAssembly.csproj | 4 + .../AcceptEmptyServiceProvider.xaml.cs | 1 - .../{Colors.xaml => Colors.rtxc.xaml} | 0 ...edColors.xaml => CompiledColors.rtxc.xaml} | 0 .../{RD13209.xaml => RD13209.rtxc.xaml} | 0 .../AutoMergedResourceDictionaries.xaml | 2 +- .../AutoMergedResourceDictionaries.xaml.cs | 3 +- .../AutomationProperties.xaml.cs | 9 +- .../BindablePropertiesAccessModifiers.xaml.cs | 4 +- ...s.xaml => BindingDiagnosticsTests.rt.xaml} | 0 ....cs => BindingDiagnosticsTests.rt.xaml.cs} | 3 +- .../Xaml.UnitTests/BindingsCompiler.xaml.cs | 6 +- .../tests/Xaml.UnitTests/Border.xaml.cs | 3 +- .../Xaml.UnitTests/BuiltInConversions.xaml.cs | 3 +- .../Xaml.UnitTests/ButtonCornerRadius.xaml.cs | 3 +- .../Xaml.UnitTests/CecilExtensionsTests.cs | 2 +- .../Xaml.UnitTests/ColorConverter.xaml.cs | 3 +- .../CompiledTypeConverter.xaml.cs | 3 +- .../ConstraintExpression.xaml.cs | 3 +- .../Controls.Xaml.UnitTests.csproj | 22 +++- .../CustomButtonNoBaseClass.xaml.cs | 1 - .../Xaml.UnitTests/CustomXamlView.xaml.cs | 2 - .../tests/Xaml.UnitTests/DataTemplate.xaml.cs | 3 +- .../DataTemplateExtension.xaml.cs | 1 - .../DefinitionCollectionTests.xaml.cs | 1 - ...xaml => DuplicatePropertyElements.rt.xaml} | 0 ...s => DuplicatePropertyElements.rt.xaml.cs} | 3 +- ...ml => DuplicateXArgumentsElements.rt.xaml} | 0 ...=> DuplicateXArgumentsElements.rt.xaml.cs} | 4 +- .../Xaml.UnitTests/DynamicResource.xaml.cs | 3 +- .../Xaml.UnitTests/EventsConnection.xaml.cs | 5 +- ....xaml => FactoryMethodMissingCtor.rt.xaml} | 0 ...cs => FactoryMethodMissingCtor.rt.xaml.cs} | 3 +- ...aml => FactoryMethodMissingMethod.rt.xaml} | 0 ... => FactoryMethodMissingMethod.rt.xaml.cs} | 3 +- .../Xaml.UnitTests/FactoryMethods.xaml.cs | 3 +- .../Xaml.UnitTests/FieldModifier.xaml.cs | 3 +- .../tests/Xaml.UnitTests/FindByName.xaml.cs | 3 +- .../Xaml.UnitTests/FontImageExtension.xaml.cs | 1 - .../tests/Xaml.UnitTests/FontSize.xaml.cs | 3 +- .../Xaml.UnitTests/GenericCollections.xaml.cs | 3 +- .../Xaml.UnitTests/GenericsTests.xaml.cs | 3 +- .../tests/Xaml.UnitTests/GlobalXmlns.xaml.cs | 29 +++-- .../GlobalXmlnsWithDataTemplate.xaml.cs | 11 +- .../GlobalXmlnsWithStyle.xaml.cs | 28 ++-- .../GlobalXmlnsWithXStatic.xaml.cs | 20 +-- src/Controls/tests/Xaml.UnitTests/I8.xaml.cs | 3 +- .../ImplicitResourceDictionaries.xaml.cs | 3 +- .../InflatorSwitch/XamlInflatorDefault.xaml | 13 -- .../XamlInflatorDefault.xaml.cs | 20 --- ...ntime.xaml => XamlInflatorRuntime.rt.xaml} | 0 ...xaml.cs => XamlInflatorRuntime.rt.xaml.cs} | 3 +- .../XamlInflatorRuntimeTestsHelpers.cs | 51 +++++--- ...ml.cs => XamlInflatorSourceGen.sg.xaml.cs} | 3 +- ...n.xaml => XamlInflatorSourceGen.sgen.xaml} | 0 .../InflatorSwitch/XamlInflatorSwitch.xaml.cs | 18 ++- ...orXamlC.xaml => XamlInflatorXamlC.xc.xaml} | 0 ...C.xaml.cs => XamlInflatorXamlC.xc.xaml.cs} | 3 +- .../tests/Xaml.UnitTests/InlineCSS.xaml.cs | 3 +- .../{AB946693.xaml => AB946693.rt.xaml} | 0 .../{AB946693.xaml.cs => AB946693.rt.xaml.cs} | 1 - .../Issues/BPNotResolvedOnSubClass.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz18828.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz24485.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz24910.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz27299.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz27863.xaml.cs | 48 +++---- .../Xaml.UnitTests/Issues/Bz27968.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz28545.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz28556.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz28689.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz28719.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz29300.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz30074.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz30684.xaml.cs | 1 - .../Issues/Bz31234/A/Bz31234.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Bz31529.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz34037.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz36422.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz37306.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz37524.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz40906.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz41048.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz41296.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz42531.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz43301.xaml.cs | 1 - .../Issues/{Bz43450.xaml => Bz43450.rt.xaml} | 0 .../{Bz43450.xaml.cs => Bz43450.rt.xaml.cs} | 1 - .../Issues/{Bz43694.xaml => Bz43694.rt.xaml} | 0 .../{Bz43694.xaml.cs => Bz43694.rt.xaml.cs} | 1 - .../Xaml.UnitTests/Issues/Bz43733.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz44213.xaml.cs | 1 - .../Issues/{Bz44216.xaml => Bz44216.rt.xaml} | 0 .../{Bz44216.xaml.cs => Bz44216.rt.xaml.cs} | 1 - .../Xaml.UnitTests/Issues/Bz45179.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz45299.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz45891.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz46921.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz47703.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz47950.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz48554.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz51567.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz53203.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz53275.xaml.cs | 1 - .../{Bz53318.xaml => Bz53318.rtsg.xaml} | 0 .../{Bz53318.xaml.cs => Bz53318.rtsg.xaml.cs} | 3 +- .../Xaml.UnitTests/Issues/Bz53350.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz53381.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz54334.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Bz54717.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz55343.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz55347.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz56852.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz57574.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz58922.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz60203.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz60575.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Bz60788.xaml.cs | 1 - .../Xaml.UnitTests/Issues/DO817710.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh10803.xaml.cs | 1 - .../Issues/{Gh11061.xaml => Gh11061.rt.xaml} | 0 .../{Gh11061.xaml.cs => Gh11061.rt.xaml.cs} | 1 - .../Xaml.UnitTests/Issues/Gh11334.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh11335.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh11541.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh11551.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh11620.xaml.cs | 1 - .../Issues/{Gh11711.xaml => Gh11711.rt.xaml} | 0 .../{Gh11711.xaml.cs => Gh11711.rt.xaml.cs} | 1 - .../Xaml.UnitTests/Issues/Gh12025.xaml.cs | 27 +++- .../Xaml.UnitTests/Issues/Gh12763.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh12874.xaml.cs | 1 - .../tests/Xaml.UnitTests/Issues/Gh13209.xaml | 2 +- .../Xaml.UnitTests/Issues/Gh13209.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh1346.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh1497.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh1554.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh1566.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh16293.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh1766.xaml.cs | 1 - .../Issues/{Gh1978.xaml => Gh1978.rt.xaml} | 0 .../{Gh1978.xaml.cs => Gh1978.rt.xaml.cs} | 1 - .../Issues/{Gh2007.xaml => Gh2007.rtxc.xaml} | 0 .../{Gh2007.xaml.cs => Gh2007.rtxc.xaml.cs} | 1 - .../Xaml.UnitTests/Issues/Gh2034.xaml.cs | 1 - .../Issues/{Gh2063.xaml => Gh2063.rt.xaml} | 0 .../{Gh2063.xaml.cs => Gh2063.rt.xaml.cs} | 1 - .../Issues/{Gh2064.xaml => Gh2064.rt.xaml} | 0 .../{Gh2064.xaml.cs => Gh2064.rt.xaml.cs} | 1 - .../Xaml.UnitTests/Issues/Gh2130.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh2171.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh2483.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh2508.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh2517.xaml.cs | 1 - .../Issues/{Gh2549.xaml => Gh2549.rt.xaml} | 0 .../{Gh2549.xaml.cs => Gh2549.rt.xaml.cs} | 1 - .../Xaml.UnitTests/Issues/Gh2574.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh2632.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh2678.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh2752.xaml.cs | 1 - .../Issues/{Gh3082.xaml => Gh3082.rt.xaml} | 0 .../{Gh3082.xaml.cs => Gh3082.rt.xaml.cs} | 1 - .../Xaml.UnitTests/Issues/Gh3260.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh3280.xaml.cs | 1 - .../Issues/{Gh3512.xaml => Gh3512.rt.xaml} | 0 .../{Gh3512.xaml.cs => Gh3512.rt.xaml.cs} | 1 - .../Xaml.UnitTests/Issues/Gh3539.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh3606.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh3821.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh3847.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh3862.xaml.cs | 1 - .../Issues/{Gh4099.xaml => Gh4099.rt.xaml} | 0 .../{Gh4099.xaml.cs => Gh4099.rt.xaml.cs} | 1 - .../Xaml.UnitTests/Issues/Gh4102.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh4103.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh4130.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh4215.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh4227.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh4238.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Gh4319.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh4326.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh4348.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh4438.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh4446.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh4516.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh4572.xaml.cs | 1 - .../Issues/{Gh4751.xaml => Gh4751.rt.xaml} | 0 .../{Gh4751.xaml.cs => Gh4751.rt.xaml.cs} | 3 - .../Xaml.UnitTests/Issues/Gh4760.xaml.cs | 1 - .../Issues/{Gh5095.xaml => Gh5095.rt.xaml} | 0 .../{Gh5095.xaml.cs => Gh5095.rt.xaml.cs} | 3 - .../Xaml.UnitTests/Issues/Gh5240.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh5242.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh5254.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh5256.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh5290.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh5330.xaml.cs | 1 - .../{Gh5378_1.xaml => Gh5378_1.rt.xaml} | 0 .../{Gh5378_1.xaml.cs => Gh5378_1.rt.xaml.cs} | 1 - .../{Gh5378_2.xaml => Gh5378_2.rt.xaml} | 0 .../{Gh5378_2.xaml.cs => Gh5378_2.rt.xaml.cs} | 1 - .../Xaml.UnitTests/Issues/Gh5486.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh5510.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh5651.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh5705.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh5706.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh6176.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh6192.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh6361.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh6648.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh6996.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh7097.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh7097Base.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh7156.xaml.cs | 1 - .../Issues/{Gh7187.xaml => Gh7187.rt.xaml} | 0 .../{Gh7187.xaml.cs => Gh7187.rt.xaml.cs} | 1 - .../Xaml.UnitTests/Issues/Gh7494.xaml.cs | 1 - .../tests/Xaml.UnitTests/Issues/Gh7531.xaml | 4 +- .../Xaml.UnitTests/Issues/Gh7531.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh7559.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh7830.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh7837.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh8221.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh8936.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Gh9212.xaml.cs | 1 - .../Issues/GrialIssue01.xaml.cs | 1 - .../Issues/GrialIssue02.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Issue1199.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Issue1213.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Issue1250.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Issue1306.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Issue1415.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Issue1438.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Issue18948.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Issue2016.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Issue2062.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Issue2114.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Issue2152.xaml.cs | 3 +- .../{Issue2450.xaml => Issue2450.rt.xaml} | 0 ...Issue2450.xaml.cs => Issue2450.rt.xaml.cs} | 5 +- .../Xaml.UnitTests/Issues/Issue2489.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Issue2578.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Issue2659.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Issue2742.xaml.cs | 4 +- .../Xaml.UnitTests/Issues/Issue3076.xaml.cs | 4 +- .../Xaml.UnitTests/Issues/Issue3090.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Issue3106.xaml.cs | 3 +- .../Xaml.UnitTests/Issues/Issue6280.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui10396.xaml.cs | 1 - .../Issues/Maui10396Card.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui10583.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui11204.xaml.cs | 1 - .../Issues/Maui11467/Maui11467.xaml.cs | 1 - .../Issues/Maui11467/ParentButton.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui11857.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui12566.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui13474.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui13585.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui13619.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui13962.xaml.cs | 2 - .../Maui14158/InternalVisibleTypes.xaml.cs | 1 - .../Issues/Maui14158/PublicTypes.xaml.cs | 1 - .../Issues/Maui14158/WithSuffix.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui16208.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui16327.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui16538.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui16960.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui17222.xaml.cs | 1 - .../Issues/Maui17222BaseStyle.xaml.cs | 1 - .../Issues/Maui17222Style.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui17333.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui17354.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui17461.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui17484.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui17597.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui17950.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui18103.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui18123.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui18324.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui18545.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui18697.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui18976.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui18980.xaml.cs | 1 - .../Issues/Maui18980Style.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui19388.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui19535.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui20244.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui20508.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui20616.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui20768.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui20818.xaml.cs | 1 - .../{Maui21038.xaml => Maui21038.rt.xaml} | 0 ...Maui21038.xaml.cs => Maui21038.rt.xaml.cs} | 1 - .../Xaml.UnitTests/Issues/Maui21434.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui21495.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui21757.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui21757_2.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui21774.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui21839.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui22001.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui22036.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui22105.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui22536.xaml.cs | 1 - .../{Maui22714.xaml => Maui22714.rt.xaml} | 0 ...Maui22714.xaml.cs => Maui22714.rt.xaml.cs} | 3 +- .../Xaml.UnitTests/Issues/Maui22877.xaml.cs | 1 - .../Issues/Maui2304Closed.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui23201.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui23347.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui23711.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui23989.xaml.cs | 7 +- .../{Maui2418.xaml => Maui2418.rtsg.xaml} | 0 ...Maui2418.xaml.cs => Maui2418.rtsg.xaml.cs} | 3 +- .../Xaml.UnitTests/Issues/Maui24384.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui24500.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui24849.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui24900.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui25141.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui25172.xaml | 2 +- .../Xaml.UnitTests/Issues/Maui25172.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui25309.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui25406.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui25608.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui25608_2.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui25819.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui25871.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui25935.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui26206.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui26369.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui27121.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui31186.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui3793.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui4509.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui6367.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui6944.xaml.cs | 2 - .../Xaml.UnitTests/Issues/Maui7744.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Maui8149.xaml.cs | 1 - .../Xaml.UnitTests/Issues/Pr3384.xaml.cs | 3 +- .../Issues/Unreported001.xaml.cs | 3 +- .../Issues/Unreported002.xaml.cs | 3 +- .../Issues/Unreported003.xaml.cs | 1 - .../Issues/Unreported004.xaml.cs | 1 - .../Issues/Unreported005.xaml.cs | 1 - .../Issues/Unreported006.xaml.cs | 1 - .../Issues/Unreported007.xaml.cs | 1 - .../Issues/Unreported008.xaml.cs | 1 - .../Issues/Unreported009.xaml.cs | 1 - .../Issues/Unreported010.xaml.cs | 1 - .../tests/Xaml.UnitTests/LabelHtml.xaml.cs | 1 - .../Xaml.UnitTests/MSBuild/MSBuildTests.cs | 8 +- .../tests/Xaml.UnitTests/McIgnorable.xaml.cs | 3 +- .../MergedResourceDictionaries.xaml.cs | 3 +- .../Xaml.UnitTests/MockSourceGenerator.cs | 2 +- ...MultipleDataTemplateChildElements.rt.xaml} | 0 ...tipleDataTemplateChildElements.rt.xaml.cs} | 3 +- ...gs.xaml => NativeViewsAndBindings.rt.xaml} | 0 ...l.cs => NativeViewsAndBindings.rt.xaml.cs} | 1 - .../tests/Xaml.UnitTests/OnPlatform.xaml.cs | 3 +- .../OnPlatformOptimization.xaml.cs | 3 +- .../Xaml.UnitTests/PlatformSpecifics.xaml.cs | 1 - ....xaml => PlatformViewsAndBindings.rt.xaml} | 0 ...cs => PlatformViewsAndBindings.rt.xaml.cs} | 3 +- .../Xaml.UnitTests/Properties/AssemblyInfo.cs | 2 - .../Xaml.UnitTests/RefToXamlControl.xaml.cs | 1 - ...sourceDictionaryWithInvalidSource.rt.xaml} | 0 ...rceDictionaryWithInvalidSource.rt.xaml.cs} | 3 +- .../ResourceDictionaryWithSource.xaml | 6 +- .../ResourceDictionaryWithSource.xaml.cs | 9 +- .../Xaml.UnitTests/SafeAreaEdgesTests.xaml.cs | 3 +- .../ServiceProviderTests.xaml.cs | 3 +- .../SetStyleIdFromXName.xaml.cs | 3 +- .../tests/Xaml.UnitTests/SetValue.xaml.cs | 3 +- .../SharedResourceDictionary.xaml.cs | 3 +- .../Speed/SimpleContentPage.xaml.cs | 2 +- .../Xaml.UnitTests/StringLiterals.xaml.cs | 38 +++--- .../tests/Xaml.UnitTests/StyleSheet.xaml.cs | 3 +- .../tests/Xaml.UnitTests/StyleTests.xaml.cs | 3 +- .../TemplateBindingsCompiler.xaml.cs | 3 +- .../TestSharedResourceDictionary.xaml.cs | 3 +- .../Xaml.UnitTests/TestXmlnsUsing.xaml.cs | 1 - .../tests/Xaml.UnitTests/TriggerTests.xaml.cs | 3 +- .../Xaml.UnitTests/TypeConverterTests.xaml.cs | 3 +- .../Xaml.UnitTests/TypeExtension.xaml.cs | 3 +- .../tests/Xaml.UnitTests/TypeLoader.xaml.cs | 3 +- ...ingXClass.xaml => MissingXClass.rtxc.xaml} | 0 ...tterOnNonBP.xaml => SetterOnNonBP.rt.xaml} | 0 ...NonBP.xaml.cs => SetterOnNonBP.rt.xaml.cs} | 3 +- ....xaml => StaticExtensionException.rt.xaml} | 0 ...cs => StaticExtensionException.rt.xaml.cs} | 3 +- ...TypeMismatch.xaml => TypeMismatch.rt.xaml} | 0 ...smatch.xaml.cs => TypeMismatch.rt.xaml.cs} | 3 +- .../VisualStateManagerTests.xaml.cs | 3 +- .../Xaml.UnitTests/WarnOnObsolete.xaml.cs | 1 - .../Xaml.UnitTests/X2009Primitives.xaml.cs | 3 +- .../tests/Xaml.UnitTests/XArray.xaml.cs | 3 +- .../tests/Xaml.UnitTests/XNull.xaml.cs | 3 +- .../tests/Xaml.UnitTests/XReference.xaml.cs | 3 +- .../tests/Xaml.UnitTests/XStatic.xaml.cs | 3 +- ...xception.xaml => XStaticException.rt.xaml} | 0 ...on.xaml.cs => XStaticException.rt.xaml.cs} | 3 +- .../Xaml.UnitTests/XmlnsAggregattion.xaml.cs | 18 ++- ...sCollision.xaml => XmlnsCollision.rt.xaml} | 0 ...sion.xaml.cs => XmlnsCollision.rt.xaml.cs} | 1 - .../{xKeyLiteral.xaml => xKeyLiteral.rt.xaml} | 0 ...Literal.xaml.cs => xKeyLiteral.rt.xaml.cs} | 1 - .../maui-mobile/Resources/Styles/Colors.xaml | 1 - .../maui-mobile/Resources/Styles/Styles.xaml | 1 - .../MauiApp.1/Resources/Styles/Colors.xaml | 1 - .../MauiApp.1/Resources/Styles/Styles.xaml | 1 - 434 files changed, 578 insertions(+), 974 deletions(-) create mode 100644 src/Controls/src/SourceGen/compat.cs delete mode 100644 src/Controls/src/Xaml/XamlProcessingAttribute.cs rename src/Controls/tests/Xaml.UnitTests/AppResources/{Colors.xaml => Colors.rtxc.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/AppResources/{CompiledColors.xaml => CompiledColors.rtxc.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/AppResources/{RD13209.xaml => RD13209.rtxc.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/{BindingDiagnosticsTests.xaml => BindingDiagnosticsTests.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/{BindingDiagnosticsTests.xaml.cs => BindingDiagnosticsTests.rt.xaml.cs} (95%) rename src/Controls/tests/Xaml.UnitTests/{DuplicatePropertyElements.xaml => DuplicatePropertyElements.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/{DuplicatePropertyElements.xaml.cs => DuplicatePropertyElements.rt.xaml.cs} (94%) rename src/Controls/tests/Xaml.UnitTests/{DuplicateXArgumentsElements.xaml => DuplicateXArgumentsElements.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/{DuplicateXArgumentsElements.xaml.cs => DuplicateXArgumentsElements.rt.xaml.cs} (94%) rename src/Controls/tests/Xaml.UnitTests/{FactoryMethodMissingCtor.xaml => FactoryMethodMissingCtor.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/{FactoryMethodMissingCtor.xaml.cs => FactoryMethodMissingCtor.rt.xaml.cs} (98%) rename src/Controls/tests/Xaml.UnitTests/{FactoryMethodMissingMethod.xaml => FactoryMethodMissingMethod.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/{FactoryMethodMissingMethod.xaml.cs => FactoryMethodMissingMethod.rt.xaml.cs} (97%) delete mode 100644 src/Controls/tests/Xaml.UnitTests/InflatorSwitch/XamlInflatorDefault.xaml delete mode 100644 src/Controls/tests/Xaml.UnitTests/InflatorSwitch/XamlInflatorDefault.xaml.cs rename src/Controls/tests/Xaml.UnitTests/InflatorSwitch/{XamlInflatorRuntime.xaml => XamlInflatorRuntime.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/InflatorSwitch/{XamlInflatorRuntime.xaml.cs => XamlInflatorRuntime.rt.xaml.cs} (90%) rename src/Controls/tests/Xaml.UnitTests/InflatorSwitch/{XamlInflatorSourceGen.xaml.cs => XamlInflatorSourceGen.sg.xaml.cs} (89%) rename src/Controls/tests/Xaml.UnitTests/InflatorSwitch/{XamlInflatorSourceGen.xaml => XamlInflatorSourceGen.sgen.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/InflatorSwitch/{XamlInflatorXamlC.xaml => XamlInflatorXamlC.xc.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/InflatorSwitch/{XamlInflatorXamlC.xaml.cs => XamlInflatorXamlC.xc.xaml.cs} (91%) rename src/Controls/tests/Xaml.UnitTests/Issues/{AB946693.xaml => AB946693.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{AB946693.xaml.cs => AB946693.rt.xaml.cs} (97%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Bz43450.xaml => Bz43450.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Bz43450.xaml.cs => Bz43450.rt.xaml.cs} (96%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Bz43694.xaml => Bz43694.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Bz43694.xaml.cs => Bz43694.rt.xaml.cs} (96%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Bz44216.xaml => Bz44216.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Bz44216.xaml.cs => Bz44216.rt.xaml.cs} (97%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Bz53318.xaml => Bz53318.rtsg.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Bz53318.xaml.cs => Bz53318.rtsg.xaml.cs} (86%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh11061.xaml => Gh11061.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh11061.xaml.cs => Gh11061.rt.xaml.cs} (96%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh11711.xaml => Gh11711.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh11711.xaml.cs => Gh11711.rt.xaml.cs} (95%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh1978.xaml => Gh1978.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh1978.xaml.cs => Gh1978.rt.xaml.cs} (95%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh2007.xaml => Gh2007.rtxc.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh2007.xaml.cs => Gh2007.rtxc.xaml.cs} (94%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh2063.xaml => Gh2063.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh2063.xaml.cs => Gh2063.rt.xaml.cs} (95%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh2064.xaml => Gh2064.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh2064.xaml.cs => Gh2064.rt.xaml.cs} (95%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh2549.xaml => Gh2549.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh2549.xaml.cs => Gh2549.rt.xaml.cs} (95%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh3082.xaml => Gh3082.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh3082.xaml.cs => Gh3082.rt.xaml.cs} (96%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh3512.xaml => Gh3512.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh3512.xaml.cs => Gh3512.rt.xaml.cs} (96%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh4099.xaml => Gh4099.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh4099.xaml.cs => Gh4099.rt.xaml.cs} (96%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh4751.xaml => Gh4751.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh4751.xaml.cs => Gh4751.rt.xaml.cs} (91%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh5095.xaml => Gh5095.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh5095.xaml.cs => Gh5095.rt.xaml.cs} (88%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh5378_1.xaml => Gh5378_1.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh5378_1.xaml.cs => Gh5378_1.rt.xaml.cs} (96%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh5378_2.xaml => Gh5378_2.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh5378_2.xaml.cs => Gh5378_2.rt.xaml.cs} (96%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh7187.xaml => Gh7187.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Gh7187.xaml.cs => Gh7187.rt.xaml.cs} (96%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Issue2450.xaml => Issue2450.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Issue2450.xaml.cs => Issue2450.rt.xaml.cs} (88%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Maui21038.xaml => Maui21038.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Maui21038.xaml.cs => Maui21038.rt.xaml.cs} (96%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Maui22714.xaml => Maui22714.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Maui22714.xaml.cs => Maui22714.rt.xaml.cs} (96%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Maui2418.xaml => Maui2418.rtsg.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Issues/{Maui2418.xaml.cs => Maui2418.rtsg.xaml.cs} (83%) rename src/Controls/tests/Xaml.UnitTests/{MultipleDataTemplateChildElements.xaml => MultipleDataTemplateChildElements.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/{MultipleDataTemplateChildElements.xaml.cs => MultipleDataTemplateChildElements.rt.xaml.cs} (94%) rename src/Controls/tests/Xaml.UnitTests/{NativeViewsAndBindings.xaml => NativeViewsAndBindings.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/{NativeViewsAndBindings.xaml.cs => NativeViewsAndBindings.rt.xaml.cs} (99%) rename src/Controls/tests/Xaml.UnitTests/{PlatformViewsAndBindings.xaml => PlatformViewsAndBindings.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/{PlatformViewsAndBindings.xaml.cs => PlatformViewsAndBindings.rt.xaml.cs} (99%) delete mode 100644 src/Controls/tests/Xaml.UnitTests/Properties/AssemblyInfo.cs rename src/Controls/tests/Xaml.UnitTests/{ResourceDictionaryWithInvalidSource.xaml => ResourceDictionaryWithInvalidSource.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/{ResourceDictionaryWithInvalidSource.xaml.cs => ResourceDictionaryWithInvalidSource.rt.xaml.cs} (95%) rename src/Controls/tests/Xaml.UnitTests/Validation/{MissingXClass.xaml => MissingXClass.rtxc.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Validation/{SetterOnNonBP.xaml => SetterOnNonBP.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Validation/{SetterOnNonBP.xaml.cs => SetterOnNonBP.rt.xaml.cs} (94%) rename src/Controls/tests/Xaml.UnitTests/Validation/{StaticExtensionException.xaml => StaticExtensionException.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Validation/{StaticExtensionException.xaml.cs => StaticExtensionException.rt.xaml.cs} (94%) rename src/Controls/tests/Xaml.UnitTests/Validation/{TypeMismatch.xaml => TypeMismatch.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/Validation/{TypeMismatch.xaml.cs => TypeMismatch.rt.xaml.cs} (95%) rename src/Controls/tests/Xaml.UnitTests/{XStaticException.xaml => XStaticException.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/{XStaticException.xaml.cs => XStaticException.rt.xaml.cs} (95%) rename src/Controls/tests/Xaml.UnitTests/{XmlnsCollision.xaml => XmlnsCollision.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/{XmlnsCollision.xaml.cs => XmlnsCollision.rt.xaml.cs} (98%) rename src/Controls/tests/Xaml.UnitTests/{xKeyLiteral.xaml => xKeyLiteral.rt.xaml} (100%) rename src/Controls/tests/Xaml.UnitTests/{xKeyLiteral.xaml.cs => xKeyLiteral.rt.xaml.cs} (96%) diff --git a/Directory.Build.props b/Directory.Build.props index 84ba0b7c69db..f3f7b152b802 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,6 +2,16 @@ + + + + <_MauiXamlSourceGenBackCompat>true + $(DefineConstants);_MAUIXAML_SOURCEGEN_BACKCOMPAT + + true diff --git a/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Colors.xaml b/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Colors.xaml index 30307a5ddc3b..d57fcc6e3987 100644 --- a/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Colors.xaml +++ b/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Colors.xaml @@ -1,5 +1,4 @@  - diff --git a/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Styles.xaml b/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Styles.xaml index 15a426f62f82..6590af989c48 100644 --- a/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Styles.xaml +++ b/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Styles.xaml @@ -1,5 +1,4 @@  - diff --git a/src/Controls/src/Build.Tasks/XamlCTask.cs b/src/Controls/src/Build.Tasks/XamlCTask.cs index e5a346c6fa33..30da79f740a8 100644 --- a/src/Controls/src/Build.Tasks/XamlCTask.cs +++ b/src/Controls/src/Build.Tasks/XamlCTask.cs @@ -203,88 +203,50 @@ public override bool Execute(out IList thrownExceptions) using (var assemblyDefinition = AssemblyDefinition.ReadAssembly(IOPath.GetFullPath(Assembly), readerParameters)) { - CustomAttribute xamlProcessingAttr = null; - if (assemblyDefinition.HasCustomAttributes && - (xamlProcessingAttr = - assemblyDefinition.CustomAttributes.FirstOrDefault( - ca => ca.AttributeType.FullName == "Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute")) != null) - { - var inflator = (XamlInflator)xamlProcessingAttr.ConstructorArguments[0].Value; - var generateInflatorSwitch = xamlProcessingAttr.ConstructorArguments.Count > 1 - && (bool)xamlProcessingAttr.ConstructorArguments[1].Value; - assemblyInflatorOptions = (generateInflatorSwitch, inflator); - if (!generateInflatorSwitch) - skipassembly = (inflator & XamlInflator.XamlC) != XamlInflator.XamlC && inflator != XamlInflator.Default; - - } - -#pragma warning disable CS0618 // Type or member is obsolete +#if _MAUIXAML_SOURCEGEN_BACKCOMPAT CustomAttribute xamlcAttr = null; if (assemblyDefinition.HasCustomAttributes && (xamlcAttr = assemblyDefinition.CustomAttributes.FirstOrDefault( ca => ca.AttributeType.FullName == "Microsoft.Maui.Controls.Xaml.XamlCompilationAttribute")) != null) { - if (xamlProcessingAttr == null) - { - var options = (XamlCompilationOptions)xamlcAttr.ConstructorArguments[0].Value; - if ((options & XamlCompilationOptions.Skip) == XamlCompilationOptions.Skip) - skipassembly = true; - if ((options & XamlCompilationOptions.Compile) == XamlCompilationOptions.Compile) - skipassembly = false; - } - else - LoggingHelper.LogWarning($"{new string(' ', 2)}Assembly has both XamlCompilationAttribute and XamlProcessingAttribute. XamlCompilationAttribute will be ignored."); + var options = (XamlCompilationOptions)xamlcAttr.ConstructorArguments[0].Value; + if ((options & XamlCompilationOptions.Skip) == XamlCompilationOptions.Skip) + skipassembly = true; + if ((options & XamlCompilationOptions.Compile) == XamlCompilationOptions.Compile) + skipassembly = false; } -#pragma warning restore CS0618 // Type or member is obsolete - xamlcAttr = xamlProcessingAttr = null; + xamlcAttr = null; +#endif foreach (var module in assemblyDefinition.Modules) { var skipmodule = skipassembly; (bool, XamlInflator)? moduleInflatorOptions = assemblyInflatorOptions; - if (module.HasCustomAttributes && - (xamlProcessingAttr = - module.CustomAttributes.FirstOrDefault( - ca => ca.AttributeType.FullName == "Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute")) != null) - { - var inflator = (XamlInflator)xamlProcessingAttr.ConstructorArguments[0].Value; - var generateInflatorSwitch = xamlProcessingAttr.ConstructorArguments.Count > 1 - && (bool)xamlProcessingAttr.ConstructorArguments[1].Value; - moduleInflatorOptions = (generateInflatorSwitch, inflator); - if (!generateInflatorSwitch) - skipmodule = (inflator & XamlInflator.XamlC) != XamlInflator.XamlC && inflator != XamlInflator.Default; - } - -#pragma warning disable CS0618 // Type or member is obsolete +#if _MAUIXAML_SOURCEGEN_BACKCOMPAT if (module.HasCustomAttributes && (xamlcAttr = module.CustomAttributes.FirstOrDefault( ca => ca.AttributeType.FullName == "Microsoft.Maui.Controls.Xaml.XamlCompilationAttribute")) != null) { - if (xamlProcessingAttr == null) - { - - var options = (XamlCompilationOptions)xamlcAttr.ConstructorArguments[0].Value; - if ((options & XamlCompilationOptions.Skip) == XamlCompilationOptions.Skip) - skipmodule = true; - if ((options & XamlCompilationOptions.Compile) == XamlCompilationOptions.Compile) - skipmodule = false; - } - else - LoggingHelper.LogWarning($"{new string(' ', 2)}Module {module.Name} has both XamlCompilationAttribute and XamlProcessingAttribute. XamlCompilationAttribute will be ignored."); + var options = (XamlCompilationOptions)xamlcAttr.ConstructorArguments[0].Value; + if ((options & XamlCompilationOptions.Skip) == XamlCompilationOptions.Skip) + skipmodule = true; + if ((options & XamlCompilationOptions.Compile) == XamlCompilationOptions.Compile) + skipmodule = false; } -#pragma warning restore CS0618 // Type or member is obsolete - - xamlcAttr = xamlProcessingAttr = null; + xamlcAttr = null; +#endif LoggingHelper.LogMessage(Low, $"{new string(' ', 2)}Module: {module.Name}"); var resourcesToPrune = new List(); foreach (var resource in module.Resources.OfType()) { - var initCompName = "InitializeComponent"; + var generateInflatorSwitch = module.Assembly.Name.Name == "Microsoft.Maui.Controls.Xaml.UnitTests"; + var initCompName = generateInflatorSwitch ? "InitializeComponentXamlC" : "InitializeComponent"; + LoggingHelper.LogMessage(Low, $"{new string(' ', 4)}Resource: {resource.Name}"); string classname; if (!resource.IsXaml(cache, module, out classname)) @@ -301,53 +263,27 @@ public override bool Execute(out IList thrownExceptions) var skiptype = skipmodule; (bool, XamlInflator)? typeInflatorOptions = moduleInflatorOptions; - if (typeDef.HasCustomAttributes && - (xamlProcessingAttr = - typeDef.CustomAttributes.FirstOrDefault( - ca => ca.AttributeType.FullName == "Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute")) != null) - { - var inflator = (XamlInflator)xamlProcessingAttr.ConstructorArguments[0].Value; - var generateInflatorSwitch = xamlProcessingAttr.ConstructorArguments.Count > 1 - && (bool)xamlProcessingAttr.ConstructorArguments[1].Value; - - typeInflatorOptions = (generateInflatorSwitch, inflator); - if (generateInflatorSwitch) - { - skiptype = (inflator & XamlInflator.XamlC) != XamlInflator.XamlC && inflator != XamlInflator.Default; - initCompName = "InitializeComponentXamlC"; - } - else - skiptype = inflator != XamlInflator.XamlC; - } -#pragma warning disable CS0618 // Type or member is obsolete +#if _MAUIXAML_SOURCEGEN_BACKCOMPAT if (typeDef.HasCustomAttributes && (xamlcAttr = typeDef.CustomAttributes.FirstOrDefault( ca => ca.AttributeType.FullName == "Microsoft.Maui.Controls.Xaml.XamlCompilationAttribute")) != null) { - if (xamlProcessingAttr == null) - { - // XamlCompilationAttribute is obsolete, but we still need to support it - // for backwards compatibility - var options = (XamlCompilationOptions)xamlcAttr.ConstructorArguments[0].Value; - if ((options & XamlCompilationOptions.Skip) == XamlCompilationOptions.Skip) - skiptype = true; - if ((options & XamlCompilationOptions.Compile) == XamlCompilationOptions.Compile) - skiptype = false; - } - else - LoggingHelper.LogWarning($"{new string(' ', 6)}Type {typeDef.Name} has both XamlCompilationAttribute and XamlProcessingAttribute. XamlCompilationAttribute will be ignored."); + var options = (XamlCompilationOptions)xamlcAttr.ConstructorArguments[0].Value; + if ((options & XamlCompilationOptions.Skip) == XamlCompilationOptions.Skip) + skiptype = true; + if ((options & XamlCompilationOptions.Compile) == XamlCompilationOptions.Compile) + skiptype = false; } -#pragma warning restore CS0618 // Type or member is obsolete - - xamlcAttr = xamlProcessingAttr = null; + xamlcAttr = null; +#endif if (Type != null) skiptype = !(Type == classname); if (skiptype && !ForceCompile) { - LoggingHelper.LogMessage(Low, $"{new string(' ', 6)}has XamlCompilation or XamlProceesing disabling XamlC... skipped."); + LoggingHelper.LogMessage(Low, $"{new string(' ', 6)}has XamlCompilation disabling XamlC... skipped."); continue; } diff --git a/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.Common.targets b/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.Common.targets index 0c33a0cf414f..cffdc4ad2ca5 100644 --- a/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.Common.targets +++ b/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.Common.targets @@ -22,6 +22,14 @@ + + + + + + + + + - diff --git a/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.targets b/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.targets index 7f9ead91c76f..493a87b53efd 100644 --- a/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.targets +++ b/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.targets @@ -6,6 +6,11 @@ true True True + + <_MauiXamlInflator Condition="' $(MauiXamlInflator)' != '' ">$(MauiXamlInflator) + <_MauiXamlInflator Condition=" '$(MauiXamlInflator)' == '' And '$(Configuration)' == 'Debug' ">Runtime + <_MauiXamlInflator Condition=" '$(MauiXamlInflator)' == '' And '$(Configuration)' != 'Debug' ">XamlC + true @@ -73,11 +78,34 @@ Condition="'$(_XFTargetsImported)' == 'true'"/> + + + + + + + <_MauiXaml_SG Remove="@(_MauiXaml_SG)" /> + <_MauiXaml_RT Remove="@(_MauiXaml_RT)" /> + <_MauiXaml_XC Remove="@(_MauiXaml_XC)" /> + <_MauiXaml_SG Include="@(MauiXaml)" Condition="$([System.String]::new('%(MauiXaml.Inflator)').Contains('SourceGen', StringComparison.OrdinalIgnoreCase))" /> + <_MauiXaml_RT Include="@(MauiXaml)" Condition="$([System.String]::new('%(MauiXaml.Inflator)').Contains('Runtime', StringComparison.OrdinalIgnoreCase))" /> + <_MauiXaml_XC Include="@(MauiXaml)" Condition="$([System.String]::new('%(MauiXaml.Inflator)').Contains('XamlC', StringComparison.OrdinalIgnoreCase))" /> + <_MauiXaml_AsEmbeddedResource Include="@(_MauiXaml_RT)" /> + <_MauiXaml_AsEmbeddedResource Include="@(_MauiXaml_XC)" KeepDuplicates="false" /> + + + + <_MauiInjectXamlCssAdditionalFilesDependsOn> + _MauiXamlComputeInflator; + $(CreateManifestResourceNamesDependsOn); + + + + DependsOnTargets="$(_MauiInjectXamlCssAdditionalFilesDependsOn)"> <_MauiXamlWithResourceNames Remove="@(_MauiXamlWithResourceNames)" /> <_MauiXamlWithTargetPath Remove="@(_MauiXamlWithTargetPath)" /> @@ -113,6 +141,7 @@ TargetPath="%(_MauiXamlWithResourceNames.TargetPath)" RelativePath="$([MSBuild]::MakeRelative($(MSBuildProjectDirectory), %(_MauiXamlWithResourceNames.TargetPath)))" ItemSpec="%(_MauiXamlWithResourceNames.OriginalItemSpec)" + Inflator="%(_MauiXamlWithResourceNames.Inflator)" GenKind="Xaml"/> - + _MauiAddXamlEmbeddedResources; $(PrepareResourcesDependsOn); + <_MauiAddXamlEmbeddedResourcesDependsOn> + _MauiXamlComputeInflator + - + + diff --git a/src/Controls/src/SourceGen/CodeBehindCodeWriter.cs b/src/Controls/src/SourceGen/CodeBehindCodeWriter.cs index 51a633b4c269..fa901e5f271e 100644 --- a/src/Controls/src/SourceGen/CodeBehindCodeWriter.cs +++ b/src/Controls/src/SourceGen/CodeBehindCodeWriter.cs @@ -69,16 +69,25 @@ public static string GenerateXamlCodeBehind(XamlProjectItemForCB? xamlItem, Comp } var rootSymbol = compilation.GetTypeByMetadataName($"{rootClrNamespace}.{rootType}"); + bool alreadyHasXamlCompilationAttribute = rootSymbol?.GetAttributes().Any(a => a.AttributeClass != null && a.AttributeClass.Equals(compilation.GetTypeByMetadataName("Microsoft.Maui.Controls.Xaml.XamlCompilationAttribute")!, SymbolEqualityComparer.Default)) ?? false; - (var generateInflatorSwitch, var xamlInflators, _) = rootSymbol?.GetXamlProcessing() ?? (false, XamlInflator.Default, false); + var generateInflatorSwitch = compilation.AssemblyName == "Microsoft.Maui.Controls.Xaml.UnitTests"; + var xamlInflators = projItem.Inflator; + + //if there's only the XamlC inflator, prevent non-assigned errors + if (xamlInflators == XamlInflator.XamlC) + sb.AppendLine("#pragma warning disable CS0649"); sb.AppendLine($"namespace {rootClrNamespace}"); sb.AppendLine("{"); sb.AppendLine($"\t[global::Microsoft.Maui.Controls.Xaml.XamlFilePath(\"{projItem.RelativePath?.Replace("\\", "\\\\")}\")]"); - if (addXamlCompilationAttribute) - { + +#if !_MAUIXAML_SOURCEGEN_BACKCOMPAT + if (addXamlCompilationAttribute && !alreadyHasXamlCompilationAttribute) sb.AppendLine($"\t[global::Microsoft.Maui.Controls.Xaml.XamlCompilation(global::Microsoft.Maui.Controls.Xaml.XamlCompilationOptions.Compile)]"); - } +#endif + if (!addXamlCompilationAttribute && (xamlInflators & XamlInflator.XamlC) == 0 && !alreadyHasXamlCompilationAttribute) + sb.AppendLine($"\t[global::Microsoft.Maui.Controls.Xaml.XamlCompilation(global::Microsoft.Maui.Controls.Xaml.XamlCompilationOptions.Skip)]"); if (hideFromIntellisense) { @@ -95,10 +104,7 @@ public static string GenerateXamlCodeBehind(XamlProjectItemForCB? xamlItem, Comp if (generateDefaultCtor) { sb.AppendLine($"\t\t[global::System.CodeDom.Compiler.GeneratedCode(\"Microsoft.Maui.Controls.SourceGen\", \"1.0.0.0\")]"); - sb.AppendLine($"\t\tpublic {rootType}()"); - sb.AppendLine("\t\t{"); - sb.AppendLine(generateInflatorSwitch ? "\t\t\tInitializeComponent(global::Microsoft.Maui.Controls.Xaml.XamlInflator.Default);" : "\t\t\tInitializeComponent();"); - sb.AppendLine("\t\t}"); + sb.AppendLine($"\t\tpublic {rootType}() => InitializeComponent();"); sb.AppendLine(); } @@ -137,33 +143,22 @@ public static string GenerateXamlCodeBehind(XamlProjectItemForCB? xamlItem, Comp // - InitializeComponentXamlC will be used for XamlC // - InitializeComponentSourceGen will be used for SourceGen // - no parameterless InitializeComponent will be generated - if (!generateInflatorSwitch) { - if (xamlInflators == XamlInflator.Default) - { - if (projItem.Configuration != null && projItem.Configuration.Equals("Release", StringComparison.OrdinalIgnoreCase)) - InitComp("InitializeComponent", empty: true); - else - InitComp("InitializeComponent"); - } if ((xamlInflators & XamlInflator.Runtime) == XamlInflator.Runtime) InitComp("InitializeComponent"); else if ((xamlInflators & XamlInflator.XamlC) == XamlInflator.XamlC) - InitComp("InitializeComponent", empty: true); + InitComp("InitializeComponent"); else if ((xamlInflators & XamlInflator.SourceGen) == XamlInflator.SourceGen) InitComp("InitializeComponent", partialsignature: true); } else { - if ((xamlInflators & XamlInflator.Runtime) == XamlInflator.Runtime - || xamlInflators == XamlInflator.Default) + if ((xamlInflators & XamlInflator.Runtime) == XamlInflator.Runtime) InitComp("InitializeComponentRuntime"); - if ((xamlInflators & XamlInflator.XamlC) == XamlInflator.XamlC - || xamlInflators == XamlInflator.Default) + if ((xamlInflators & XamlInflator.XamlC) == XamlInflator.XamlC) InitComp("InitializeComponentXamlC", empty: true); - if ((xamlInflators & XamlInflator.SourceGen) == XamlInflator.SourceGen - || xamlInflators == XamlInflator.Default) + if ((xamlInflators & XamlInflator.SourceGen) == XamlInflator.SourceGen) InitComp("InitializeComponentSourceGen", partialsignature: true); } @@ -175,11 +170,8 @@ void InitComp(string methodName, bool empty = false, bool partialsignature = fal if (namedFields != null && namedFields.Any()) { sb.AppendLine($"#if NET5_0_OR_GREATER"); - foreach ((var fname, _, _) in namedFields) - { - + foreach ((var fname, _, _) in namedFields) sb.AppendLine($"\t\t[global::System.Diagnostics.CodeAnalysis.MemberNotNullAttribute(nameof({EscapeIdentifier(fname)}))]"); - } sb.AppendLine($"#endif"); } @@ -238,36 +230,40 @@ void InitComp(string methodName, bool empty = false, bool partialsignature = fal sb.AppendLine($"#endif"); } - sb.AppendLine($"\t\tprivate void InitializeComponent() => InitializeComponentRuntime();"); - sb.AppendLine(); + + //this isn't supposed to be used, so the default to the first available inflator + if ((xamlInflators & XamlInflator.Runtime) == XamlInflator.Runtime) + sb.AppendLine($"\t\tprivate void InitializeComponent() => InitializeComponentRuntime();"); + else if ((xamlInflators & XamlInflator.SourceGen) == XamlInflator.SourceGen) + sb.AppendLine($"\t\tprivate void InitializeComponent() => InitializeComponentSourceGen();"); + else if ((xamlInflators & XamlInflator.XamlC) == XamlInflator.XamlC) + sb.AppendLine($"\t\tprivate void InitializeComponent() => InitializeComponentXamlC();"); + sb.AppendLine($"\t\t[global::System.CodeDom.Compiler.GeneratedCode(\"Microsoft.Maui.Controls.SourceGen\", \"1.0.0.0\")]"); - sb.AppendLine($"\t\tpublic {rootType}(global::Microsoft.Maui.Controls.Xaml.XamlInflator inflator)"); + sb.AppendLine($"\t\tinternal {rootType}(global::Microsoft.Maui.Controls.Xaml.XamlInflator inflator)"); sb.AppendLine("\t\t{"); sb.AppendLine("\t\t\tswitch (inflator)"); sb.AppendLine("\t\t\t{"); - if (xamlInflators == XamlInflator.Default || (xamlInflators & XamlInflator.Runtime) == XamlInflator.Runtime) + if ((xamlInflators & XamlInflator.Runtime) == XamlInflator.Runtime) { sb.AppendLine("\t\t\t\tcase global::Microsoft.Maui.Controls.Xaml.XamlInflator.Runtime:"); sb.AppendLine("\t\t\t\t\tInitializeComponentRuntime();"); sb.AppendLine("\t\t\t\t\tbreak;"); } - if (xamlInflators == XamlInflator.Default || (xamlInflators & XamlInflator.XamlC) == XamlInflator.XamlC) + if ((xamlInflators & XamlInflator.XamlC) == XamlInflator.XamlC) { sb.AppendLine("\t\t\t\tcase global::Microsoft.Maui.Controls.Xaml.XamlInflator.XamlC:"); sb.AppendLine("\t\t\t\t\tInitializeComponentXamlC();"); sb.AppendLine("\t\t\t\t\tbreak;"); } - if (xamlInflators == XamlInflator.Default || (xamlInflators & XamlInflator.SourceGen) == XamlInflator.SourceGen) + if ((xamlInflators & XamlInflator.SourceGen) == XamlInflator.SourceGen) { sb.AppendLine("\t\t\t\tcase global::Microsoft.Maui.Controls.Xaml.XamlInflator.SourceGen:"); sb.AppendLine("\t\t\t\t\tInitializeComponentSourceGen();"); sb.AppendLine("\t\t\t\t\tbreak;"); } - sb.AppendLine("\t\t\t\tcase global::Microsoft.Maui.Controls.Xaml.XamlInflator.Default:"); - sb.AppendLine("\t\t\t\t\tInitializeComponent();"); - sb.AppendLine("\t\t\t\t\tbreak;"); sb.AppendLine("\t\t\t\tdefault:"); sb.AppendLine("\t\t\t\t\tthrow new global::System.NotSupportedException($\"no code for {inflator} generated. check the [XamlProcessing] attribute.\");"); sb.AppendLine("\t\t\t}"); @@ -301,12 +297,14 @@ public static bool TryParseXaml(XamlProjectItemForCB parseResult, string uid, Co return false; } +#if _MAUIXAML_SOURCEGEN_BACKCOMPAT // if the following xml processing instruction is present // // // // we will generate a xaml.g.cs file with the default ctor calling InitializeComponent, and a XamlCompilation attribute var hasXamlCompilationProcessingInstruction = GetXamlCompilationProcessingInstruction(root.OwnerDocument); +#endif var rootClass = root.Attributes["Class", XamlParser.X2006Uri] ?? root.Attributes["Class", XamlParser.X2009Uri]; @@ -315,6 +313,7 @@ public static bool TryParseXaml(XamlProjectItemForCB parseResult, string uid, Co { XmlnsHelper.ParseXmlns(rootClass.Value, out rootType, out rootClrNamespace, out _, out _); } +#if _MAUIXAML_SOURCEGEN_BACKCOMPAT else if (hasXamlCompilationProcessingInstruction && root.NamespaceURI == XamlParser.MauiUri) { rootClrNamespace = "__XamlGeneratedCode__"; @@ -323,6 +322,7 @@ public static bool TryParseXaml(XamlProjectItemForCB parseResult, string uid, Co addXamlCompilationAttribute = true; hideFromIntellisense = true; } +#endif else if (parseResult?.ProjectItem?.ManifestResourceName != null && parseResult.ProjectItem.TargetPath != null) { // rootClass == null && !hasXamlCompilationProcessingInstruction) { xamlResourceIdOnly = true; //only generate the XamlResourceId assembly attribute @@ -345,6 +345,7 @@ public static bool TryParseXaml(XamlProjectItemForCB parseResult, string uid, Co return true; } +#if _MAUIXAML_SOURCEGEN_BACKCOMPAT //true, unless explicitely false static bool GetXamlCompilationProcessingInstruction(XmlDocument xmlDoc) { @@ -358,6 +359,7 @@ static bool GetXamlCompilationProcessingInstruction(XmlDocument xmlDoc) return true; } +#endif internal static string GetWarningDisable(XmlDocument xmlDoc) { diff --git a/src/Controls/src/SourceGen/CodeBehindGenerator.cs b/src/Controls/src/SourceGen/CodeBehindGenerator.cs index 3f67c36023b2..8bfc747f4005 100644 --- a/src/Controls/src/SourceGen/CodeBehindGenerator.cs +++ b/src/Controls/src/SourceGen/CodeBehindGenerator.cs @@ -218,26 +218,31 @@ static bool ShouldGenerateSourceGenInitializeComponent(XamlProjectItemForIC xaml var rootClass = root.Attributes["Class", XamlParser.X2006Uri] ?? root.Attributes["Class", XamlParser.X2009Uri]; + INamedTypeSymbol? rootType; - if (rootClass == null) - return false; - - XmlnsHelper.ParseXmlns(rootClass.Value, out var rootTypeName, out var rootClrNamespace, out _, out _); + if (rootClass != null) + { + XmlnsHelper.ParseXmlns(rootClass.Value, out var rootTypeName, out var rootClrNamespace, out _, out _); + rootType = compilation.GetTypeByMetadataName($"{rootClrNamespace}.{rootTypeName}"); + } + else + { //no x:Class, but it can be an autogenerated type (starting with __Type, and with a XamlResourceId attribute) + ITypeSymbol xamlResIdAttr = compilation.GetTypeByMetadataName("Microsoft.Maui.Controls.Xaml.XamlResourceIdAttribute")!; + INamedTypeSymbol? GetTypeForResourcePath(string resourcePath, IAssemblySymbol assembly) + { + var attr = assembly.GetAttributes(xamlResIdAttr).FirstOrDefault(attr => (string)attr.ConstructorArguments[1].Value! == resourcePath); + return attr?.ConstructorArguments[2].Value as INamedTypeSymbol; + } - var rootType = compilation.GetTypeByMetadataName($"{rootClrNamespace}.{rootTypeName}"); + rootType = GetTypeForResourcePath(xamlItem.ProjectItem.RelativePath!, compilation.Assembly); + } if (rootType == null) return false; - (_, var xamlInflators, var set) = rootType.GetXamlProcessing(); - - //this test must go as soon as 'set' goes away - if (!set) - return false; + var xamlInflators = xamlItem.ProjectItem.Inflator; - if ((xamlInflators & XamlInflator.SourceGen) != XamlInflator.SourceGen - && xamlInflators != XamlInflator.Default - && xamlItem.ProjectItem.ForceSourceGen == false) + if ((xamlInflators & XamlInflator.SourceGen) != XamlInflator.SourceGen) return false; return true; diff --git a/src/Controls/src/SourceGen/GeneratorHelpers.cs b/src/Controls/src/SourceGen/GeneratorHelpers.cs index ebf4360966a0..0be0f5e58b54 100644 --- a/src/Controls/src/SourceGen/GeneratorHelpers.cs +++ b/src/Controls/src/SourceGen/GeneratorHelpers.cs @@ -53,11 +53,33 @@ public static string EscapeIdentifier(string identifier) fileOptions.TryGetValue("build_metadata.additionalfiles.ManifestResourceName", out var manifestResourceName); fileOptions.TryGetValue("build_metadata.additionalfiles.RelativePath", out var relativePath); fileOptions.TryGetValue("build_property.targetframework", out var targetFramework); - fileOptions.TryGetValue("build_property._MauiForceXamlSourcegen", out var forceSourceGen); fileOptions.TryGetValue("build_property.Configuration", out var configuration); - return new ProjectItem(additionalText, targetPath: targetPath, relativePath: relativePath, manifestResourceName: manifestResourceName, kind: kind, targetFramework: targetFramework) + + fileOptions.TryGetValue("build_metadata.additionalfiles.Inflator", out var inflator); + + + var xamlinflator = 0; + if (!string.IsNullOrEmpty(inflator)) + { + var parts = inflator!.Split(','); + for (int i = 0; i < parts.Length; i++) + { + var trimmed = parts[i].Trim(); + if (!Enum.TryParse(trimmed, true, out var xinfl)) + throw new InvalidOperationException($"Invalid inflator '{trimmed}' for {additionalText.Path}."); + xamlinflator |= (int)xinfl; + } + } + + return new ProjectItem { - ForceSourceGen = forceSourceGen == true.ToString(), + AdditionalText = additionalText, + TargetPath = targetPath, + RelativePath = relativePath, + ManifestResourceName = manifestResourceName, + Kind = kind, + Inflator = (XamlInflator)xamlinflator, + TargetFramework = targetFramework, Configuration = configuration!, }; } diff --git a/src/Controls/src/SourceGen/ITypeSymbolExtensions.cs b/src/Controls/src/SourceGen/ITypeSymbolExtensions.cs index 187f1069b96c..e1fa53e20815 100644 --- a/src/Controls/src/SourceGen/ITypeSymbolExtensions.cs +++ b/src/Controls/src/SourceGen/ITypeSymbolExtensions.cs @@ -167,38 +167,6 @@ public static bool ImplementsGeneric(this ITypeSymbol type, ITypeSymbol iface, o return false; } - //FIXME: we won't need the set value in the future, but this allows to not generate for files without the attribute and avoid too many errors - public static (bool generateInflatorSwitch, XamlInflator inflators, bool set) GetXamlProcessing(this ITypeSymbol type) - { - var attr = type.GetAttributes("Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute").FirstOrDefault(ad => ad.ConstructorArguments.Length >= 1); - if (attr != null) - { - var inflator = (XamlInflator)attr.ConstructorArguments[0].Value!; - var generateInflatorSwitch = attr.ConstructorArguments.Length == 2 && (bool)attr.ConstructorArguments[1].Value!; - return (generateInflatorSwitch, inflator, true); - } - - var module = type.ContainingModule; - attr = module.GetAttributes("Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute").FirstOrDefault(ad => ad.ConstructorArguments.Length >= 1); - if (attr != null) - { - var inflator = (XamlInflator)attr.ConstructorArguments[0].Value!; - var generateInflatorSwitch = attr.ConstructorArguments.Length == 2 && (bool)attr.ConstructorArguments[1].Value!; - return (generateInflatorSwitch, inflator, true); - } - - var assembly = type.ContainingAssembly; - attr = assembly.GetAttributes("Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute").FirstOrDefault(ad => ad.ConstructorArguments.Length >= 1); - if (attr != null) - { - var inflator = (XamlInflator)attr.ConstructorArguments[0].Value!; - var generateInflatorSwitch = attr.ConstructorArguments.Length == 2 && (bool)attr.ConstructorArguments[1].Value!; - return (generateInflatorSwitch, inflator, true); - } - - return (false, XamlInflator.Default, false); - } - public static bool IsPublic(this ISymbol symbol) => symbol.DeclaredAccessibility == Accessibility.Public; public static bool IsPublicOrVisibleInternal(this ITypeSymbol type, IEnumerable internalsVisible) diff --git a/src/Controls/src/SourceGen/InitializeComponentCodeWriter.cs b/src/Controls/src/SourceGen/InitializeComponentCodeWriter.cs index 2026ecffb121..ded9035cf1d6 100644 --- a/src/Controls/src/SourceGen/InitializeComponentCodeWriter.cs +++ b/src/Controls/src/SourceGen/InitializeComponentCodeWriter.cs @@ -6,6 +6,7 @@ using System.Runtime.InteropServices; using System.Xml; using Microsoft.CodeAnalysis; +using System.Linq; using Microsoft.Maui.Controls.Xaml; namespace Microsoft.Maui.Controls.SourceGen; @@ -45,9 +46,11 @@ PrePost newblock() => } var root = xamlItem.Root!; + string accessModifier = "public"; + INamedTypeSymbol? rootType = null; + if (root.Properties.TryGetValue(XmlName.xClass, out var classNode)) { - string accessModifier = "public"; if ((classNode as ValueNode)?.Value is not string rootClass) goto exit; @@ -56,58 +59,61 @@ PrePost newblock() => var classModifier = (classModifierNode as ValueNode)?.Value as string; accessModifier = classModifier?.ToLowerInvariant().Replace("notpublic", "internal") ?? "public"; // notpublic is WPF for internal } - //TODO support x:TypeArguments XmlnsHelper.ParseXmlns(rootClass, out var rootTypeName, out var rootClrNamespace, out _, out _); - var rootType = compilation.GetTypeByMetadataName($"{rootClrNamespace}.{rootTypeName}"); - //roottype null might mean we need to add the type to the Compilation, we'll figure that out later - if (rootType == null) - goto exit; + rootType = compilation.GetTypeByMetadataName($"{rootClrNamespace}.{rootTypeName}"); + } + else + { //no x:Class, but it can be an autogenerated type (starting with __Type, and with a XamlResourceId attribute) + ITypeSymbol xamlResIdAttr = compilation.GetTypeByMetadataName("Microsoft.Maui.Controls.Xaml.XamlResourceIdAttribute")!; + INamedTypeSymbol? GetTypeForResourcePath(string resourcePath, IAssemblySymbol assembly) + { + var attr = assembly.GetAttributes(xamlResIdAttr).FirstOrDefault(attr => (string)attr.ConstructorArguments[1].Value! == resourcePath); + return attr?.ConstructorArguments[2].Value as INamedTypeSymbol; + } - (var genSwitch, var xamlInflators, var set) = rootType.GetXamlProcessing(); + rootType = GetTypeForResourcePath(xamlItem.ProjectItem.RelativePath!, compilation.Assembly); + } - //FIXME later we shouln't gnerate the file at all if generate is false - var generate = (xamlInflators & XamlInflator.SourceGen) == XamlInflator.SourceGen - || xamlItem.ProjectItem.ForceSourceGen - || xamlInflators == XamlInflator.Default && genSwitch; + if (rootType == null) + goto exit; - if (!generate) - goto exit; + var genSwitch = compilation.AssemblyName == "Microsoft.Maui.Controls.Xaml.UnitTests"; + var xamlInflators = xamlItem.ProjectItem.Inflator; - codeWriter.WriteLine($"namespace {rootClrNamespace};"); - codeWriter.WriteLine(); + var generate = (xamlInflators & XamlInflator.SourceGen) == XamlInflator.SourceGen; + + if (!generate) + goto exit; + + codeWriter.WriteLine($"namespace {rootType.ContainingNamespace};"); + codeWriter.WriteLine(); + if (!rootType.Name.StartsWith("__Type")) codeWriter.WriteLine(GeneratedCodeAttribute); - codeWriter.WriteLine($"{accessModifier} partial class {rootTypeName}"); + codeWriter.WriteLine($"{accessModifier} partial class {rootType.Name}"); + using (newblock()) + { + var methodName = genSwitch ? "InitializeComponentSourceGen" : "InitializeComponent"; + codeWriter.WriteLine($"private partial void {methodName}()"); + xamlItem.Root!.XmlType.TryResolveTypeSymbol(null, compilation, xmlnsCache, out var baseType); + var sgcontext = new SourceGenContext(codeWriter, compilation, sourceProductionContext, xmlnsCache, typeCache, rootType!, baseType) { FilePath = xamlItem.ProjectItem.RelativePath }; using (newblock()) { - var methodName = genSwitch ? "InitializeComponentSourceGen" : "InitializeComponent"; - codeWriter.WriteLine($"private partial void {methodName}()"); - xamlItem.Root!.XmlType.TryResolveTypeSymbol(null, compilation, xmlnsCache, out var baseType); - var sgcontext = new SourceGenContext(codeWriter, compilation, sourceProductionContext, xmlnsCache, typeCache, rootType!, baseType) { FilePath = xamlItem.ProjectItem.RelativePath }; - using (newblock()) - { - Visit(root, sgcontext); - - foreach (var localMethod in sgcontext.LocalMethods) - { - codeWriter.WriteLine(localMethod); - codeWriter.WriteLine(); - } - } + Visit(root, sgcontext); - foreach (var writer in sgcontext.AddtitionalWriters) + foreach (var localMethod in sgcontext.LocalMethods) { - codeWriter.Write(writer.ToString()); + codeWriter.WriteLine(localMethod); codeWriter.WriteLine(); } } - } - else - { //No x:Class attribute - //TODO - + foreach (var writer in sgcontext.AddtitionalWriters) + { + codeWriter.Write(writer.ToString()); + codeWriter.WriteLine(); + } } exit: codeWriter.Flush(); diff --git a/src/Controls/src/SourceGen/ProjectItem.cs b/src/Controls/src/SourceGen/ProjectItem.cs index 896ed1185cf6..7a3200c7f063 100644 --- a/src/Controls/src/SourceGen/ProjectItem.cs +++ b/src/Controls/src/SourceGen/ProjectItem.cs @@ -1,27 +1,19 @@ using Microsoft.CodeAnalysis; +using Microsoft.Maui.Controls.Xaml; namespace Microsoft.Maui.Controls.SourceGen; -class ProjectItem +record ProjectItem { - public ProjectItem(AdditionalText additionalText, string? targetPath, string? relativePath, string? manifestResourceName, string kind, string? targetFramework) - { - AdditionalText = additionalText; - TargetPath = targetPath ?? additionalText.Path; - RelativePath = relativePath; - ManifestResourceName = manifestResourceName; - Kind = kind; - TargetFramework = targetFramework; - } - - public AdditionalText AdditionalText { get; } - public string? TargetPath { get; } - public string? RelativePath { get; } - public string? ManifestResourceName { get; } - public string Kind { get; } - public string? TargetFramework { get; } + public required AdditionalText AdditionalText { get; init; } + private string? _targetPath; + public string? TargetPath { get => _targetPath ?? AdditionalText.Path; init => _targetPath = value; } + public string? RelativePath { get; init; } + public string? ManifestResourceName { get; init; } + public required string Kind { get; init; } + public string? TargetFramework { get; init; } + public required XamlInflator Inflator { get; init; } //bypass attribute check. used for testing - public bool ForceSourceGen { get; internal set; } public string Configuration { get; internal set; } = "Debug"; } diff --git a/src/Controls/src/SourceGen/compat.cs b/src/Controls/src/SourceGen/compat.cs new file mode 100644 index 000000000000..49832e9e3e1c --- /dev/null +++ b/src/Controls/src/SourceGen/compat.cs @@ -0,0 +1,47 @@ +// 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. + +//allow usage of required and record in netstandard2.0 + +using System.ComponentModel; + +namespace System.Runtime.CompilerServices +{ +#if !NET5_0_OR_GREATER + + [EditorBrowsable(EditorBrowsableState.Never)] + internal static class IsExternalInit {} + +#endif // !NET5_0_OR_GREATER + +#if !NET7_0_OR_GREATER + + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] + internal sealed class RequiredMemberAttribute : Attribute {} + + [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)] + internal sealed class CompilerFeatureRequiredAttribute : Attribute + { + public CompilerFeatureRequiredAttribute(string featureName) + { + FeatureName = featureName; + } + + public string FeatureName { get; } + public bool IsOptional { get; init; } + + public const string RefStructs = nameof(RefStructs); + public const string RequiredMembers = nameof(RequiredMembers); + } + +#endif // !NET7_0_OR_GREATER +} + +namespace System.Diagnostics.CodeAnalysis +{ +#if !NET7_0_OR_GREATER + [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false, Inherited = false)] + internal sealed class SetsRequiredMembersAttribute : Attribute {} +#endif +} \ No newline at end of file diff --git a/src/Controls/src/Xaml/PublicAPI/net-android/PublicAPI.Unshipped.txt b/src/Controls/src/Xaml/PublicAPI/net-android/PublicAPI.Unshipped.txt index c35016ca9941..e393e24d2252 100644 --- a/src/Controls/src/Xaml/PublicAPI/net-android/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Xaml/PublicAPI/net-android/PublicAPI.Unshipped.txt @@ -8,14 +8,6 @@ *REMOVED*~Microsoft.Maui.Controls.Xaml.FontImageExtension.ProvideValue(System.IServiceProvider serviceProvider) -> Microsoft.Maui.Controls.ImageSource *REMOVED*Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.get -> double *REMOVED*Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.set -> void -Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Default = 0 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Runtime = 1 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.XamlC = 2 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.SourceGen = 4 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlProcessingAttribute(Microsoft.Maui.Controls.Xaml.XamlInflator inflator) -> void -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlInflator.get -> Microsoft.Maui.Controls.Xaml.XamlInflator Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider ~Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider.XamlDataTypeProvider(string dataType) -> void ~Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider.XamlServiceProvider(object rootObject) -> void diff --git a/src/Controls/src/Xaml/PublicAPI/net-ios/PublicAPI.Unshipped.txt b/src/Controls/src/Xaml/PublicAPI/net-ios/PublicAPI.Unshipped.txt index c35016ca9941..e393e24d2252 100644 --- a/src/Controls/src/Xaml/PublicAPI/net-ios/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Xaml/PublicAPI/net-ios/PublicAPI.Unshipped.txt @@ -8,14 +8,6 @@ *REMOVED*~Microsoft.Maui.Controls.Xaml.FontImageExtension.ProvideValue(System.IServiceProvider serviceProvider) -> Microsoft.Maui.Controls.ImageSource *REMOVED*Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.get -> double *REMOVED*Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.set -> void -Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Default = 0 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Runtime = 1 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.XamlC = 2 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.SourceGen = 4 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlProcessingAttribute(Microsoft.Maui.Controls.Xaml.XamlInflator inflator) -> void -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlInflator.get -> Microsoft.Maui.Controls.Xaml.XamlInflator Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider ~Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider.XamlDataTypeProvider(string dataType) -> void ~Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider.XamlServiceProvider(object rootObject) -> void diff --git a/src/Controls/src/Xaml/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt b/src/Controls/src/Xaml/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt index c35016ca9941..e393e24d2252 100644 --- a/src/Controls/src/Xaml/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Xaml/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt @@ -8,14 +8,6 @@ *REMOVED*~Microsoft.Maui.Controls.Xaml.FontImageExtension.ProvideValue(System.IServiceProvider serviceProvider) -> Microsoft.Maui.Controls.ImageSource *REMOVED*Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.get -> double *REMOVED*Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.set -> void -Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Default = 0 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Runtime = 1 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.XamlC = 2 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.SourceGen = 4 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlProcessingAttribute(Microsoft.Maui.Controls.Xaml.XamlInflator inflator) -> void -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlInflator.get -> Microsoft.Maui.Controls.Xaml.XamlInflator Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider ~Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider.XamlDataTypeProvider(string dataType) -> void ~Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider.XamlServiceProvider(object rootObject) -> void diff --git a/src/Controls/src/Xaml/PublicAPI/net-tizen/PublicAPI.Unshipped.txt b/src/Controls/src/Xaml/PublicAPI/net-tizen/PublicAPI.Unshipped.txt index c35016ca9941..e393e24d2252 100644 --- a/src/Controls/src/Xaml/PublicAPI/net-tizen/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Xaml/PublicAPI/net-tizen/PublicAPI.Unshipped.txt @@ -8,14 +8,6 @@ *REMOVED*~Microsoft.Maui.Controls.Xaml.FontImageExtension.ProvideValue(System.IServiceProvider serviceProvider) -> Microsoft.Maui.Controls.ImageSource *REMOVED*Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.get -> double *REMOVED*Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.set -> void -Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Default = 0 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Runtime = 1 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.XamlC = 2 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.SourceGen = 4 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlProcessingAttribute(Microsoft.Maui.Controls.Xaml.XamlInflator inflator) -> void -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlInflator.get -> Microsoft.Maui.Controls.Xaml.XamlInflator Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider ~Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider.XamlDataTypeProvider(string dataType) -> void ~Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider.XamlServiceProvider(object rootObject) -> void diff --git a/src/Controls/src/Xaml/PublicAPI/net-windows/PublicAPI.Unshipped.txt b/src/Controls/src/Xaml/PublicAPI/net-windows/PublicAPI.Unshipped.txt index 1393cf62e369..8c0c1145a575 100644 --- a/src/Controls/src/Xaml/PublicAPI/net-windows/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Xaml/PublicAPI/net-windows/PublicAPI.Unshipped.txt @@ -68,14 +68,6 @@ Microsoft.Maui.Controls.Xaml.XamlCompilationOptions Microsoft.Maui.Controls.Xaml.XamlCompilationOptions.Compile = 2 -> Microsoft.Maui.Controls.Xaml.XamlCompilationOptions Microsoft.Maui.Controls.Xaml.XamlCompilationOptions.Skip = 1 -> Microsoft.Maui.Controls.Xaml.XamlCompilationOptions Microsoft.Maui.Controls.Xaml.XamlFilePathAttribute -Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Default = 0 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Runtime = 1 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.XamlC = 2 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.SourceGen = 4 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlProcessingAttribute(Microsoft.Maui.Controls.Xaml.XamlInflator inflator) -> void -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlInflator.get -> Microsoft.Maui.Controls.Xaml.XamlInflator Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider ~Microsoft.Maui.Controls.Xaml.AppThemeBindingExtension.Dark.get -> object ~Microsoft.Maui.Controls.Xaml.AppThemeBindingExtension.Dark.set -> void diff --git a/src/Controls/src/Xaml/PublicAPI/net/PublicAPI.Unshipped.txt b/src/Controls/src/Xaml/PublicAPI/net/PublicAPI.Unshipped.txt index c35016ca9941..e393e24d2252 100644 --- a/src/Controls/src/Xaml/PublicAPI/net/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Xaml/PublicAPI/net/PublicAPI.Unshipped.txt @@ -8,14 +8,6 @@ *REMOVED*~Microsoft.Maui.Controls.Xaml.FontImageExtension.ProvideValue(System.IServiceProvider serviceProvider) -> Microsoft.Maui.Controls.ImageSource *REMOVED*Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.get -> double *REMOVED*Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.set -> void -Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Default = 0 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Runtime = 1 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.XamlC = 2 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.SourceGen = 4 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlProcessingAttribute(Microsoft.Maui.Controls.Xaml.XamlInflator inflator) -> void -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlInflator.get -> Microsoft.Maui.Controls.Xaml.XamlInflator Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider ~Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider.XamlDataTypeProvider(string dataType) -> void ~Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider.XamlServiceProvider(object rootObject) -> void diff --git a/src/Controls/src/Xaml/PublicAPI/netstandard/PublicAPI.Unshipped.txt b/src/Controls/src/Xaml/PublicAPI/netstandard/PublicAPI.Unshipped.txt index c35016ca9941..e393e24d2252 100644 --- a/src/Controls/src/Xaml/PublicAPI/netstandard/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Xaml/PublicAPI/netstandard/PublicAPI.Unshipped.txt @@ -8,14 +8,6 @@ *REMOVED*~Microsoft.Maui.Controls.Xaml.FontImageExtension.ProvideValue(System.IServiceProvider serviceProvider) -> Microsoft.Maui.Controls.ImageSource *REMOVED*Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.get -> double *REMOVED*Microsoft.Maui.Controls.Xaml.FontImageExtension.Size.set -> void -Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Default = 0 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.Runtime = 1 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.XamlC = 2 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlInflator.SourceGen = 4 -> Microsoft.Maui.Controls.Xaml.XamlInflator -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlProcessingAttribute(Microsoft.Maui.Controls.Xaml.XamlInflator inflator) -> void -Microsoft.Maui.Controls.Xaml.XamlProcessingAttribute.XamlInflator.get -> Microsoft.Maui.Controls.Xaml.XamlInflator Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider ~Microsoft.Maui.Controls.Xaml.Internals.XamlDataTypeProvider.XamlDataTypeProvider(string dataType) -> void ~Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider.XamlServiceProvider(object rootObject) -> void diff --git a/src/Controls/src/Xaml/XamlCompilationAttribute.cs b/src/Controls/src/Xaml/XamlCompilationAttribute.cs index e0e923ebecc8..6bfec7586c52 100644 --- a/src/Controls/src/Xaml/XamlCompilationAttribute.cs +++ b/src/Controls/src/Xaml/XamlCompilationAttribute.cs @@ -4,8 +4,9 @@ namespace Microsoft.Maui.Controls.Xaml { - // TODO: obsolete when we are ready to switch to SourceGen - // [Obsolete("use XamlProcessingOptions instead.")] +#if !_MAUIXAML_SOURCEGEN_BACKCOMPAT + [Obsolete("Specify xaml inflator and other options using msbuild metadata on MauiXaml items in your .csproj: ", error: true)] +#endif [Flags] public enum XamlCompilationOptions { @@ -13,8 +14,9 @@ public enum XamlCompilationOptions Compile = XamlInflator.XamlC, } - // TODO: obsolete when we are ready to switch to SourceGen - // [Obsolete("use XamlProcessingAttribute instead.")] +#if !_MAUIXAML_SOURCEGEN_BACKCOMPAT + [Obsolete("Specify xaml inflator and other options using msbuild metadata on MauiXaml items in your .csproj: ", error: true)] +#endif [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class, Inherited = false)] public sealed class XamlCompilationAttribute : Attribute { @@ -26,11 +28,11 @@ public XamlCompilationAttribute(XamlCompilationOptions xamlCompilationOptions) public XamlCompilationOptions XamlCompilationOptions { get; set; } } +#if _MAUIXAML_SOURCEGEN_BACKCOMPAT static class XamlCExtensions { public static bool IsCompiled(this Type type) { -#pragma warning disable CS0618 // Type or member is obsolete var attr = type.GetCustomAttribute(); if (attr != null) return attr.XamlCompilationOptions == XamlCompilationOptions.Compile; @@ -42,7 +44,7 @@ public static bool IsCompiled(this Type type) return attr.XamlCompilationOptions == XamlCompilationOptions.Compile; return false; -#pragma warning restore CS0618 // Type or member is obsolete } } +#endif } \ No newline at end of file diff --git a/src/Controls/src/Xaml/XamlInflator.cs b/src/Controls/src/Xaml/XamlInflator.cs index b5746ba79124..dc2a4a59c436 100644 --- a/src/Controls/src/Xaml/XamlInflator.cs +++ b/src/Controls/src/Xaml/XamlInflator.cs @@ -1,16 +1,9 @@ -namespace Microsoft.Maui.Controls.Xaml +namespace Microsoft.Maui.Controls.Xaml; + +//used for unit testing switching, and internal use of the sourcegen +enum XamlInflator { - public enum XamlInflator - { - /// - /// Picks the best Inflator available, don't change it unless you know what you're doing. - /// - Default = 0, - Runtime = 1 << 0, - XamlC = 1 << 1, -#if !NETSTANDARD2_0 && !NETSTANDARD2_1 - [System.Runtime.Versioning.RequiresPreviewFeatures] -#endif - SourceGen = 1 << 2, - } + Runtime = 1 << 0, + XamlC = 1 << 1, + SourceGen = 1 << 2, } \ No newline at end of file diff --git a/src/Controls/src/Xaml/XamlProcessingAttribute.cs b/src/Controls/src/Xaml/XamlProcessingAttribute.cs deleted file mode 100644 index a694dc9f816f..000000000000 --- a/src/Controls/src/Xaml/XamlProcessingAttribute.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Runtime.Versioning; - -namespace Microsoft.Maui.Controls.Xaml; - -[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class, Inherited = false)] -//when we remove this attribute, we'll have to obsolete XamlCompilationAttribute -#if !NETSTANDARD -[System.Runtime.Versioning.RequiresPreviewFeatures] -#endif -public sealed class XamlProcessingAttribute : Attribute -{ - public XamlProcessingAttribute(XamlInflator inflator) - { - if ((inflator & (inflator - 1)) != 0) //check if only one bit is set (http://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2 - throw new ArgumentException("Only one option can be set at a time"); - XamlInflator = inflator; - } - - internal XamlProcessingAttribute(XamlInflator inflators, bool generateInflatorSwitch) - { - XamlInflator = inflators; //used as a flag to indicate the infators used for unit test purposes - GenerateInflatorSwitch = generateInflatorSwitch; - } - - public XamlInflator XamlInflator { get; } - internal bool GenerateInflatorSwitch { get; } -} \ No newline at end of file diff --git a/src/Controls/tests/SourceGen.UnitTests/SourceGeneratorDriver.cs b/src/Controls/tests/SourceGen.UnitTests/SourceGeneratorDriver.cs index 0d0833fa058d..0f58065a9d3c 100644 --- a/src/Controls/tests/SourceGen.UnitTests/SourceGeneratorDriver.cs +++ b/src/Controls/tests/SourceGen.UnitTests/SourceGeneratorDriver.cs @@ -151,6 +151,7 @@ public override bool TryGetValue(string key, [NotNullWhen(true)] out string? val "build_metadata.additionalfiles.TargetPath" => _additionalFile.TargetPath, "build_metadata.additionalfiles.ManifestResourceName" => _additionalFile.ManifestResourceName, "build_metadata.additionalfiles.RelativePath" => _additionalFile.RelativePath, + "build_metadata.additionalfiles.Inflator" => "SourceGen", "build_property.targetframework" => _additionalFile.TargetFramework, _ => null }; diff --git a/src/Controls/tests/TestCases.HostApp/Elements/CollectionView/HeaderFooterGalleries/HeaderFooterView.xaml b/src/Controls/tests/TestCases.HostApp/Elements/CollectionView/HeaderFooterGalleries/HeaderFooterView.xaml index f1a9f5af30e3..0bda91b2ddd1 100644 --- a/src/Controls/tests/TestCases.HostApp/Elements/CollectionView/HeaderFooterGalleries/HeaderFooterView.xaml +++ b/src/Controls/tests/TestCases.HostApp/Elements/CollectionView/HeaderFooterGalleries/HeaderFooterView.xaml @@ -1,4 +1,4 @@ - + false 0114;0672;0108;0067;0168;0169;0219;0612;0618;1998 Controls.Xaml.UnitTests.ExternalAssembly + + @@ -21,6 +24,7 @@ + diff --git a/src/Controls/tests/Xaml.UnitTests/AcceptEmptyServiceProvider.xaml.cs b/src/Controls/tests/Xaml.UnitTests/AcceptEmptyServiceProvider.xaml.cs index eeeb46884c9a..f3cfea50a960 100644 --- a/src/Controls/tests/Xaml.UnitTests/AcceptEmptyServiceProvider.xaml.cs +++ b/src/Controls/tests/Xaml.UnitTests/AcceptEmptyServiceProvider.xaml.cs @@ -20,7 +20,6 @@ object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider) } } - [XamlProcessing(XamlInflator.Default, true)] public partial class AcceptEmptyServiceProvider : ContentPage { public AcceptEmptyServiceProvider() diff --git a/src/Controls/tests/Xaml.UnitTests/AppResources/Colors.xaml b/src/Controls/tests/Xaml.UnitTests/AppResources/Colors.rtxc.xaml similarity index 100% rename from src/Controls/tests/Xaml.UnitTests/AppResources/Colors.xaml rename to src/Controls/tests/Xaml.UnitTests/AppResources/Colors.rtxc.xaml diff --git a/src/Controls/tests/Xaml.UnitTests/AppResources/CompiledColors.xaml b/src/Controls/tests/Xaml.UnitTests/AppResources/CompiledColors.rtxc.xaml similarity index 100% rename from src/Controls/tests/Xaml.UnitTests/AppResources/CompiledColors.xaml rename to src/Controls/tests/Xaml.UnitTests/AppResources/CompiledColors.rtxc.xaml diff --git a/src/Controls/tests/Xaml.UnitTests/AppResources/RD13209.xaml b/src/Controls/tests/Xaml.UnitTests/AppResources/RD13209.rtxc.xaml similarity index 100% rename from src/Controls/tests/Xaml.UnitTests/AppResources/RD13209.xaml rename to src/Controls/tests/Xaml.UnitTests/AppResources/RD13209.rtxc.xaml diff --git a/src/Controls/tests/Xaml.UnitTests/AutoMergedResourceDictionaries.xaml b/src/Controls/tests/Xaml.UnitTests/AutoMergedResourceDictionaries.xaml index e47fdb970c53..ce9d29db2111 100644 --- a/src/Controls/tests/Xaml.UnitTests/AutoMergedResourceDictionaries.xaml +++ b/src/Controls/tests/Xaml.UnitTests/AutoMergedResourceDictionaries.xaml @@ -7,7 +7,7 @@ Purple Pink - +