Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[xamlc] convert {OnIdiom} to OnIdiomExtension<T> #28700

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

jonathanpeppers
Copy link
Member

Fixes: #22142

The dotnet new maui -sc template has trimmer warnings such as:

obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_Styles.xaml.sg.cs(33): Trim analysis warning IL2026: __XamlGeneratedCode__.__Type608CCEEBECE9213C.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_Styles.xaml.sg.cs(33): Trim analysis warning IL2026: __XamlGeneratedCode__.__Type608CCEEBECE9213C.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_AppStyles.xaml.sg.cs(33): Trim analysis warning IL2026: __XamlGeneratedCode__.__Type675A47C870224F5D.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_AppStyles.xaml.sg.cs(33): Trim analysis warning IL2026: __XamlGeneratedCode__.__Type675A47C870224F5D.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_AppStyles.xaml.sg.cs(33): Trim analysis warning IL2026: __XamlGeneratedCode__.__Type675A47C870224F5D.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_AppStyles.xaml.sg.cs(33): Trim analysis warning IL2026: __XamlGeneratedCode__.__Type675A47C870224F5D.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_Controls_TaskView.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.Controls.TaskView.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_Controls_TaskView.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.Controls.TaskView.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_Controls_CategoryChart.xaml.sg.cs(27): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.Controls.CategoryChart.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_ManageMetaPage.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.ManageMetaPage.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_ManageMetaPage.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.ManageMetaPage.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_ManageMetaPage.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.ManageMetaPage.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_TaskDetailPage.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.TaskDetailPage.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_ProjectDetailPage.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.ProjectDetailPage.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
ILC : Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.ProjectDetailPage.<InitializeComponent>_anonXamlCDataTemplate_5.LoadDataTemplate(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
ILC : Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.ProjectDetailPage.<InitializeComponent>_anonXamlCDataTemplate_6.LoadDataTemplate(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.

Most these are due to simple {OnIdiom} usage in XAML files like:

<Label Text="{OnIdiom Default=default, Desktop=desktop, Phone=phone}" />

One way we could fix this:

  • Make an internal OnIdiomExtension<T> class with no trimmer warnings

  • XamlC looks up the target type for {OnIdiom} and uses OnIdiomExtension<T> instead of OnIdiomExtension when generating the code.

This currently duplicates the OnIdiomExtension class, which I'll investigate if that can be done a different way.

@jonathanpeppers
Copy link
Member Author

/cc @simonrozsival

@StephaneDelcroix

This comment was marked as outdated.

@@ -94,6 +95,39 @@ public void Visit(ElementNode node, INode parentNode)
return;
}

// Convert OnIdiomExtension to OnIdiomExtension<T>
if (typeref.FullName == "Microsoft.Maui.Controls.Xaml.OnIdiomExtension")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't we handle this as a compiled markup extension (the lines just after these ones) ?

typeof(IValueConverterProvider),
typeof(IXmlLineInfoProvider),
typeof(IConverterOptions)])]
internal class OnIdiomExtension<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] T> : IMarkupExtension
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if it's used by generated code, it has to be public (the tests passes cause there's an internalsvisibleto for the unit tests project)

you can decorate it with a [EditorBrowseable] attribute, or even [Obsolete] it to prevent usage... or move it to a namespace with 'Internals' in the name...

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So, this might be the cause of the current CI failures. I'll try a public type in the *.Internals namespace.

@StephaneDelcroix
Copy link
Contributor

it's really annoying that, unlike OnPlatform, we can't know at build time which idiom will be used...

@jonathanpeppers jonathanpeppers changed the title [xamlc] convert {OnPlatform} to OnPlatformExtension<T> [xamlc] convert {OnIdiom} to OnIdiomExtension<T> Apr 3, 2025
Fixes: #22142

The `dotnet new maui -sc` template has trimmer warnings such as:

    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_Styles.xaml.sg.cs(33): Trim analysis warning IL2026: __XamlGeneratedCode__.__Type608CCEEBECE9213C.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_Styles.xaml.sg.cs(33): Trim analysis warning IL2026: __XamlGeneratedCode__.__Type608CCEEBECE9213C.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_AppStyles.xaml.sg.cs(33): Trim analysis warning IL2026: __XamlGeneratedCode__.__Type675A47C870224F5D.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_AppStyles.xaml.sg.cs(33): Trim analysis warning IL2026: __XamlGeneratedCode__.__Type675A47C870224F5D.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_AppStyles.xaml.sg.cs(33): Trim analysis warning IL2026: __XamlGeneratedCode__.__Type675A47C870224F5D.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_AppStyles.xaml.sg.cs(33): Trim analysis warning IL2026: __XamlGeneratedCode__.__Type675A47C870224F5D.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_Controls_TaskView.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.Controls.TaskView.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_Controls_TaskView.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.Controls.TaskView.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_Controls_CategoryChart.xaml.sg.cs(27): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.Controls.CategoryChart.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_ManageMetaPage.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.ManageMetaPage.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_ManageMetaPage.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.ManageMetaPage.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_ManageMetaPage.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.ManageMetaPage.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_TaskDetailPage.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.TaskDetailPage.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    obj/Release/net10.0-ios/ios-arm64/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Pages_ProjectDetailPage.xaml.sg.cs(25): Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.ProjectDetailPage.InitializeComponent(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    ILC : Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.ProjectDetailPage.<InitializeComponent>_anonXamlCDataTemplate_5.LoadDataTemplate(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.
    ILC : Trim analysis warning IL2026: dotnet_new_maui_samplecontent.Pages.ProjectDetailPage.<InitializeComponent>_anonXamlCDataTemplate_6.LoadDataTemplate(): Using member 'Microsoft.Maui.Controls.Xaml.OnIdiomExtension.OnIdiomExtension()' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. The OnIdiomExtension is not trim safe. Use OnIdiom<T> instead.

Most these are due to simple `{OnIdiom}` usage in XAML files like:

```xml
<Label Text="{OnIdiom Default=default, Desktop=desktop, Phone=phone}" />
````

One way we could fix this:

* Make an internal `OnIdiomExtension<T>` class with no trimmer warnings

* XamlC looks up the target type for `{OnIdiom}` and uses
  `OnIdiomExtension<T>` instead of `OnIdiomExtension` when generating
  the code.

This currently duplicates the `OnIdiomExtension` class, which I'll
investigate if that can be done a different way.
@rmarinho rmarinho added the area-xaml XAML, CSS, Triggers, Behaviors label Apr 9, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area-xaml XAML, CSS, Triggers, Behaviors
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[XC] Consider compiling the OnIdiomExtension into OnIdiom<T>
3 participants