diff --git a/src/Controls/src/SourceGen/AnalyzerConfigOptionsExtensions.cs b/src/Controls/src/SourceGen/AnalyzerConfigOptionsExtensions.cs new file mode 100644 index 000000000000..5106f2a8327f --- /dev/null +++ b/src/Controls/src/SourceGen/AnalyzerConfigOptionsExtensions.cs @@ -0,0 +1,25 @@ +using System; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace Microsoft.Maui.Controls.SourceGen; + +public static class AnalyzerConfigOptionsExtensions +{ + public static bool IsEnabled(this AnalyzerConfigOptions options, string key) + => options.TryGetValue(key, out var value) && string.Compare(value, "enable", StringComparison.OrdinalIgnoreCase) == 0; + + public static bool IsDisabled(this AnalyzerConfigOptions options, string key) + => options.TryGetValue(key, out var value) && string.Compare(value, "disable", StringComparison.OrdinalIgnoreCase) == 0; + + public static bool IsTrue(this AnalyzerConfigOptions options, string key) + => options.TryGetValue(key, out var value) && string.Compare(value, "true", StringComparison.OrdinalIgnoreCase) == 0; + + public static bool IsFalse(this AnalyzerConfigOptions options, string key) + => options.TryGetValue(key, out var value) && string.Compare(value, "false", StringComparison.OrdinalIgnoreCase) == 0; + + public static string GetValueOrDefault(this AnalyzerConfigOptions options, string key, string defaultValue) + => options.TryGetValue(key, out var value) ? value : defaultValue; + + public static string? GetValueOrNull(this AnalyzerConfigOptions options, string key) + => options.TryGetValue(key, out var value) ? value : null; +} diff --git a/src/Controls/src/SourceGen/CompiledBindingMarkup.cs b/src/Controls/src/SourceGen/CompiledBindingMarkup.cs index 8b5458b95f09..27564e50926f 100644 --- a/src/Controls/src/SourceGen/CompiledBindingMarkup.cs +++ b/src/Controls/src/SourceGen/CompiledBindingMarkup.cs @@ -26,7 +26,7 @@ public CompiledBindingMarkup(IElementNode node, string path, LocalVariable bindi } private Location GetLocation(INode node) - => LocationHelpers.LocationCreate(_context.FilePath!, (IXmlLineInfo)node, "x:DataType"); + => LocationHelpers.LocationCreate(_context.ProjectItem.RelativePath!, (IXmlLineInfo)node, "x:DataType"); public bool TryCompileBinding(ITypeSymbol sourceType, bool isTemplateBinding, out string? newBindingExpression) { diff --git a/src/Controls/src/SourceGen/GeneratorHelpers.cs b/src/Controls/src/SourceGen/GeneratorHelpers.cs index a81d1deb5dac..0716d6551c3a 100644 --- a/src/Controls/src/SourceGen/GeneratorHelpers.cs +++ b/src/Controls/src/SourceGen/GeneratorHelpers.cs @@ -36,71 +36,16 @@ public static string EscapeIdentifier(string identifier) : $"@{identifier}"; } - public static ProjectItem? ComputeProjectItem((AdditionalText, AnalyzerConfigOptionsProvider) tuple, CancellationToken cancellationToken) + public static ProjectItem? ComputeProjectItem((AdditionalText additionalText, AnalyzerConfigOptionsProvider optionsProvider) tuple, CancellationToken cancellationToken) { - var (additionalText, optionsProvider) = tuple; - var fileOptions = optionsProvider.GetOptions(additionalText); - if (!fileOptions.TryGetValue("build_metadata.additionalfiles.GenKind", out string? kind) || kind is null) + if (cancellationToken.IsCancellationRequested) return null; - fileOptions.TryGetValue("build_metadata.additionalfiles.TargetPath", out var targetPath); - 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.Configuration", out var configuration); - - bool enableDiagnostics = false; - if (fileOptions.TryGetValue("build_property.EnableMauiXamlDiagnostics", out var enDiag) && string.Compare(enDiag, "true", StringComparison.OrdinalIgnoreCase) == 0) - enableDiagnostics = true; - if (fileOptions.TryGetValue("build_property.additionalfiles.EnableDiagnostics", out enDiag) && string.Compare(enDiag, "true", StringComparison.OrdinalIgnoreCase) == 0) - enableDiagnostics = true; - if (fileOptions.TryGetValue("build_property.additionalfiles.EnableDiagnostics", out enDiag) && string.Compare(enDiag, "false", StringComparison.OrdinalIgnoreCase) == 0) - enableDiagnostics = false; - - var xamlinflator = 0; - if (fileOptions.TryGetValue("build_metadata.additionalfiles.Inflator", out var inflator) && !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; - } - } - - var enableLineInfo = true; - if (fileOptions.TryGetValue("build_property.MauiXamlLineInfo", out var lineInfo) && string.Compare(lineInfo, "disable", StringComparison.OrdinalIgnoreCase) == 0) - enableLineInfo = false; - if (fileOptions.TryGetValue("build_metadata.additionalfiles.LineInfo", out lineInfo) && string.Compare(lineInfo, "enable", StringComparison.OrdinalIgnoreCase) == 0) - enableLineInfo = true; - if (fileOptions.TryGetValue("build_metadata.additionalfiles.LineInfo", out lineInfo) && string.Compare(lineInfo, "disable", StringComparison.OrdinalIgnoreCase) == 0) - enableLineInfo = false; - - string noWarn = ""; - if (fileOptions.TryGetValue("build_property.MauiXamlNoWarn", out var noWarnValue)) - noWarn = noWarnValue; - if (fileOptions.TryGetValue("build_metadata.additionalfiles.NoWarn", out noWarnValue)) - noWarn = noWarnValue; - - return new ProjectItem - { - AdditionalText = additionalText, - TargetPath = targetPath, - RelativePath = relativePath, - ManifestResourceName = manifestResourceName, - Kind = kind, - Inflator = (XamlInflator)xamlinflator, - EnableLineInfo = enableLineInfo, - EnableDiagnostics = enableDiagnostics, - NoWarn = noWarn, - TargetFramework = targetFramework, - Configuration = configuration!, - }; + var projectItem = new ProjectItem(tuple.additionalText, tuple.optionsProvider.GetOptions(tuple.additionalText)); + return projectItem.Kind == "None" ? null : projectItem; } - public static XamlProjectItemForIC? ComputeXamlProjectItemForIC((ProjectItem?, AssemblyCaches) itemAdnCaches, CancellationToken cancellationToken) + public static XamlProjectItemForIC? ComputeXamlProjectItemForIC((ProjectItem?, AssemblyCaches) itemAdnCaches, CancellationToken cancellationToken) { var (projectItem, assemblyCaches) = itemAdnCaches; var text = projectItem?.AdditionalText.GetText(cancellationToken); diff --git a/src/Controls/src/SourceGen/InitializeComponentCodeWriter.cs b/src/Controls/src/SourceGen/InitializeComponentCodeWriter.cs index ae3205cf2916..b015cd985be6 100644 --- a/src/Controls/src/SourceGen/InitializeComponentCodeWriter.cs +++ b/src/Controls/src/SourceGen/InitializeComponentCodeWriter.cs @@ -86,13 +86,7 @@ PrePost 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, - EnableLineInfo = xamlItem.ProjectItem.EnableLineInfo, - EnableDiagnostics = xamlItem.ProjectItem.EnableDiagnostics, - TargetFramework = xamlItem.ProjectItem.TargetFramework ?? "", - }; + var sgcontext = new SourceGenContext(codeWriter, compilation, sourceProductionContext, xmlnsCache, typeCache, rootType!, baseType, xamlItem.ProjectItem); using (newblock()) { Visit(root, sgcontext); @@ -124,8 +118,8 @@ static void Visit(RootNode rootnode, SourceGenContext visitorContext, bool useDe if (useDesignProperties) rootnode.Accept(new RemoveDuplicateDesignNodes(), null); rootnode.Accept(new SimplifyTypeExtensionVisitor(), null); - if (!string.IsNullOrEmpty(visitorContext.TargetFramework)) - rootnode.Accept(new SimplifyOnPlatformVisitor(visitorContext.TargetFramework), null); + if (!string.IsNullOrEmpty(visitorContext.ProjectItem.TargetFramework)) + rootnode.Accept(new SimplifyOnPlatformVisitor(visitorContext.ProjectItem.TargetFramework), null); rootnode.Accept(new CreateValuesVisitor(visitorContext), null); rootnode.Accept(new SetNamescopesAndRegisterNamesVisitor(visitorContext), null); //set namescopes for {x:Reference} and FindByName rootnode.Accept(new SetFieldsForXNamesVisitor(visitorContext), null); diff --git a/src/Controls/src/SourceGen/KnownMarkups.cs b/src/Controls/src/SourceGen/KnownMarkups.cs index c7caca80f966..d5c7f822cb89 100644 --- a/src/Controls/src/SourceGen/KnownMarkups.cs +++ b/src/Controls/src/SourceGen/KnownMarkups.cs @@ -299,7 +299,7 @@ static bool TryGetXDataType(IElementNode node, SourceGenContext context, out ITy return false; } - var location = LocationHelpers.LocationCreate(context.FilePath!, (IXmlLineInfo)node, "x:DataType"); + var location = LocationHelpers.LocationCreate(context.ProjectItem.RelativePath!, (IXmlLineInfo)node, "x:DataType"); if (xDataTypeIsInOuterScope) { @@ -502,7 +502,7 @@ internal static bool ProvideValueForStaticResourceExtension(IElementNode node, S if (keyNode is not ValueNode keyValueNode) { - context.ReportDiagnostic(Diagnostic.Create(Descriptors.XamlParserError, LocationHelpers.LocationCreate(context.FilePath!, (IXmlLineInfo)node, ""), "StaticResourceExtension: Key must be a string literal")); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.XamlParserError, LocationHelpers.LocationCreate(context.ProjectItem.RelativePath!, (IXmlLineInfo)node, ""), "StaticResourceExtension: Key must be a string literal")); returnType = context.Compilation.ObjectType; value = string.Empty; return false; diff --git a/src/Controls/src/SourceGen/KnownTypeConverters.cs b/src/Controls/src/SourceGen/KnownTypeConverters.cs index 502bed0dbf9e..27a56a650d8c 100644 --- a/src/Controls/src/SourceGen/KnownTypeConverters.cs +++ b/src/Controls/src/SourceGen/KnownTypeConverters.cs @@ -226,7 +226,7 @@ public static string ConvertRect(string value, BaseNode node, ITypeSymbol toType } } - context.ReportDiagnostic(Diagnostic.Create(Descriptors.RectConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.RectConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); return "default"; } @@ -259,7 +259,7 @@ public static string ConvertColor(string value, BaseNode node, ITypeSymbol toTyp } #pragma warning disable RS0030 // Do not use banned APIs - context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); #pragma warning restore RS0030 // Do not use banned APIs return "default"; } @@ -278,7 +278,7 @@ public static string ConvertPoint(string value, BaseNode node, ITypeSymbol toTyp } } - context.ReportDiagnostic(Diagnostic.Create(Descriptors.PointConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.PointConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); return "default"; } @@ -317,7 +317,7 @@ public static string ConvertThickness(string value, BaseNode node, ITypeSymbol t } } - context.ReportDiagnostic(Diagnostic.Create(Descriptors.ThicknessConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.ThicknessConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); return "default"; } @@ -352,7 +352,7 @@ public static string ConvertCornerRadius(string value, BaseNode node, ITypeSymbo } } - context.ReportDiagnostic(Diagnostic.Create(Descriptors.CornerRadiusConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.CornerRadiusConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); return "default"; } @@ -376,7 +376,7 @@ public static string ConvertEasing(string value, BaseNode node, ITypeSymbol toTy } } - context.ReportDiagnostic(Diagnostic.Create(Descriptors.EasingConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.EasingConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); return "default"; } @@ -396,7 +396,7 @@ public static string ConvertEnum(string value, BaseNode node, ITypeSymbol toType } #pragma warning disable RS0030 // Do not use banned APIs - context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value, value, toType?.ToDisplayString())); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value, value, toType?.ToDisplayString())); #pragma warning restore RS0030 // Do not use banned APIs return "default"; @@ -420,7 +420,7 @@ public static string ConvertFlexBasis(string value, BaseNode node, ITypeSymbol t return $"new global::Microsoft.Maui.Layouts.FlexBasis({FormatInvariant(flex)}, false)"; } - context.ReportDiagnostic(Diagnostic.Create(Descriptors.FlexBasisConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.FlexBasisConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); return "default"; } @@ -447,7 +447,7 @@ public static string ConvertFontSize(string value, BaseNode node, ITypeSymbol to } #pragma warning disable RS0030 // Do not use banned APIs - context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); #pragma warning restore RS0030 // Do not use banned APIs return "default"; } @@ -471,7 +471,7 @@ public static string ConvertFlowDirection(string value, BaseNode node, ITypeSymb return ConvertEnum(value, node, toType, context); } - context.ReportDiagnostic(Diagnostic.Create(Descriptors.FlowDirectionConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.FlowDirectionConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); return "default"; } @@ -504,7 +504,7 @@ public static string ConvertGridLength(string value, BaseNode node, ITypeSymbol } } - context.ReportDiagnostic(Diagnostic.Create(Descriptors.GridLengthConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.GridLengthConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); return "default"; } @@ -523,7 +523,7 @@ public static string ConvertColumnDefinitionCollection(string value, BaseNode no return $"new global::Microsoft.Maui.Controls.ColumnDefinitionCollection([{string.Join(", ", columnDefinitions)}])"; } - context.ReportDiagnostic(Diagnostic.Create(Descriptors.ColumnDefinitionCollectionConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.ColumnDefinitionCollectionConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); return "default"; } @@ -544,7 +544,7 @@ public static string ConvertRowDefinitionCollection(string value, BaseNode node, return $"new global::Microsoft.Maui.Controls.RowDefinitionCollection([{string.Join(", ", rowDefinitions)}])"; } - context.ReportDiagnostic(Diagnostic.Create(Descriptors.RowDefinitionCollectionConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.RowDefinitionCollectionConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); return "default"; } @@ -562,7 +562,7 @@ public static string ConvertImageSource(string value, BaseNode node, ITypeSymbol } #pragma warning disable RS0030 // Do not use banned APIs - context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); #pragma warning restore RS0030 // Do not use banned APIs return "default"; } @@ -578,7 +578,7 @@ public static string ConvertListString(string value, BaseNode node, ITypeSymbol } #pragma warning disable RS0030 // Do not use banned APIs - context.ReportDiagnostic(Diagnostic.Create(Descriptors.ListStringConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.ListStringConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); #pragma warning restore RS0030 // Do not use banned APIs return "default"; } @@ -614,7 +614,7 @@ internal static string ConvertPointCollection(string value, BaseNode node, IType else { #pragma warning disable RS0030 // Do not use banned APIs - context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); #pragma warning restore RS0030 // Do not use banned APIs return "default"; } @@ -623,7 +623,7 @@ internal static string ConvertPointCollection(string value, BaseNode node, IType if (hasX) { #pragma warning disable RS0030 // Do not use banned APIs - context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); #pragma warning restore RS0030 // Do not use banned APIs return "default"; } @@ -632,7 +632,7 @@ internal static string ConvertPointCollection(string value, BaseNode node, IType } #pragma warning disable RS0030 // Do not use banned APIs - context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); #pragma warning restore RS0030 // Do not use banned APIs return "default"; @@ -650,7 +650,7 @@ internal static string ConvertPathGeometry(string value, BaseNode node, ITypeSym } #pragma warning disable RS0030 // Do not use banned APIs - context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value, toType?.ToDisplayString())); #pragma warning restore RS0030 // Do not use banned APIs return "default"; } @@ -768,7 +768,7 @@ internal static string ConvertStrokeShape(string value, BaseNode node, ITypeSymb } } - context.ReportDiagnostic(Diagnostic.Create(Descriptors.StrokeShapeConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.StrokeShapeConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); return "default"; } @@ -783,7 +783,7 @@ internal static string ConvertLayoutOptions(string value, BaseNode node, ITypeSy var parts = value.Split('.'); if (parts.Length > 2 || (parts.Length == 2 && parts[0] != "LayoutOptions")) { - context.ReportDiagnostic(Diagnostic.Create(Descriptors.LayoutOptionsConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.LayoutOptionsConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); return "default"; } @@ -809,7 +809,7 @@ internal static string ConvertLayoutOptions(string value, BaseNode node, ITypeSy } } - context.ReportDiagnostic(Diagnostic.Create(Descriptors.LayoutOptionsConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value)); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.LayoutOptionsConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value)); return "default"; } @@ -827,7 +827,7 @@ internal static string ConvertConstraint(string value, BaseNode node, ITypeSymbo } #pragma warning disable RS0030 // Do not use banned APIs - context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.FilePath!, xmlLineInfo, value), value, toType.ToDisplayString())); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationCreate(context.ProjectItem.RelativePath!, xmlLineInfo, value), value, toType.ToDisplayString())); #pragma warning restore RS0030 // Do not use banned APIs return "default"; } @@ -898,10 +898,10 @@ static string GetResourcePath(string value, string rootTargetPath) context.Writer.WriteLine($"var {uriVar} = new global::System.Uri(\"{value};assembly={asm.Name}\", global::System.UriKind.RelativeOrAbsolute);"); - var rootTargetPath = context.FilePath!.Replace('\\', '/'); + var rootTargetPath = context.ProjectItem.RelativePath!.Replace('\\', '/'); if (asm.GetAttributes(xamlResIdAttr).FirstOrDefault(attr => (string)attr.ConstructorArguments[1].Value! == GetResourcePath(value, rootTargetPath)) is null) - context.ReportDiagnostic(Diagnostic.Create(Descriptors.XamlParserError, LocationCreate(context.FilePath!, (IXmlLineInfo)node, value), $"Resource {value} is not a valid resource path.")); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.XamlParserError, LocationCreate(context.ProjectItem.RelativePath!, (IXmlLineInfo)node, value), $"Resource {value} is not a valid resource path.")); //is there a type associated with the resource ? diff --git a/src/Controls/src/SourceGen/NodeSGExtensions.cs b/src/Controls/src/SourceGen/NodeSGExtensions.cs index 48db6027d581..73f456edd9d9 100644 --- a/src/Controls/src/SourceGen/NodeSGExtensions.cs +++ b/src/Controls/src/SourceGen/NodeSGExtensions.cs @@ -221,7 +221,7 @@ public static string ConvertTo(this ValueNode valueNode, ITypeSymbol toType, ITy if (!context.Compilation.HasImplicitConversion(returntype, toType)) //this could be left to the compiler to figure, but I've yet to find a way to test the compiler... //FIXME: better error message - context.ReportDiagnostic(Diagnostic.Create(Descriptors.MemberResolution, LocationCreate(context.FilePath!, (IXmlLineInfo)valueNode, valueString), $"Cannot convert {returntype} to {toType}")); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.MemberResolution, LocationCreate(context.ProjectItem.RelativePath!, (IXmlLineInfo)valueNode, valueString), $"Cannot convert {returntype} to {toType}")); return converterAndReturnType.Item1.Invoke(valueString, valueNode, toType, context, parentVar); } @@ -235,7 +235,7 @@ public static string ValueForLanguagePrimitive(string valueString, ITypeSymbol t { #pragma warning disable RS0030 // Do not use banned APIs void reportDiagnostic() - => context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationHelpers.LocationCreate(context.FilePath!, lineInfo, valueString), valueString, toType.ToDisplayString())); + => context.ReportDiagnostic(Diagnostic.Create(Descriptors.ConversionFailed, LocationHelpers.LocationCreate(context.ProjectItem.RelativePath!, lineInfo, valueString), valueString, toType.ToDisplayString())); #pragma warning restore RS0030 // Do not use banned APIs if (toType.NullableAnnotation == NullableAnnotation.Annotated @@ -529,14 +529,14 @@ public static bool TryProvideValue(this ElementNode node, SourceGenContext conte public static void RegisterSourceInfo(this INode node, SourceGenContext context, IndentedTextWriter writer, bool update = true) { - if (!context.EnableDiagnostics) + if (!context.ProjectItem.EnableDiagnostics) return; if (!context.Variables.TryGetValue(node, out var variable)) return; var assembly = context.Compilation.Assembly.Name; - var filePath = context.FilePath; + var filePath = context.ProjectItem.RelativePath; var lineInfo = node as IXmlLineInfo; if (!update) diff --git a/src/Controls/src/SourceGen/ProjectItem.cs b/src/Controls/src/SourceGen/ProjectItem.cs index dcfc011a10aa..7a935f87ec40 100644 --- a/src/Controls/src/SourceGen/ProjectItem.cs +++ b/src/Controls/src/SourceGen/ProjectItem.cs @@ -1,22 +1,70 @@ +using System; + using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.Maui.Controls.Xaml; namespace Microsoft.Maui.Controls.SourceGen; - -record ProjectItem +record ProjectItem(AdditionalText AdditionalText, AnalyzerConfigOptions Options) { - 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 string Configuration { get; internal set; } = "Debug"; - public bool EnableLineInfo { get; internal set; } = true; - public bool EnableDiagnostics { get; internal set; } = false; - public string NoWarn { get; internal set; } = ""; + public string Configuration + => Options.GetValueOrDefault("build_property.Configuration", "Debug"); + + public bool EnableLineInfo + { + get + { + if (Options.IsEnabled("build_metadata.additionalfiles.LineInfo")) + return true; + if (Options.IsDisabled("build_metadata.additionalfiles.LineInfo")) + return false; + return !Options.IsDisabled("build_property.MauiXamlLineInfo"); + } + } + + public bool EnableDiagnostics + { + get + { + if (Options.IsTrue("build_metadata.additionalfiles.EnableDiagnostics")) + return true; + if (Options.IsFalse("build_metadata.additionalfiles.EnableDiagnostics")) + return false; + return Options.IsTrue("build_property.EnableMauiXamlDiagnostics"); + } + } + + public string Kind + => Options.GetValueOrDefault("build_metadata.additionalfiles.GenKind", "None"); + + public XamlInflator Inflator + { + get + { + var xamlinflator = 0; + var parts = Options.GetValueOrDefault("build_metadata.additionalfiles.Inflator", "").Split(','); + for (int i = 0; i < parts.Length; i++) + { + var trimmed = parts[i].Trim(); + if (Enum.TryParse(trimmed, true, out var xinfl)) + xamlinflator |= (int)xinfl; + } + return (XamlInflator)xamlinflator; + } + } + + public string? ManifestResourceName + => Options.GetValueOrNull("build_metadata.additionalfiles.ManifestResourceName"); + + public string NoWarn + => Options.GetValueOrNull("build_metadata.additionalfiles.NoWarn") ?? Options.GetValueOrNull("build_property.MauiXamlNoWarn") ?? ""; + + public string? RelativePath + => Options.GetValueOrNull("build_metadata.additionalfiles.RelativePath"); + + public string? TargetFramework + => Options.GetValueOrNull("build_property.targetFramework"); + + public string? TargetPath + => Options.GetValueOrDefault("build_metadata.additionalfiles.TargetPath", AdditionalText.Path); } diff --git a/src/Controls/src/SourceGen/SourceGenContext.cs b/src/Controls/src/SourceGen/SourceGenContext.cs index f0756d532cc4..cbb0e3f0d752 100644 --- a/src/Controls/src/SourceGen/SourceGenContext.cs +++ b/src/Controls/src/SourceGen/SourceGenContext.cs @@ -9,7 +9,7 @@ namespace Microsoft.Maui.Controls.SourceGen; -class SourceGenContext(IndentedTextWriter writer, Compilation compilation, SourceProductionContext sourceProductionContext, AssemblyCaches assemblyCaches, IDictionary typeCache, ITypeSymbol rootType, ITypeSymbol? baseType) +class SourceGenContext(IndentedTextWriter writer, Compilation compilation, SourceProductionContext sourceProductionContext, AssemblyCaches assemblyCaches, IDictionary typeCache, ITypeSymbol rootType, ITypeSymbol? baseType, ProjectItem projectItem) { public SourceProductionContext SourceProductionContext => sourceProductionContext; public IndentedTextWriter Writer => writer; @@ -21,7 +21,6 @@ class SourceGenContext(IndentedTextWriter writer, Compilation compilation, Sourc public IDictionary Values { get; } = new Dictionary(); public IDictionary Variables { get; } = new Dictionary(); public void ReportDiagnostic(Diagnostic diagnostic) => sourceProductionContext.ReportDiagnostic(diagnostic); - public string? FilePath { get; set; } public IDictionary ServiceProviders { get; } = new Dictionary(); public IDictionary namesInScope)> Scopes = new Dictionary)>(); public SourceGenContext? ParentContext { get; set; } @@ -30,9 +29,7 @@ class SourceGenContext(IndentedTextWriter writer, Compilation compilation, Sourc public IDictionary> KeysInRD { get; } = new Dictionary>(); public IDictionary<(LocalVariable, IFieldSymbol?, IPropertySymbol?), LocalVariable> VariablesProperties { get; } = new Dictionary<(LocalVariable, IFieldSymbol?, IPropertySymbol?), LocalVariable>(); public IList LocalMethods { get; } = new List(); - public bool EnableLineInfo { get; set; } - public bool EnableDiagnostics { get; internal set; } - public string TargetFramework { get; internal set; } = ""; + public ProjectItem ProjectItem { get; } = projectItem; public void AddLocalMethod(string code) { diff --git a/src/Controls/src/SourceGen/Visitors/CreateValuesVisitor.cs b/src/Controls/src/SourceGen/Visitors/CreateValuesVisitor.cs index 8472cdad68c8..7da88b77d0cd 100644 --- a/src/Controls/src/SourceGen/Visitors/CreateValuesVisitor.cs +++ b/src/Controls/src/SourceGen/Visitors/CreateValuesVisitor.cs @@ -132,7 +132,7 @@ public void Visit(ElementNode node, INode parentNode) => c.MatchXArguments(node, Context, out parameters)); if (ctor is null) #pragma warning disable RS0030 // Do not use banned APIs - Context.ReportDiagnostic(Diagnostic.Create(Descriptors.MethodResolution, LocationCreate(Context.FilePath!, node, type.Name), type.ToDisplayString())); + Context.ReportDiagnostic(Diagnostic.Create(Descriptors.MethodResolution, LocationCreate(Context.ProjectItem.RelativePath!, node, type.Name), type.ToDisplayString())); #pragma warning restore RS0030 // Do not use banned APIs } //x:FactoryMethod @@ -145,7 +145,7 @@ public void Visit(ElementNode node, INode parentNode) m.IsStatic && m.MatchXArguments(node, Context, out parameters)); if (factoryMethod is null) - Context.ReportDiagnostic(Diagnostic.Create(Descriptors.MethodResolution, LocationCreate(Context.FilePath!, node, factoryMehodName!), factoryMehodName)); + Context.ReportDiagnostic(Diagnostic.Create(Descriptors.MethodResolution, LocationCreate(Context.ProjectItem.RelativePath!, node, factoryMehodName!), factoryMehodName)); } if (ctor is null && factoryMethod is null) @@ -206,7 +206,7 @@ public void Visit(ElementNode node, INode parentNode) propXmlName = new XmlName("", contentPropertyName); } else if (!node.Properties.TryGetValue(req.Name, out propNode, out propXmlName)) - Context.ReportDiagnostic(Diagnostic.Create(Descriptors.XamlParserError, LocationCreate(Context.FilePath!, node, req.Name), $"Required field '{req.Name}' not found in {type}")); + Context.ReportDiagnostic(Diagnostic.Create(Descriptors.XamlParserError, LocationCreate(Context.ProjectItem.RelativePath!, node, req.Name), $"Required field '{req.Name}' not found in {type}")); string propValue = "null"; var pType = req is IPropertySymbol prop ? prop.Type : ((IFieldSymbol)req).Type; diff --git a/src/Controls/src/SourceGen/Visitors/ExpandMarkupsVisitor.cs b/src/Controls/src/SourceGen/Visitors/ExpandMarkupsVisitor.cs index 7d42bbe249d3..706873686ae0 100644 --- a/src/Controls/src/SourceGen/Visitors/ExpandMarkupsVisitor.cs +++ b/src/Controls/src/SourceGen/Visitors/ExpandMarkupsVisitor.cs @@ -68,7 +68,7 @@ public void Visit(ListNode node, INode parentNode) if (expression[expression.Length - 1] != '}') { //FIXME fix location - var location = Context.FilePath is not null ? Location.Create(Context.FilePath, new TextSpan(), new LinePositionSpan()) : null; + var location = Context.ProjectItem.RelativePath is not null ? Location.Create(Context.ProjectItem.RelativePath, new TextSpan(), new LinePositionSpan()) : null; Context.ReportDiagnostic(Diagnostic.Create(Descriptors.ExpressionNotClosed, location)); return null; } @@ -76,7 +76,7 @@ public void Visit(ListNode node, INode parentNode) if (!MarkupExpressionParser.MatchMarkup(out var match, expression, out var len)) { //FIXME fix location - var location = Context.FilePath is not null ? Location.Create(Context.FilePath, new TextSpan(), new LinePositionSpan()) : null; + var location = Context.ProjectItem.RelativePath is not null ? Location.Create(Context.ProjectItem.RelativePath, new TextSpan(), new LinePositionSpan()) : null; Context.ReportDiagnostic(Diagnostic.Create(Descriptors.XamlParserError, location)); return null; } @@ -85,7 +85,7 @@ public void Visit(ListNode node, INode parentNode) if (expression.Length == 0) { //FIXME fix location - var location = Context.FilePath is not null ? Location.Create(Context.FilePath, new TextSpan(), new LinePositionSpan()) : null; + var location = Context.ProjectItem.RelativePath is not null ? Location.Create(Context.ProjectItem.RelativePath, new TextSpan(), new LinePositionSpan()) : null; Context.ReportDiagnostic(Diagnostic.Create(Descriptors.ExpressionNotClosed, location)); return null; } @@ -149,7 +149,7 @@ public INode Parse(string match, ref string remaining, IServiceProvider serviceP catch (XamlParseException xpe) { if (contextProvider != null) - contextProvider.Context.ReportDiagnostic(Diagnostic.Create(Descriptors.XamlParserError, LocationHelpers.LocationCreate(contextProvider.Context.FilePath!, xmlLineInfo!, match), xpe.Message)); + contextProvider.Context.ReportDiagnostic(Diagnostic.Create(Descriptors.XamlParserError, LocationHelpers.LocationCreate(contextProvider.Context.ProjectItem.RelativePath!, xmlLineInfo!, match), xpe.Message)); else throw; } diff --git a/src/Controls/src/SourceGen/Visitors/SetPropertiesVisitor.cs b/src/Controls/src/SourceGen/Visitors/SetPropertiesVisitor.cs index 6ed38275a3d8..29febdd32a82 100644 --- a/src/Controls/src/SourceGen/Visitors/SetPropertiesVisitor.cs +++ b/src/Controls/src/SourceGen/Visitors/SetPropertiesVisitor.cs @@ -106,12 +106,9 @@ public void Visit(ElementNode node, INode parentNode) Writer.WriteLine($"{variable.Name}.LoadTemplate = () =>"); using (PrePost.NewBlock(Writer, begin: "{", end: "};")) { - var templateContext = new SourceGenContext(Writer, context.Compilation, context.SourceProductionContext, context.XmlnsCache, context.TypeCache, context.RootType!, null) + var templateContext = new SourceGenContext(Writer, context.Compilation, context.SourceProductionContext, context.XmlnsCache, context.TypeCache, context.RootType!, null, context.ProjectItem) { - FilePath = context.FilePath, ParentContext = context, - EnableLineInfo = context.EnableLineInfo, - EnableDiagnostics = context.EnableDiagnostics, }; //inflate the template @@ -195,7 +192,7 @@ public void Visit(ElementNode node, INode parentNode) var propertyType = typeandconverter?.type ?? propertySymbol?.Type; if (propertyType == null) { - var location = LocationCreate(Context.FilePath!, (IXmlLineInfo)node, localName); + var location = LocationCreate(Context.ProjectItem.RelativePath!, (IXmlLineInfo)node, localName); //FIXME error should be "propertyType does not support Add()" Context.ReportDiagnostic(Diagnostic.Create(Descriptors.MemberResolution, location, localName)); return; @@ -224,7 +221,7 @@ public void Visit(ElementNode node, INode parentNode) else //report diagnostic: not a collection { - var location = LocationCreate(Context.FilePath!, (IXmlLineInfo)node, localName); + var location = LocationCreate(Context.ProjectItem.RelativePath!, (IXmlLineInfo)node, localName); //FIXME error should be "propertyType does not support Add()" Context.ReportDiagnostic(Diagnostic.Create(Descriptors.MemberResolution, location, localName)); } @@ -291,7 +288,7 @@ internal static void SetPropertyValue(IndentedTextWriter writer, LocalVariable p return; } - var location = LocationCreate(context.FilePath!, (IXmlLineInfo)valueNode, localName); + var location = LocationCreate(context.ProjectItem.RelativePath!, (IXmlLineInfo)valueNode, localName); context.ReportDiagnostic(Diagnostic.Create(Descriptors.MemberResolution, location, localName)); } @@ -339,7 +336,7 @@ static void ConnectEvent(IndentedTextWriter writer, LocalVariable parentVar, str }); if (handlerSymbol == null) { - var location = LocationCreate(context.FilePath!, (IXmlLineInfo)valueNode, handler); + var location = LocationCreate(context.ProjectItem.RelativePath!, (IXmlLineInfo)valueNode, handler); //FIXME better error message: "handler signature does not match event signature" context.ReportDiagnostic(Diagnostic.Create(Descriptors.MemberResolution, location, handler)); return; @@ -493,14 +490,14 @@ static void Set(IndentedTextWriter writer, LocalVariable parentVar, string local if (node is ValueNode valueNode) { - using (context.EnableLineInfo ? PrePost.NewLineInfo(writer, (IXmlLineInfo)node, context.FilePath) : PrePost.NoBlock()) + using (context.ProjectItem.EnableLineInfo ? PrePost.NewLineInfo(writer, (IXmlLineInfo)node, context.ProjectItem.RelativePath) : PrePost.NoBlock()) { var valueString = valueNode.ConvertTo(property, context, parentVar); writer.WriteLine($"{parentVar.Name}.{EscapeIdentifier(localName)} = {valueString};"); } } else if (node is ElementNode elementNode) - using (context.EnableLineInfo ? PrePost.NewLineInfo(writer, (IXmlLineInfo)node, context.FilePath) : PrePost.NoBlock()) + using (context.ProjectItem.EnableLineInfo ? PrePost.NewLineInfo(writer, (IXmlLineInfo)node, context.ProjectItem.RelativePath) : PrePost.NoBlock()) writer.WriteLine($"{parentVar.Name}.{EscapeIdentifier(localName)} = ({property.Type.ToFQDisplayString()}){(HasDoubleImplicitConversion(context.Variables[elementNode].Type, property.Type, context, out var conv) ? "(" + conv!.ReturnType.ToFQDisplayString() + ")" : string.Empty)}{context.Variables[elementNode].Name};"); } @@ -563,7 +560,7 @@ static bool CanAddToResourceDictionary(LocalVariable parentVar, ITypeSymbol coll { if (keyNode is not ValueNode vKeyNode || vKeyNode.Value is not string key) { - context.ReportDiagnostic(Diagnostic.Create(Descriptors.XamlParserError, LocationCreate(context.FilePath!, (IXmlLineInfo)keyNode, ""), "x:Key must be a string literal")); + context.ReportDiagnostic(Diagnostic.Create(Descriptors.XamlParserError, LocationCreate(context.ProjectItem.RelativePath!, (IXmlLineInfo)keyNode, ""), "x:Key must be a string literal")); //report diagnostic: x:Key must be a string literal return false; } @@ -573,7 +570,7 @@ static bool CanAddToResourceDictionary(LocalVariable parentVar, ITypeSymbol coll } if (keysInUse.Contains(key)) { - var location = LocationCreate(context.FilePath!, (IXmlLineInfo)keyNode, key); + var location = LocationCreate(context.ProjectItem.RelativePath!, (IXmlLineInfo)keyNode, key); context.ReportDiagnostic(Diagnostic.Create(Descriptors.DuplicateKeyInRD, location, key)); return false; } @@ -629,7 +626,7 @@ static void Add(IndentedTextWriter writer, LocalVariable parentVar, XmlName prop if (HasDoubleImplicitConversion(context.Variables[valueNode].Type, itemType, context, out var conv)) cast = "(" + conv!.ReturnType.ToFQDisplayString() + ")"; - using (context.EnableLineInfo ? PrePost.NewLineInfo(writer, (IXmlLineInfo)valueNode, context.FilePath) : PrePost.NoBlock()) + using (context.ProjectItem.EnableLineInfo ? PrePost.NewLineInfo(writer, (IXmlLineInfo)valueNode, context.ProjectItem.RelativePath) : PrePost.NoBlock()) writer.WriteLine($"{parentObj}.Add(({itemType.ToFQDisplayString()}){cast}{context.Variables[valueNode].Name});"); } diff --git a/src/Controls/tests/SourceGen.UnitTests/InitializeComponent/SimplifyOnPlatform.cs b/src/Controls/tests/SourceGen.UnitTests/InitializeComponent/SimplifyOnPlatform.cs index ae15c5941ab7..ae07ca147edd 100644 --- a/src/Controls/tests/SourceGen.UnitTests/InitializeComponent/SimplifyOnPlatform.cs +++ b/src/Controls/tests/SourceGen.UnitTests/InitializeComponent/SimplifyOnPlatform.cs @@ -68,6 +68,13 @@ private partial void InitializeComponent() var setter1 = new global::Microsoft.Maui.Controls.Setter(); global::Microsoft.Maui.VisualDiagnostics.RegisterSourceInfo(setter1!, new global::System.Uri(@"Test.xaml;assembly=SourceGeneratorDriver.Generated", global::System.UriKind.Relative), 9, 14); var xamlServiceProvider = new global::Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider(this); + var iProvideValueTarget = new global::Microsoft.Maui.Controls.Xaml.Internals.SimpleValueTargetProvider( + new object?[] {null}, + null, + null, + this); + xamlServiceProvider.Add(typeof(global::Microsoft.Maui.Controls.Xaml.IReferenceProvider), iProvideValueTarget); + xamlServiceProvider.Add(typeof(global::Microsoft.Maui.Controls.Xaml.IProvideValueTarget), iProvideValueTarget); var xmlNamespaceResolver = new global::Microsoft.Maui.Controls.Xaml.Internals.XmlNamespaceResolver(); xmlNamespaceResolver.Add("__f__", "http://schemas.microsoft.com/dotnet/2021/maui"); xmlNamespaceResolver.Add("__g__", "http://schemas.microsoft.com/dotnet/maui/global"); @@ -92,17 +99,17 @@ private partial void InitializeComponent() #endif #line 8 "Test.xaml" var xamlServiceProvider1 = new global::Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider(this); - var iProvideValueTarget = new global::Microsoft.Maui.Controls.Xaml.Internals.SimpleValueTargetProvider( - new object[] {setter, style1, __root}, + var iProvideValueTarget1 = new global::Microsoft.Maui.Controls.Xaml.Internals.SimpleValueTargetProvider( + new object?[] {setter, style1, __root}, typeof(global::Microsoft.Maui.Controls.Setter).GetProperty("Property"), #if !_MAUIXAML_SG_NAMESCOPE_DISABLE new [] { iNameScope1 }, #else null, #endif - false); - xamlServiceProvider1.Add(typeof(global::Microsoft.Maui.Controls.Xaml.IReferenceProvider), iProvideValueTarget); - xamlServiceProvider1.Add(typeof(global::Microsoft.Maui.Controls.Xaml.IProvideValueTarget), iProvideValueTarget); + this); + xamlServiceProvider1.Add(typeof(global::Microsoft.Maui.Controls.Xaml.IReferenceProvider), iProvideValueTarget1); + xamlServiceProvider1.Add(typeof(global::Microsoft.Maui.Controls.Xaml.IProvideValueTarget), iProvideValueTarget1); var xmlNamespaceResolver1 = new global::Microsoft.Maui.Controls.Xaml.Internals.XmlNamespaceResolver(); xmlNamespaceResolver1.Add("__f__", "http://schemas.microsoft.com/dotnet/2021/maui"); xmlNamespaceResolver1.Add("__g__", "http://schemas.microsoft.com/dotnet/maui/global"); @@ -122,17 +129,17 @@ private partial void InitializeComponent() #line default #line 9 "Test.xaml" var xamlServiceProvider2 = new global::Microsoft.Maui.Controls.Xaml.Internals.XamlServiceProvider(this); - var iProvideValueTarget1 = new global::Microsoft.Maui.Controls.Xaml.Internals.SimpleValueTargetProvider( - new object[] {setter1, style1, __root}, + var iProvideValueTarget2 = new global::Microsoft.Maui.Controls.Xaml.Internals.SimpleValueTargetProvider( + new object?[] {setter1, style1, __root}, typeof(global::Microsoft.Maui.Controls.Setter).GetProperty("Property"), #if !_MAUIXAML_SG_NAMESCOPE_DISABLE new [] { iNameScope2 }, #else null, #endif - false); - xamlServiceProvider2.Add(typeof(global::Microsoft.Maui.Controls.Xaml.IReferenceProvider), iProvideValueTarget1); - xamlServiceProvider2.Add(typeof(global::Microsoft.Maui.Controls.Xaml.IProvideValueTarget), iProvideValueTarget1); + this); + xamlServiceProvider2.Add(typeof(global::Microsoft.Maui.Controls.Xaml.IReferenceProvider), iProvideValueTarget2); + xamlServiceProvider2.Add(typeof(global::Microsoft.Maui.Controls.Xaml.IProvideValueTarget), iProvideValueTarget2); var xmlNamespaceResolver2 = new global::Microsoft.Maui.Controls.Xaml.Internals.XmlNamespaceResolver(); xmlNamespaceResolver2.Add("__f__", "http://schemas.microsoft.com/dotnet/2021/maui"); xmlNamespaceResolver2.Add("__g__", "http://schemas.microsoft.com/dotnet/maui/global"); diff --git a/src/Controls/tests/SourceGen.UnitTests/SourceGeneratorDriver.cs b/src/Controls/tests/SourceGen.UnitTests/SourceGeneratorDriver.cs index cabf7a696c9d..85259d23cb16 100644 --- a/src/Controls/tests/SourceGen.UnitTests/SourceGeneratorDriver.cs +++ b/src/Controls/tests/SourceGen.UnitTests/SourceGeneratorDriver.cs @@ -152,7 +152,7 @@ public override bool TryGetValue(string key, [NotNullWhen(true)] out string? val "build_metadata.additionalfiles.ManifestResourceName" => _additionalFile.ManifestResourceName, "build_metadata.additionalfiles.RelativePath" => _additionalFile.RelativePath, "build_metadata.additionalfiles.Inflator" => "SourceGen", - "build_property.targetframework" => _additionalFile.TargetFramework, + "build_property.targetFramework" => _additionalFile.TargetFramework, "build_property.EnableMauiXamlDiagnostics" => "true", "build_property.MauiXamlLineInfo" => "enable", "build_property.MauiXamlNoWarn" => _additionalFile.NoWarn, diff --git a/src/Controls/tests/Xaml.UnitTests/MockSourceGenerator.cs b/src/Controls/tests/Xaml.UnitTests/MockSourceGenerator.cs index 200f9bf2928c..217cea79a6ff 100644 --- a/src/Controls/tests/Xaml.UnitTests/MockSourceGenerator.cs +++ b/src/Controls/tests/Xaml.UnitTests/MockSourceGenerator.cs @@ -188,7 +188,7 @@ public override bool TryGetValue(string key, [NotNullWhen(true)] out string? val "build_metadata.additionalfiles.ManifestResourceName" => _additionalFile.ManifestResourceName, "build_metadata.additionalfiles.RelativePath" => _additionalFile.RelativePath, "build_metadata.additionalfiles.Inflator" => "SourceGen", - "build_property.targetframework" => _additionalFile.TargetFramework, + "build_property.targetFramework" => _additionalFile.TargetFramework, _ => null };