|
|
|
@ -304,7 +304,7 @@ namespace Avalonia.Build.Tasks |
|
|
|
|| "Internal".Equals(classModifierText, StringComparison.OrdinalIgnoreCase)) |
|
|
|
classModifierPublic = false; |
|
|
|
else |
|
|
|
throw new XamlParseException("Invalid value for x:ClassModifier. Expected value are: Public, NotPublic (internal).", precompileDirective); |
|
|
|
throw new XamlParseException("Invalid value for x:ClassModifier. Expected value are: Public, NotPublic (internal).", classModifierDirective); |
|
|
|
} |
|
|
|
|
|
|
|
var classDirective = initialRoot.Children.OfType<XamlAstXmlDirective>() |
|
|
|
@ -353,10 +353,16 @@ namespace Avalonia.Build.Tasks |
|
|
|
((List<XamlDocumentResource>)parsedXamlDocuments).Add(new XamlDocumentResource( |
|
|
|
parsed, res.Uri, res, classType, |
|
|
|
classModifierPublic.Value, |
|
|
|
populateBuilder, |
|
|
|
compiler.DefinePopulateMethod(populateBuilder, parsed, populateName, |
|
|
|
classTypeDefinition == null && classModifierPublic.Value), |
|
|
|
buildName == null ? null : compiler.DefineBuildMethod(builder, parsed, buildName, classModifierPublic.Value))); |
|
|
|
() => new XamlDocumentTypeBuilderProvider( |
|
|
|
populateBuilder, |
|
|
|
compiler.DefinePopulateMethod( |
|
|
|
populateBuilder, |
|
|
|
parsed, |
|
|
|
populateName, |
|
|
|
classTypeDefinition == null && classModifierPublic.Value), |
|
|
|
buildName == null ? |
|
|
|
null : |
|
|
|
compiler.DefineBuildMethod(builder, parsed, buildName, classModifierPublic.Value)))); |
|
|
|
} |
|
|
|
catch (Exception e) |
|
|
|
{ |
|
|
|
@ -387,10 +393,17 @@ namespace Avalonia.Build.Tasks |
|
|
|
|
|
|
|
foreach (var document in parsedXamlDocuments) |
|
|
|
{ |
|
|
|
var res = (IResource)document.FileSource!; |
|
|
|
|
|
|
|
if (document.Usage == XamlDocumentUsage.Merged && !document.IsPublic) |
|
|
|
{ |
|
|
|
res.Remove(); |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
var parsed = document.XamlDocument; |
|
|
|
var res = (IResource)document.FileSource; |
|
|
|
var classType = document.ClassType; |
|
|
|
var populateBuilder = document.TypeBuilder; |
|
|
|
var populateBuilder = document.TypeBuilderProvider.TypeBuilder; |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
@ -399,8 +412,8 @@ namespace Avalonia.Build.Tasks |
|
|
|
|
|
|
|
compiler.Compile(parsed, |
|
|
|
contextClass, |
|
|
|
document.PopulateMethod, |
|
|
|
document.BuildMethod, |
|
|
|
document.TypeBuilderProvider.PopulateMethod, |
|
|
|
document.TypeBuilderProvider.BuildMethod, |
|
|
|
builder.DefineSubType(compilerConfig.WellKnownTypes.Object, "NamespaceInfo:" + res.Name, true), |
|
|
|
(closureName, closureBaseType) => |
|
|
|
populateBuilder.DefineSubType(closureBaseType, closureName, false), |
|
|
|
@ -412,7 +425,7 @@ namespace Avalonia.Build.Tasks |
|
|
|
if (classTypeDefinition != null) |
|
|
|
{ |
|
|
|
var compiledPopulateMethod = typeSystem.GetTypeReference(populateBuilder).Resolve() |
|
|
|
.Methods.First(m => m.Name == document.PopulateMethod.Name); |
|
|
|
.Methods.First(m => m.Name == document.TypeBuilderProvider.PopulateMethod.Name); |
|
|
|
|
|
|
|
var designLoaderFieldType = typeSystem |
|
|
|
.GetType("System.Action`1") |
|
|
|
@ -536,12 +549,12 @@ namespace Avalonia.Build.Tasks |
|
|
|
} |
|
|
|
|
|
|
|
if (document.IsPublic |
|
|
|
&& (document.BuildMethod != null || classTypeDefinition != null)) |
|
|
|
&& (document.TypeBuilderProvider.BuildMethod != null || classTypeDefinition != null)) |
|
|
|
{ |
|
|
|
var compiledBuildMethod = document.BuildMethod == null ? |
|
|
|
var compiledBuildMethod = document.TypeBuilderProvider.BuildMethod is not { } buildMethod ? |
|
|
|
null : |
|
|
|
typeSystem.GetTypeReference(builder).Resolve() |
|
|
|
.Methods.First(m => m.Name == document.BuildMethod?.Name); |
|
|
|
.Methods.First(m => m.Name == buildMethod.Name); |
|
|
|
var parameterlessConstructor = compiledBuildMethod != null ? |
|
|
|
null : |
|
|
|
classTypeDefinition.GetConstructors().FirstOrDefault(c => |
|
|
|
|