From b3e3db9662085b5827e7e3f24b4786155ff5e286 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Mon, 5 Apr 2021 11:59:41 -0700 Subject: [PATCH] Annotate APIs in System.Private.Xml (#49682) Mostly adds RequiresUnreferencedCode, and propagates the results outward. Co-authored-by: Jose Perez Rodriguez --- .../src/ILLink/ILLink.Suppressions.xml | 72 +++++ .../src/ILLink/ILLink.Suppressions.xml | 317 --------------------- .../src/System/Xml/Schema/XmlSchema.cs | 11 + .../src/System/Xml/Serialization/CodeGenerator.cs | 5 + .../src/System/Xml/Serialization/Compilation.cs | 11 +- .../src/System/Xml/Serialization/Compiler.cs | 2 + .../src/System/Xml/Serialization/ImportContext.cs | 3 + .../src/System/Xml/Serialization/Mappings.cs | 2 + .../src/System/Xml/Serialization/Models.cs | 34 ++- .../Xml/Serialization/PrimitiveXmlSerializers.cs | 3 + .../ReflectionXmlSerializationReader.cs | 117 ++++++-- .../ReflectionXmlSerializationWriter.cs | 34 ++- .../src/System/Xml/Serialization/SchemaImporter.cs | 7 + .../Xml/Serialization/SoapReflectionImporter.cs | 32 ++- .../src/System/Xml/Serialization/SourceInfo.cs | 12 +- .../src/System/Xml/Serialization/TypeExtensions.cs | 6 +- .../src/System/Xml/Serialization/Types.cs | 66 ++++- .../src/System/Xml/Serialization/XmlAttributes.cs | 19 +- .../Xml/Serialization/XmlReflectionImporter.cs | 40 ++- .../System/Xml/Serialization/XmlSchemaImporter.cs | 50 ++++ .../src/System/Xml/Serialization/XmlSchemas.cs | 7 + .../Serialization/XmlSerializationGeneratedCode.cs | 4 + .../Xml/Serialization/XmlSerializationILGen.cs | 16 ++ .../Xml/Serialization/XmlSerializationReader.cs | 13 + .../Serialization/XmlSerializationReaderILGen.cs | 49 +++- .../Xml/Serialization/XmlSerializationWriter.cs | 52 +++- .../Serialization/XmlSerializationWriterILGen.cs | 53 +++- .../src/System/Xml/Serialization/XmlSerializer.cs | 38 +++ .../Xml/Serialization/XmlSerializerFactory.cs | 9 + .../System.Private.Xml.TrimmingTests.proj | 1 + .../tests/TrimmingTests/XmlSchema.Write.cs | 62 ++++ .../ref/System.Xml.ReaderWriter.cs | 6 + .../ref/System.Xml.XmlSerializer.cs | 81 ++++++ 33 files changed, 827 insertions(+), 407 deletions(-) delete mode 100644 src/libraries/System.Private.Xml/src/ILLink/ILLink.Suppressions.xml create mode 100644 src/libraries/System.Private.Xml/tests/TrimmingTests/XmlSchema.Write.cs diff --git a/src/libraries/System.Data.Common/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.Data.Common/src/ILLink/ILLink.Suppressions.xml index aae5e3c..a0aae13 100644 --- a/src/libraries/System.Data.Common/src/ILLink/ILLink.Suppressions.xml +++ b/src/libraries/System.Data.Common/src/ILLink/ILLink.Suppressions.xml @@ -247,5 +247,77 @@ member M:System.Data.XMLSchema.GetConverter(System.Type) + + ILLink + IL2026 + member + M:System.Data.Common.ObjectStorage.ConvertObjectToXml(System.Object) + + + ILLink + IL2026 + member + M:System.Data.Common.ObjectStorage.ConvertObjectToXml(System.Object,System.Xml.XmlWriter,System.Xml.Serialization.XmlRootAttribute) + + + ILLink + IL2026 + member + M:System.Data.Common.ObjectStorage.ConvertObjectToXml(System.Object,System.Xml.XmlReader,System.Xml.Serialization.XmlRootAttribute) + + + ILLink + IL2026 + member + M:System.Data.Common.ObjectStorage.ConvertXmlToObject(System.Xml.XmlReader,System.Xml.Serialization.XmlRootAttribute) + + + ILLink + IL2026 + member + M:System.Data.Common.SqlUdtStorage.ConvertObjectToXml(System.Object) + + + ILLink + IL2026 + member + M:System.Data.Common.ObjectStorage.ConvertXmlToObject(System.Object) + + + ILLink + IL2026 + member + M:System.Data.Common.ObjectStorage.ConvertXmlToObject(System.String) + + + ILLink + IL2026 + member + M:System.Data.Common.SqlUdtStorage.ConvertObjectToXml(System.Object,System.Xml.XmlWriter,System.Xml.Serialization.XmlRootAttribute) + + + ILLink + IL2026 + member + M:System.Data.Common.SqlUdtStorage.ConvertXmlToObject(System.String) + + + ILLink + IL2026 + member + M:System.Data.Common.SqlUdtStorage.ConvertXmlToObject(System.Xml.XmlReader,System.Xml.Serialization.XmlRootAttribute) + + + ILLink + IL2026 + member + M:System.Data.Common.ObjectStorage.GetXmlSerializer(System.Type) + + + ILLink + IL2026 + member + M:System.Data.Common.ObjectStorage.GetXmlSerializer(System.Type,System.Xml.Serialization.XmlRootAttribute) + diff --git a/src/libraries/System.Private.Xml/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.Private.Xml/src/ILLink/ILLink.Suppressions.xml deleted file mode 100644 index 40dbf4a..0000000 --- a/src/libraries/System.Private.Xml/src/ILLink/ILLink.Suppressions.xml +++ /dev/null @@ -1,317 +0,0 @@ - - - - - ILLink - IL2026 - member - M:System.Xml.Serialization.ReflectionAwareILGen.ILGenForCreateInstance(System.Xml.Serialization.CodeGenerator,System.Type,System.Type,System.Boolean) - - - ILLink - IL2026 - member - M:System.Xml.Serialization.TempAssembly.GetTypeFromAssembly(System.Reflection.Assembly,System.String) - - - ILLink - IL2026 - member - M:System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly(System.Type,System.String,System.Xml.Serialization.XmlSerializerImplementation@) - - - ILLink - IL2026 - member - M:System.Xml.Serialization.XmlAttributes.get_IgnoreAttribute - - - ILLink - IL2057 - member - M:System.Xml.Serialization.XmlSerializationWriterCodeGen.WriteCheckDefault(System.Xml.Serialization.TypeMapping,System.String,System.Object,System.Boolean) - - - ILLink - IL2060 - member - M:System.Xml.Serialization.ReflectionXmlSerializationReader.GetSetMemberValueDelegate(System.Object,System.String) - - - ILLink - IL2067 - member - M:System.Xml.Serialization.ReflectionXmlSerializationReader.ReflectionCreateObject(System.Type) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.Compiler.AddImport(System.Type,System.Collections.Hashtable) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.ReflectionAwareCodeGen.WriteMappingInfo(System.Xml.Serialization.TypeMapping,System.String,System.Type) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.ReflectionAwareCodeGen.WriteMemberInfo(System.Type,System.String,System.String,System.String) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.ReflectionAwareILGen.ILGenForCreateInstance(System.Xml.Serialization.CodeGenerator,System.Type,System.Boolean,System.Boolean) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.ReflectionAwareILGen.ILGenForCreateInstance(System.Xml.Serialization.CodeGenerator,System.Type,System.Type,System.Boolean) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.ReflectionXmlSerializationHelper.GetMember(System.Type,System.String) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.ReflectionXmlSerializationReader.AddObjectsIntoTargetCollection(System.Object,System.Collections.Generic.List{System.Object},System.Type) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.ReflectionXmlSerializationReader.GetDefaultConstructor(System.Type) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.SourceInfo.ConvertNullableValue(System.Type,System.Type) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.TempAssembly.GetMethodFromType(System.Type,System.String) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.TypeExtensions.TryConvertTo(System.Type,System.Object,System.Object@) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.TypeScope.GetConstructorFlags(System.Type,System.Exception@) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.TypeScope.GetDefaultIndexer(System.Type,System.String) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.TypeScope.GetEnumeratorElementType(System.Type,System.Xml.Serialization.TypeFlags@) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.TypeScope.ShouldBeReplaced(System.Reflection.MemberInfo,System.Type,System.Reflection.MemberInfo@) - - - ILLink - IL2070 - member - M:System.Xml.Serialization.XmlReflectionImporter.GetMethodFromSchemaProvider(System.Xml.Serialization.XmlSchemaProviderAttribute,System.Type) - - - ILLink - IL2072 - member - M:System.Xml.Serialization.ReflectionXmlSerializationReader.WriteNullableMethod(System.Xml.Serialization.NullableMapping,System.Boolean,System.String) - - - ILLink - IL2072 - member - M:System.Xml.Serialization.TempAssembly.get_Contract - - - ILLink - IL2072 - member - M:System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly(System.Type,System.String,System.Xml.Serialization.XmlSerializerImplementation@) - - - ILLink - IL2072 - member - M:System.Xml.Serialization.XmlSerializationILGen.GenerateTypedSerializer(System.String,System.String,System.Xml.Serialization.XmlMapping,System.Xml.Serialization.CodeIdentifiers,System.String,System.String,System.String) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.CodeGenerator.GetPropertyMethodFromBaseType(System.Reflection.PropertyInfo,System.Boolean) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.EnumModel.get_Constants - - - ILLink - IL2075 - member - M:System.Xml.Serialization.FieldModel.#ctor(System.Reflection.MemberInfo,System.Type,System.Xml.Serialization.TypeDesc) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.ReflectionAwareILGen.ILGenForCreateInstance(System.Xml.Serialization.CodeGenerator,System.Type,System.Type,System.Boolean) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.ReflectionAwareILGen.WriteLocalDecl(System.String,System.Xml.Serialization.SourceInfo) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.ReflectionXmlSerializationHelper.GetMember(System.Type,System.String) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.ReflectionXmlSerializationReader.WriteLiteralStructMethod(System.Xml.Serialization.StructMapping,System.Boolean,System.Boolean,System.String) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.ReflectionXmlSerializationWriter.WriteStructMethod(System.Xml.Serialization.StructMapping,System.String,System.String,System.Object,System.Boolean,System.Boolean) - - - ILLink - IL2075 - member - T:System.Xml.Serialization.ReflectionXmlSerializationReader - - - ILLink - IL2075 - member - M:System.Xml.Serialization.SourceInfo.InternalLoad(System.Type,System.Boolean) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.StructModel.GetMemberInfos - - - ILLink - IL2075 - member - M:System.Xml.Serialization.TypeScope.GetEnumeratorElementType(System.Type,System.Xml.Serialization.TypeFlags@) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.XmlReflectionImporter.GetChoiceIdentifierType(System.Xml.Serialization.XmlChoiceIdentifierAttribute,System.Xml.Serialization.StructModel,System.Boolean,System.String) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.XmlSerializationILGen.GenerateBaseSerializer(System.String,System.String,System.String,System.Xml.Serialization.CodeIdentifiers) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.XmlSerializationILGen.GenerateGetSerializer(System.Collections.Generic.Dictionary{System.String,System.String},System.Xml.Serialization.XmlMapping[],System.Reflection.Emit.TypeBuilder) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.XmlSerializationILGen.GenerateSerializerContract(System.String,System.Xml.Serialization.XmlMapping[],System.Type[],System.String,System.String[],System.String,System.String[],System.Collections.Generic.Dictionary{System.String,System.String}) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.XmlSerializationILGen.GenerateTypedSerializer(System.String,System.String,System.Xml.Serialization.XmlMapping,System.Xml.Serialization.CodeIdentifiers,System.String,System.String,System.String) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.XmlSerializationILGen.GenerateTypedSerializers(System.Collections.Generic.Dictionary{System.String,System.String},System.Reflection.Emit.TypeBuilder) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.XmlSerializationReaderILGen.WriteAttributes(System.Xml.Serialization.XmlSerializationReaderILGen.Member[],System.Xml.Serialization.XmlSerializationReaderILGen.Member,System.String,System.Reflection.Emit.LocalBuilder) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.XmlSerializationReaderILGen.WriteSourceEnd(System.String,System.Type,System.Type) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.XmlSerializationWriterILGen.WriteArrayItems(System.Xml.Serialization.ElementAccessor[],System.Xml.Serialization.TextAccessor,System.Xml.Serialization.ChoiceIdentifierAccessor,System.Xml.Serialization.TypeDesc,System.String,System.String) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.XmlSerializationWriterILGen.WriteCheckDefault(System.Xml.Serialization.SourceInfo,System.Object,System.Boolean) - - - ILLink - IL2075 - member - M:System.Xml.Serialization.XmlSerializationWriterILGen.WriteElement(System.Xml.Serialization.SourceInfo,System.Xml.Serialization.ElementAccessor,System.String,System.Boolean) - - - ILLink - IL2077 - member - M:System.Xml.Serialization.SerializableMapping.RetrieveSerializableSchema - - - ILLink - IL2080 - member - M:System.Xml.Serialization.XmlSerializationWriterILGen.WriteText(System.Xml.Serialization.SourceInfo,System.Xml.Serialization.TextAccessor) - - - diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchema.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchema.cs index 309fb8f..68e372c 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchema.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchema.cs @@ -10,6 +10,7 @@ namespace System.Xml.Schema using System.Threading; using System.Diagnostics; using System.Collections.Generic; + using System.Diagnostics.CodeAnalysis; [XmlRoot("schema", Namespace = XmlSchema.Namespace)] public class XmlSchema : XmlSchemaObject @@ -88,11 +89,13 @@ namespace System.Xml.Schema return parser.XmlSchema; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public void Write(Stream stream) { Write(stream, null); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public void Write(Stream stream, XmlNamespaceManager? namespaceManager) { XmlTextWriter xmlWriter = new XmlTextWriter(stream, null); @@ -100,11 +103,13 @@ namespace System.Xml.Schema Write(xmlWriter, namespaceManager); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public void Write(TextWriter writer) { Write(writer, null); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public void Write(TextWriter writer, XmlNamespaceManager? namespaceManager) { XmlTextWriter xmlWriter = new XmlTextWriter(writer); @@ -112,11 +117,17 @@ namespace System.Xml.Schema Write(xmlWriter, namespaceManager); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public void Write(XmlWriter writer) { Write(writer, null); } + [DynamicDependency(TrimmerConstants.PublicMembers, typeof(XmlSchema))] + // This method may be safe given the above Dynamic Dependency but it is not yet fully understood if just preserving + // all of XmlSchema public members is enough in order to be safe in all cases, so we have opted to keep the RequiresUnreferencedCode + // attribute for now. This can be removed in the future if it is determined that the above is enough for all scenarios to be trim-safe. + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public void Write(XmlWriter writer, XmlNamespaceManager? namespaceManager) { XmlSerializer serializer = new XmlSerializer(typeof(XmlSchema)); diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs index 3ae4442..c5be96f 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs @@ -475,6 +475,7 @@ namespace System.Xml.Serialization return objType.IsValueType && !objType.IsPrimitive; } + [RequiresUnreferencedCode("calls LoadMember")] internal Type LoadMember(object obj, MemberInfo memberInfo) { if (GetVariableType(obj).IsValueType) @@ -484,6 +485,7 @@ namespace System.Xml.Serialization return LoadMember(memberInfo); } + [RequiresUnreferencedCode("GetProperty on PropertyInfo type's base type")] private static MethodInfo? GetPropertyMethodFromBaseType(PropertyInfo propertyInfo, bool isGetter) { // we only invoke this when the propertyInfo does not have a GET or SET method on it @@ -522,6 +524,7 @@ namespace System.Xml.Serialization return result; } + [RequiresUnreferencedCode("calls GetPropertyMethodFromBaseType")] internal Type LoadMember(MemberInfo memberInfo) { Type? memberType = null; @@ -560,6 +563,7 @@ namespace System.Xml.Serialization return memberType; } + [RequiresUnreferencedCode("calls GetPropertyMethodFromBaseType")] internal Type LoadMemberAddress(MemberInfo memberInfo) { Type? memberType = null; @@ -602,6 +606,7 @@ namespace System.Xml.Serialization return memberType; } + [RequiresUnreferencedCode("calls GetPropertyMethodFromBaseType")] internal void StoreMember(MemberInfo memberInfo) { if (memberInfo is FieldInfo) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compilation.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compilation.cs index 1428e96..a3b6334 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compilation.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compilation.cs @@ -44,6 +44,7 @@ namespace System.Xml.Serialization _contract = contract; } + [RequiresUnreferencedCode("calls GenerateRefEmitAssembly")] internal TempAssembly(XmlMapping[] xmlMappings, Type?[] types, string? defaultNamespace, string? location) { bool containsSoapMapping = false; @@ -101,6 +102,7 @@ namespace System.Xml.Serialization internal XmlSerializerImplementation Contract { + [RequiresUnreferencedCode("calls GetTypeFromAssembly")] get { if (_contract == null) @@ -137,6 +139,7 @@ namespace System.Xml.Serialization /// // SxS: This method does not take any resource name and does not expose any resources to the caller. // It's OK to suppress the SxS warning. + [RequiresUnreferencedCode("calls LoadFile")] internal static Assembly? LoadGeneratedAssembly(Type type, string? defaultNamespace, out XmlSerializerImplementation? contract) { Assembly? serializer = null; @@ -276,6 +279,7 @@ namespace System.Xml.Serialization return sb.ToString(); } + [RequiresUnreferencedCode("calls GenerateBegin")] internal static bool GenerateSerializerToStream(XmlMapping[] xmlMappings, Type?[] types, string? defaultNamespace, Assembly? assembly, Hashtable assemblies, Stream stream) { var compiler = new Compiler(); @@ -420,6 +424,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls GenerateElement")] internal static Assembly GenerateRefEmitAssembly(XmlMapping[] xmlMappings, Type?[]? types, string? defaultNamespace) { var scopeTable = new Dictionary(); @@ -497,7 +502,8 @@ namespace System.Xml.Serialization return writerType.Assembly; } - private static MethodInfo GetMethodFromType(Type type, string methodName) + private static MethodInfo GetMethodFromType( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type type, string methodName) { MethodInfo? method = type.GetMethod(methodName); if (method != null) @@ -508,6 +514,7 @@ namespace System.Xml.Serialization throw missingMethod; } + [RequiresUnreferencedCode("calls GetType")] internal static Type GetTypeFromAssembly(Assembly assembly, string typeName) { typeName = GeneratedAssemblyNamespace + "." + typeName; @@ -557,6 +564,7 @@ namespace System.Xml.Serialization return encodingStyle; } + [RequiresUnreferencedCode("calls Contract")] internal object? InvokeReader(XmlMapping mapping, XmlReader xmlReader, XmlDeserializationEvents events, string? encodingStyle) { XmlSerializationReader? reader = null; @@ -591,6 +599,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls Contract")] internal void InvokeWriter(XmlMapping mapping, XmlWriter xmlWriter, object? o, XmlSerializerNamespaces? namespaces, string? encodingStyle, string? id) { XmlSerializationWriter? writer = null; diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compiler.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compiler.cs index d2a7104..20522dc 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compiler.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compiler.cs @@ -7,6 +7,7 @@ using System.IO; using System.Diagnostics; using System.Globalization; using System.Runtime.CompilerServices; +using System.Diagnostics.CodeAnalysis; namespace System.Xml.Serialization { @@ -16,6 +17,7 @@ namespace System.Xml.Serialization // SxS: This method does not take any resource name and does not expose any resources to the caller. // It's OK to suppress the SxS warning. + [RequiresUnreferencedCode("Reflects against input Type DeclaringType")] internal void AddImport(Type? type, Hashtable types) { if (type == null) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ImportContext.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ImportContext.cs index 4b746fc..61acd28 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ImportContext.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ImportContext.cs @@ -11,6 +11,7 @@ namespace System.Xml.Serialization using System.Collections; using System.Collections.Specialized; using System.Reflection; + using System.Diagnostics.CodeAnalysis; public class ImportContext { @@ -214,6 +215,7 @@ namespace System.Xml.Serialization return (int)tmp; } + [RequiresUnreferencedCode("creates SchemaGraph")] internal void GenerateSchemaGraph(XmlSchemas schemas) { SchemaGraph graph = new SchemaGraph(Graph, schemas); @@ -259,6 +261,7 @@ namespace System.Xml.Serialization private readonly Hashtable _scope; private readonly int _items; + [RequiresUnreferencedCode("Calls Compile")] internal SchemaGraph(Hashtable scope, XmlSchemas schemas) { _scope = scope; diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Mappings.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Mappings.cs index 3101817..b6c770d 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Mappings.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Mappings.cs @@ -1057,6 +1057,7 @@ namespace System.Xml.Serialization internal sealed class SerializableMapping : SpecialMapping { private XmlSchema? _schema; + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] private Type? _type; private bool _needSchema = true; @@ -1172,6 +1173,7 @@ namespace System.Xml.Serialization set { _next = value; } } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] internal Type? Type { get { return _type; } diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Models.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Models.cs index 4afb75e..f81cf45 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Models.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Models.cs @@ -8,6 +8,7 @@ namespace System.Xml.Serialization using System.Collections; using System.Diagnostics; using System.Collections.Generic; + using System.Diagnostics.CodeAnalysis; // These classes define the abstract serialization model, e.g. the rules for WHAT is serialized. // The answer of HOW the values are serialized is answered by a particular reflection importer @@ -30,11 +31,13 @@ namespace System.Xml.Serialization get { return _typeScope; } } + [RequiresUnreferencedCode("calls GetTypeModel")] internal TypeModel GetTypeModel(Type type) { return GetTypeModel(type, true); } + [RequiresUnreferencedCode("calls GetTypeDesc")] internal TypeModel GetTypeModel(Type type, bool directReference) { TypeModel? model; @@ -70,6 +73,7 @@ namespace System.Xml.Serialization return model; } + [RequiresUnreferencedCode("calls GetArrayTypeDesc")] internal ArrayModel GetArrayModel(Type type) { TypeModel? model; @@ -90,16 +94,21 @@ namespace System.Xml.Serialization internal abstract class TypeModel { private readonly TypeDesc _typeDesc; + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] private readonly Type _type; private readonly ModelScope _scope; - protected TypeModel(Type type, TypeDesc typeDesc, ModelScope scope) + protected TypeModel( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, + TypeDesc typeDesc, + ModelScope scope) { _scope = scope; _type = type; _typeDesc = typeDesc; } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] internal Type Type { get { return _type; } @@ -118,27 +127,34 @@ namespace System.Xml.Serialization internal sealed class ArrayModel : TypeModel { - internal ArrayModel(Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { } + internal ArrayModel( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { } internal TypeModel Element { + [RequiresUnreferencedCode("Calls GetTypeModel")] get { return ModelScope.GetTypeModel(TypeScope.GetArrayElementType(Type, null)!); } } } internal sealed class PrimitiveModel : TypeModel { - internal PrimitiveModel(Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { } + internal PrimitiveModel( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { } } internal sealed class SpecialModel : TypeModel { - internal SpecialModel(Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { } + internal SpecialModel( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, + TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { } } internal sealed class StructModel : TypeModel { - internal StructModel(Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { } + internal StructModel( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, + TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { } internal MemberInfo[] GetMemberInfos() { @@ -168,6 +184,7 @@ namespace System.Xml.Serialization return fieldsAndProps; } + [RequiresUnreferencedCode("calls GetFieldModel")] internal FieldModel? GetFieldModel(MemberInfo memberInfo) { FieldModel? model = null; @@ -199,6 +216,7 @@ namespace System.Xml.Serialization CheckSupportedMember(typeDesc.ArrayElementTypeDesc, member, type); } + [RequiresUnreferencedCode("calls GetTypeDesc")] private FieldModel? GetFieldModel(FieldInfo fieldInfo) { if (fieldInfo.IsStatic) return null; @@ -212,6 +230,7 @@ namespace System.Xml.Serialization return new FieldModel(fieldInfo, fieldInfo.FieldType, typeDesc); } + [RequiresUnreferencedCode("calls GetTypeDesc")] private FieldModel? GetPropertyModel(PropertyInfo propertyInfo) { if (propertyInfo.DeclaringType != Type) return null; @@ -274,6 +293,7 @@ namespace System.Xml.Serialization _readOnly = readOnly; } + [RequiresUnreferencedCode("Calls GetField on MemberInfo type")] internal FieldModel(MemberInfo memberInfo, Type fieldType, TypeDesc fieldTypeDesc) { _name = memberInfo.Name; @@ -400,7 +420,9 @@ namespace System.Xml.Serialization { private ConstantModel[]? _constants; - internal EnumModel(Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { } + internal EnumModel( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] + Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { } internal ConstantModel[] Constants { diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/PrimitiveXmlSerializers.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/PrimitiveXmlSerializers.cs index 018317a..e06311d 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/PrimitiveXmlSerializers.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/PrimitiveXmlSerializers.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Diagnostics.CodeAnalysis; namespace System.Xml.Serialization { @@ -224,6 +225,7 @@ namespace System.Xml.Serialization WriteNullableQualifiedNameLiteral(@"QName", @"", ((global::System.Xml.XmlQualifiedName)o)); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected override void InitCallbacks() { } @@ -708,6 +710,7 @@ namespace System.Xml.Serialization return (object?)o; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected override void InitCallbacks() { } diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationReader.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationReader.cs index a1afa18..ab2daee 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationReader.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationReader.cs @@ -8,26 +8,37 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq.Expressions; using System.Reflection; +using System.Runtime.CompilerServices; using System.Xml.Extensions; using System.Xml.Schema; +// UnconditionalSuppressMessage that specify a Target need to be at the assembly or module level for now. Also, +// they won't consider Target unless you also specify Scope to be either "member" or "type" +[assembly: UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:MakeGenericMethod", + Target = "M:System.Xml.Serialization.ReflectionXmlSerializationReader.#cctor", + Justification = "The reason why this warns is because the two static properties call GetTypeDesc() which internally will call " + + "ImportTypeDesc() when the passed in type is not considered a primitive type. That said, for both properties here we are passing in string " + + "and XmlQualifiedName which are considered primitive, so they are trim safe.", + Scope = "member")] + namespace System.Xml.Serialization { internal delegate void UnknownNodeAction(object? o); internal sealed class ReflectionXmlSerializationReader : XmlSerializationReader { - private static TypeDesc StringTypeDesc { get; set; } = (new TypeScope()).GetTypeDesc(typeof(string)); - private static TypeDesc QnameTypeDesc { get; set; } = (new TypeScope()).GetTypeDesc(typeof(XmlQualifiedName)); - private readonly XmlMapping _mapping; + internal static TypeDesc StringTypeDesc { get; set; } = (new TypeScope()).GetTypeDesc(typeof(string)); + internal static TypeDesc QnameTypeDesc { get; set; } = (new TypeScope()).GetTypeDesc(typeof(XmlQualifiedName)); + public ReflectionXmlSerializationReader(XmlMapping mapping, XmlReader xmlReader, XmlDeserializationEvents events, string? encodingStyle) { Init(xmlReader, events, encodingStyle, tempAssembly: null); _mapping = mapping; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected override void InitCallbacks() { TypeScope scope = _mapping.Scope!; @@ -50,6 +61,7 @@ namespace System.Xml.Serialization { } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public object? ReadObject() { XmlMapping xmlMapping = _mapping; @@ -73,6 +85,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private object GenerateMembersElement(XmlMembersMapping xmlMembersMapping) { if (xmlMembersMapping.Accessor.IsSoap) @@ -85,6 +98,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private object GenerateLiteralMembersElement(XmlMembersMapping xmlMembersMapping) { ElementAccessor element = xmlMembersMapping.Accessor; @@ -128,6 +142,7 @@ namespace System.Xml.Serialization return p; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private bool GenerateLiteralMembersElementInternal(MemberMapping[] mappings, bool hasWrapperElement, object?[] p) { Member? anyText = null; @@ -312,6 +327,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private object GenerateEncodedMembersElement(XmlMembersMapping xmlMembersMapping) { ElementAccessor element = xmlMembersMapping.Accessor; @@ -399,17 +415,19 @@ namespace System.Xml.Serialization } else { - unrecognizedElementSource = (_) => - { - if (Reader.GetAttribute("id", null) != null) - { - ReadReferencedElement(); - } - else - { - UnknownNode(p); - }; - }; + unrecognizedElementSource = Wrapper; + [RequiresUnreferencedCode("calls ReadReferencedElement")] + void Wrapper(object? _) + { + if (Reader.GetAttribute("id", null) != null) + { + ReadReferencedElement(); + } + else + { + UnknownNode(p); + } + } } WriteMemberElements(members, unrecognizedElementSource, (_) => UnknownNode(p), null, null, fixup: fixup, checkTypeHrefsSource: checkTypeHrefSource); @@ -452,6 +470,7 @@ namespace System.Xml.Serialization return p; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private object? GenerateTypeElement(XmlTypeMapping xmlTypeMapping) { ElementAccessor element = xmlTypeMapping.Accessor; @@ -481,6 +500,7 @@ namespace System.Xml.Serialization return o; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private void WriteMemberElements(Member[] expectedMembers, UnknownNodeAction elementElseAction, UnknownNodeAction elseAction, Member? anyElement, Member? anyText, Fixup? fixup = null, List? checkTypeHrefsSource = null) { bool checkType = checkTypeHrefsSource != null; @@ -510,6 +530,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private void WriteMemberElementsCheckType(List checkTypeHrefsSource) { object? RefElememnt = ReadReferencingElement(null, null, true, out string? refElemId); @@ -533,6 +554,7 @@ namespace System.Xml.Serialization action?.Invoke(null); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private void WriteMembers(ref object? o, Member[] members, UnknownNodeAction elementElseAction, UnknownNodeAction elseAction, Member? anyElement, Member? anyText) { Reader.MoveToContent(); @@ -544,7 +566,8 @@ namespace System.Xml.Serialization } } - private void SetCollectionObjectWithCollectionMember([NotNull] ref object? collection, CollectionMember collectionMember, Type collectionType) + private void SetCollectionObjectWithCollectionMember([NotNull] ref object? collection, CollectionMember collectionMember, + [DynamicallyAccessedMembers(TrimmerConstants.AllMethods)] Type collectionType) { if (collectionType.IsArray) { @@ -577,7 +600,8 @@ namespace System.Xml.Serialization } } - private static void AddObjectsIntoTargetCollection(object targetCollection, List sourceCollection, Type targetCollectionType) + private static void AddObjectsIntoTargetCollection(object targetCollection, List sourceCollection, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type targetCollectionType) { if (targetCollection is IList targetList) { @@ -605,6 +629,7 @@ namespace System.Xml.Serialization private static readonly ConcurrentDictionary<(Type, string), ReflectionXmlSerializationReaderHelper.SetMemberValueDelegate> s_setMemberValueDelegateCache = new ConcurrentDictionary<(Type, string), ReflectionXmlSerializationReaderHelper.SetMemberValueDelegate>(); + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private static ReflectionXmlSerializationReaderHelper.SetMemberValueDelegate GetSetMemberValueDelegate(object o, string memberName) { Debug.Assert(o != null, "Object o should not be null"); @@ -652,6 +677,7 @@ namespace System.Xml.Serialization throw new InvalidOperationException(SR.XmlInternalError); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private bool WriteMemberText(Member anyText) { object? value; @@ -714,6 +740,7 @@ namespace System.Xml.Serialization return false; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private void WriteMemberElementsIf(Member[] expectedMembers, Member? anyElementMember, UnknownNodeAction elementElseAction, Fixup? fixup = null, CheckTypeSource? checkTypeSource = null) { bool checkType = checkTypeSource != null; @@ -822,6 +849,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private object? WriteElement(ElementAccessor element, bool checkSpecified, bool checkForNull, bool readOnly, string? defaultNamespace, int fixupIndex = -1, int elementIndex = -1, Fixup? fixup = null, Member? member = null) { object? value = null; @@ -994,11 +1022,14 @@ namespace System.Xml.Serialization return value; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private XmlSerializationReadCallback CreateXmlSerializationReadCallback(TypeMapping mapping) { if (mapping is StructMapping structMapping) { - return () => WriteStructMethod(structMapping, mapping.TypeDesc!.IsNullable, true, defaultNamespace: null); + [RequiresUnreferencedCode("calls WriteStructMethod")] + object? WriteStruct() => WriteStructMethod(structMapping, mapping.TypeDesc!.IsNullable, true, defaultNamespace: null); + return WriteStruct; } else if (mapping is EnumMapping enumMapping) { @@ -1006,7 +1037,9 @@ namespace System.Xml.Serialization } else if (mapping is NullableMapping nullableMapping) { - return () => WriteNullableMethod(nullableMapping, false, null); + [RequiresUnreferencedCode("calls WriteNullableMethod")] + object? Wrapper() => WriteNullableMethod(nullableMapping, false, null); + return Wrapper; } return DummyReadArrayMethod; @@ -1050,6 +1083,7 @@ namespace System.Xml.Serialization return mapping.TypeDesc!.CanBeElementValue; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private object? WriteArray(ArrayMapping arrayMapping, bool readOnly, bool isNullable, string? defaultNamespace, int fixupIndex = -1, Fixup? fixup = null, Member? member = null) { object? o = null; @@ -1141,6 +1175,7 @@ namespace System.Xml.Serialization return o; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private object WritePrimitive(TypeMapping mapping, Func readFunc, object funcState) { if (mapping is EnumMapping enumMapping) @@ -1202,6 +1237,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private object? WriteStructMethod(StructMapping mapping, bool isNullable, bool checkType, string? defaultNamespace) { if (mapping.IsSoap) @@ -1210,6 +1246,7 @@ namespace System.Xml.Serialization return WriteLiteralStructMethod(mapping, isNullable, checkType, defaultNamespace); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private object? WriteNullableMethod(NullableMapping nullableMapping, bool checkType, string? defaultNamespace) { object? o = Activator.CreateInstance(nullableMapping.TypeDesc!.Type!); @@ -1272,7 +1309,8 @@ namespace System.Xml.Serialization return h; } - private object? ReflectionCreateObject(Type type) + private object? ReflectionCreateObject( + [DynamicallyAccessedMembers(TrimmerConstants.AllMethods)] Type type) { object? obj; if (type.IsArray) @@ -1295,10 +1333,13 @@ namespace System.Xml.Serialization return obj; } - private ConstructorInfo? GetDefaultConstructor(Type type) => + private ConstructorInfo? GetDefaultConstructor( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors + | DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type type) => type.IsValueType ? null : type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly, null, Type.EmptyTypes, null); + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private object? WriteEncodedStructMethod(StructMapping structMapping) { if (structMapping.TypeDesc!.IsRoot) @@ -1324,7 +1365,12 @@ namespace System.Xml.Serialization TypeDesc td = member.Mapping.TypeDesc!; if (td.IsCollection || td.IsEnumerable) { - member.Source = (value) => WriteAddCollectionFixup(o!, member, value!); + member.Source = Wrapper; + [RequiresUnreferencedCode("Calls WriteAddCollectionFixup")] + void Wrapper(object? value) + { + WriteAddCollectionFixup(o!, member, value!); + } } else if (!member.Mapping.ReadOnly) { @@ -1413,6 +1459,7 @@ namespace System.Xml.Serialization }; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private void WriteAddCollectionFixup(object o, Member member, object memberValue) { TypeDesc typeDesc = member.Mapping.TypeDesc!; @@ -1423,6 +1470,7 @@ namespace System.Xml.Serialization WriteAddCollectionFixup(getSource, setSource, memberValue, typeDesc, readOnly); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private object? WriteAddCollectionFixup(Func getSource, Action setSource, object memberValue, TypeDesc typeDesc, bool readOnly) { object? memberSource = getSource(); @@ -1446,9 +1494,12 @@ namespace System.Xml.Serialization return memberSource; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private XmlSerializationCollectionFixupCallback GetCreateCollectionOfObjectsCallback(Type collectionType) { - return (collection, collectionItems) => + return Wrapper; + [RequiresUnreferencedCode("Calls AddObjectsIntoTargetCollection")] + void Wrapper(object? collection, object? collectionItems) { if (collectionItems == null) return; @@ -1470,9 +1521,10 @@ namespace System.Xml.Serialization } AddObjectsIntoTargetCollection(collection, listOfItems, collectionType); - }; + } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private object? WriteLiteralStructMethod(StructMapping structMapping, bool isNullable, bool checkType, string? defaultNamespace) { XmlQualifiedName? xsiType = checkType ? GetXsiType() : null; @@ -1578,7 +1630,10 @@ namespace System.Xml.Serialization if (mapping.Attribute != null) { - member.Source = (value) => SetOrAddValueToMember(o!, value!, member.Mapping.MemberInfo!); + member.Source = Wrapper; + [RequiresUnreferencedCode("calls SetOrAddValueToMember")] + void Wrapper(object? value) { SetOrAddValueToMember(o!, value!, member.Mapping.MemberInfo!); } + if (mapping.Attribute.Any) { anyAttribute = member; @@ -1668,7 +1723,9 @@ namespace System.Xml.Serialization if (member.Mapping.CheckSpecified == SpecifiedAccessor.ReadWrite) { - member.CheckSpecifiedSource = (_) => + member.CheckSpecifiedSource = Wrapper; + [RequiresUnreferencedCode("calls GetType on object")] + void Wrapper(object? _) { string specifiedMemberName = member.Mapping.Name + "Specified"; MethodInfo? specifiedMethodInfo = o!.GetType().GetMethod("set_" + specifiedMemberName); @@ -1682,7 +1739,9 @@ namespace System.Xml.Serialization ChoiceIdentifierAccessor? choice = mapping.ChoiceIdentifier; if (choice != null && o != null) { - member.ChoiceSource = (elementNameObject) => + member.ChoiceSource = Wrapper; + [RequiresUnreferencedCode("Calls SetOrAddValueToMember")] + void Wrapper(object elementNameObject) { string? elementName = elementNameObject as string; foreach (var name in choice.MemberIds!) @@ -1752,6 +1811,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private bool WriteEnumAndArrayTypes(out object? o, StructMapping mapping, XmlQualifiedName xsiType, string? defaultNamespace) { foreach (var m in _mapping.Scope!.TypeMappings) @@ -1790,6 +1850,7 @@ namespace System.Xml.Serialization return false; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private bool WriteDerivedTypes(out object? o, StructMapping mapping, XmlQualifiedName xsiType, string? defaultNamespace, bool checkType, bool isNullable) { for (StructMapping? derived = mapping.DerivedMappings; derived != null; derived = derived.NextDerivedMapping) @@ -1810,6 +1871,7 @@ namespace System.Xml.Serialization return false; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private void WriteAttributes(Member[] members, Member? anyAttribute, UnknownNodeAction elseCall, ref object? o) { Member? xmlnsMember = null; @@ -1896,6 +1958,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private void WriteAttribute(Member member, object? attr = null) { AttributeAccessor attribute = member.Mapping.Attribute!; @@ -1943,6 +2006,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private void SetOrAddValueToMember(object o, object value, MemberInfo memberInfo) { Type memberType = GetMemberType(memberInfo); @@ -1963,6 +2027,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private void AddItemInArrayMember(object o, MemberInfo memberInfo, Type memberType, object item) { var currentArray = (Array?)GetMemberValue(o, memberInfo); diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs index 4614bd2..3ed294b 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs @@ -4,6 +4,7 @@ using System.Collections; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Text; using System.Xml.Schema; @@ -14,9 +15,6 @@ namespace System.Xml.Serialization { private readonly XmlMapping _mapping; - internal static TypeDesc StringTypeDesc { get; private set; } = (new TypeScope()).GetTypeDesc(typeof(string)); - internal static TypeDesc QnameTypeDesc { get; private set; } = (new TypeScope()).GetTypeDesc(typeof(XmlQualifiedName)); - public ReflectionXmlSerializationWriter(XmlMapping xmlMapping, XmlWriter xmlWriter, XmlSerializerNamespaces namespaces, string? encodingStyle, string? id) { Init(xmlWriter, namespaces, encodingStyle, id, null); @@ -36,6 +34,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected override void InitCallbacks() { TypeScope scope = _mapping.Scope!; @@ -55,6 +54,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteObjectOfTypeElement")] public void WriteObject(object? o) { XmlMapping xmlMapping = _mapping; @@ -68,11 +68,13 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls GenerateTypeElement")] private void WriteObjectOfTypeElement(object? o, XmlTypeMapping mapping) { GenerateTypeElement(o, mapping); } + [RequiresUnreferencedCode("calls WriteReferencedElements")] private void GenerateTypeElement(object? o, XmlTypeMapping xmlMapping) { ElementAccessor element = xmlMapping.Accessor; @@ -113,6 +115,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteElements")] private void WriteMember(object? o, object? choiceSource, ElementAccessor[] elements, TextAccessor? text, ChoiceIdentifierAccessor? choice, TypeDesc memberTypeDesc, bool writeAccessors) { if (memberTypeDesc.IsArrayLike && @@ -126,6 +129,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteArrayItems")] private void WriteArray(object o, object? choiceSource, ElementAccessor[] elements, TextAccessor? text, ChoiceIdentifierAccessor? choice, TypeDesc arrayTypeDesc) { if (elements.Length == 0 && text == null) @@ -149,6 +153,7 @@ namespace System.Xml.Serialization WriteArrayItems(elements, text, choice, arrayTypeDesc, o); } + [RequiresUnreferencedCode("calls WriteElements")] private void WriteArrayItems(ElementAccessor[] elements, TextAccessor? text, ChoiceIdentifierAccessor? choice, TypeDesc? arrayTypeDesc, object o) { var arr = o as IList; @@ -178,6 +183,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls CreateUnknownTypeException")] private void WriteElements(object? o, object? enumSource, ElementAccessor[] elements, TextAccessor? text, ChoiceIdentifierAccessor? choice, bool writeAccessors, bool isNullable) { if (elements.Length == 0 && text == null) @@ -309,6 +315,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WritePotentiallyReferencingElement")] private void WriteElement(object? o, ElementAccessor element, bool writeAccessor) { string name = writeAccessor ? element.Name : element.Mapping!.TypeName!; @@ -386,7 +393,7 @@ namespace System.Xml.Serialization else if (element.Mapping is PrimitiveMapping) { var mapping = element.Mapping as PrimitiveMapping; - if (mapping!.TypeDesc == QnameTypeDesc) + if (mapping!.TypeDesc == ReflectionXmlSerializationReader.QnameTypeDesc) { WriteQualifiedNameElement(name, ns!, element.Default, (XmlQualifiedName)o!, element.IsNullable, mapping.IsSoap, mapping); } @@ -437,14 +444,17 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteStructMethod")] private XmlSerializationWriteCallback CreateXmlSerializationWriteCallback(TypeMapping mapping, string name, string? ns, bool isNullable) { if (mapping is StructMapping structMapping) { - return (o) => + return Wrapper; + [RequiresUnreferencedCode("calls WriteStructMethod")] + void Wrapper(object o) { WriteStructMethod(structMapping, name, ns, o, isNullable, needType: false); - }; + } } else if (mapping is EnumMapping enumMapping) { @@ -489,6 +499,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteTypedPrimitive")] private void WriteStructMethod(StructMapping mapping, string n, string? ns, object? o, bool isNullable, bool needType) { if (mapping.IsSoap && mapping.TypeDesc!.IsRoot) return; @@ -635,6 +646,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("Calls GetType on object")] private object? GetMemberValue(object o, string memberName) { MemberInfo memberInfo = ReflectionXmlSerializationHelper.GetMember(o.GetType(), memberName); @@ -642,6 +654,7 @@ namespace System.Xml.Serialization return memberValue; } + [RequiresUnreferencedCode("calls WriteMember")] private bool WriteEnumAndArrayTypes(StructMapping structMapping, object o, string n, string? ns) { if (o is Enum) @@ -876,7 +889,7 @@ namespace System.Xml.Serialization // check to see if we can write values of the attribute sequentially // currently we have only one data type (XmlQualifiedName) that we can not write "inline", // because we need to output xmlns:qx="..." for each of the qnames - return (listElementTypeDesc != null && listElementTypeDesc != QnameTypeDesc); + return (listElementTypeDesc != null && listElementTypeDesc != ReflectionXmlSerializationReader.QnameTypeDesc); } private void WriteAttribute(object memberValue, AttributeAccessor attribute, object? container) @@ -913,6 +926,7 @@ namespace System.Xml.Serialization return -1; } + [RequiresUnreferencedCode("calls WriteStructMethod")] private bool WriteDerivedTypes(StructMapping mapping, string n, string? ns, object o, bool isNullable) { Type t = o.GetType(); @@ -1075,7 +1089,7 @@ namespace System.Xml.Serialization private bool WritePrimitiveValue(TypeDesc typeDesc, object? o, bool isElement, out string? stringValue) { - if (typeDesc == StringTypeDesc || typeDesc.FormatterName == "String") + if (typeDesc == ReflectionXmlSerializationReader.StringTypeDesc || typeDesc.FormatterName == "String") { stringValue = (string?)o; return true; @@ -1114,7 +1128,7 @@ namespace System.Xml.Serialization throw new InvalidOperationException(SR.Format(SR.XmlInternalErrorDetails, "Invalid DateTime")); } } - else if (typeDesc == QnameTypeDesc) + else if (typeDesc == ReflectionXmlSerializationReader.QnameTypeDesc) { stringValue = FromXmlQualifiedName((XmlQualifiedName?)o); return true; @@ -1186,6 +1200,7 @@ namespace System.Xml.Serialization return stringValue; } + [RequiresUnreferencedCode("calls WritePotentiallyReferencingElement")] private void GenerateMembersElement(object o, XmlMembersMapping xmlMembersMapping) { ElementAccessor element = xmlMembersMapping.Accessor; @@ -1340,6 +1355,7 @@ namespace System.Xml.Serialization internal static class ReflectionXmlSerializationHelper { + [RequiresUnreferencedCode("Reflects over base members")] public static MemberInfo GetMember(Type declaringType, string memberName) { MemberInfo[] memberInfos = declaringType.GetMember(memberName); diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/SchemaImporter.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/SchemaImporter.cs index 2df97cb..7e5a4ac 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/SchemaImporter.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/SchemaImporter.cs @@ -7,6 +7,7 @@ namespace System.Xml.Serialization using System.Xml.Schema; using System.Collections; using System.ComponentModel; + using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Configuration; using System.Xml.Serialization.Configuration; @@ -26,6 +27,7 @@ namespace System.Xml.Serialization private NameTable? _typesInUse; private NameTable? _groupsInUse; + [RequiresUnreferencedCode("calls SetCache")] internal SchemaImporter(XmlSchemas schemas, CodeGenerationOptions options, ImportContext context) { if (!schemas.Contains(XmlSchema.Namespace)) @@ -114,6 +116,7 @@ namespace System.Xml.Serialization get { return _options; } } + [RequiresUnreferencedCode("calls GetTypeDesc")] internal void MakeDerived(StructMapping structMapping, Type? baseType, bool baseTypeCanBeIndirect) { structMapping.ReferencedByTopLevelElement = true; @@ -144,6 +147,7 @@ namespace System.Xml.Serialization return TypeIdentifiers.AddUnique(typeName, typeName); } + [RequiresUnreferencedCode("calls GetTypeDesc")] private StructMapping CreateRootMapping() { TypeDesc typeDesc = Scope.GetTypeDesc(typeof(object)); @@ -157,6 +161,7 @@ namespace System.Xml.Serialization return mapping; } + [RequiresUnreferencedCode("calls CreateRootMapping")] internal StructMapping GetRootMapping() { if (_root == null) @@ -164,6 +169,7 @@ namespace System.Xml.Serialization return _root; } + [RequiresUnreferencedCode("calls GetRootMapping")] internal StructMapping ImportRootMapping() { if (!_rootImported) @@ -174,6 +180,7 @@ namespace System.Xml.Serialization return GetRootMapping(); } + [RequiresUnreferencedCode("calls ImportType")] internal abstract void ImportDerivedTypes(XmlQualifiedName baseName); internal void AddReference(XmlQualifiedName name, NameTable references, string error) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/SoapReflectionImporter.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/SoapReflectionImporter.cs index 2878eeb..39310b9 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/SoapReflectionImporter.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/SoapReflectionImporter.cs @@ -12,6 +12,7 @@ namespace System.Xml.Serialization using System.Threading; using System.Xml; using System.Xml.Serialization; + using System.Diagnostics.CodeAnalysis; public class SoapReflectionImporter { @@ -47,11 +48,13 @@ namespace System.Xml.Serialization _modelScope = new ModelScope(_typeScope); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public void IncludeTypes(ICustomAttributeProvider provider) { IncludeTypes(provider, new RecursionLimiter()); } + [RequiresUnreferencedCode("calls IncludeType")] private void IncludeTypes(ICustomAttributeProvider provider, RecursionLimiter limiter) { object[] attrs = provider.GetCustomAttributes(typeof(SoapIncludeAttribute), false); @@ -61,21 +64,25 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public void IncludeType(Type type) { IncludeType(type, new RecursionLimiter()); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private void IncludeType(Type type, RecursionLimiter limiter) { ImportTypeMapping(_modelScope.GetTypeModel(type), limiter); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlTypeMapping ImportTypeMapping(Type type) { return ImportTypeMapping(type, null); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlTypeMapping ImportTypeMapping(Type type, string? defaultNamespace) { ElementAccessor element = new ElementAccessor(); @@ -91,21 +98,25 @@ namespace System.Xml.Serialization return xmlMapping; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, XmlReflectionMember[] members) { return ImportMembersMapping(elementName, ns, members, true, true, false); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, XmlReflectionMember[] members, bool hasWrapperElement, bool writeAccessors) { return ImportMembersMapping(elementName, ns, members, hasWrapperElement, writeAccessors, false); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, XmlReflectionMember[] members, bool hasWrapperElement, bool writeAccessors, bool validate) { return ImportMembersMapping(elementName, ns, members, hasWrapperElement, writeAccessors, validate, XmlMappingAccess.Read | XmlMappingAccess.Write); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, XmlReflectionMember[] members, bool hasWrapperElement, bool writeAccessors, bool validate, XmlMappingAccess access) { ElementAccessor element = new ElementAccessor(); @@ -141,11 +152,13 @@ namespace System.Xml.Serialization return new SoapAttributes(memberInfo); } + [RequiresUnreferencedCode("calls ImportTypeMapping")] private TypeMapping ImportTypeMapping(TypeModel model, RecursionLimiter limiter) { return ImportTypeMapping(model, string.Empty, limiter); } + [RequiresUnreferencedCode("Calls TypeDesc")] private TypeMapping ImportTypeMapping(TypeModel model, string dataType, RecursionLimiter limiter) { if (dataType.Length > 0) @@ -206,6 +219,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls GetTypeDesc")] private StructMapping CreateRootMapping() { TypeDesc typeDesc = _typeScope.GetTypeDesc(typeof(object)); @@ -219,6 +233,7 @@ namespace System.Xml.Serialization return mapping; } + [RequiresUnreferencedCode("calls CreateRootMapping")] private StructMapping GetRootMapping() { if (_root == null) @@ -238,7 +253,8 @@ namespace System.Xml.Serialization return mapping; } - private NullableMapping CreateNullableMapping(TypeMapping baseMapping, Type type) + private NullableMapping CreateNullableMapping(TypeMapping baseMapping, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type) { TypeDesc typeDesc = baseMapping.TypeDesc!.GetNullableTypeDesc(type); TypeMapping? existingMapping = (TypeMapping?)_nullables[baseMapping.TypeName!, baseMapping.Namespace]; @@ -275,6 +291,7 @@ namespace System.Xml.Serialization return mapping; } + [RequiresUnreferencedCode("calls GetRootMapping")] private StructMapping ImportStructLikeMapping(StructModel model, RecursionLimiter limiter) { if (model.TypeDesc.Kind == TypeKind.Root) return GetRootMapping(); @@ -332,7 +349,7 @@ namespace System.Xml.Serialization return mapping; } - + [RequiresUnreferencedCode("calls GetTypeModel")] private bool InitializeStructMembers(StructMapping mapping, StructModel model, RecursionLimiter limiter) { if (mapping.IsFullyInitialized) @@ -397,7 +414,7 @@ namespace System.Xml.Serialization return true; } - + [RequiresUnreferencedCode("calls IncludeTypes")] private ArrayMapping ImportArrayLikeMapping(ArrayModel model, RecursionLimiter limiter) { ArrayMapping mapping = new ArrayMapping(); @@ -534,6 +551,7 @@ namespace System.Xml.Serialization return mapping; } + [RequiresUnreferencedCode("calls XsdTypeName")] private EnumMapping ImportEnumMapping(EnumModel model) { SoapAttributes a = GetAttributes(model.Type); @@ -585,6 +603,7 @@ namespace System.Xml.Serialization return constant; } + [RequiresUnreferencedCode("calls GetTypeDesc")] private MembersMapping ImportMembersMapping(XmlReflectionMember[] xmlReflectionMembers, string? ns, bool hasWrapperElement, bool writeAccessors, bool validateWrapperElement, RecursionLimiter limiter) { MembersMapping members = new MembersMapping(); @@ -625,6 +644,7 @@ namespace System.Xml.Serialization return members; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private MemberMapping? ImportMemberMapping(XmlReflectionMember xmlReflectionMember, string? ns, XmlReflectionMember[] xmlReflectionMembers, XmlSchemaForm form, RecursionLimiter limiter) { SoapAttributes a = xmlReflectionMember.SoapAttributes; @@ -643,6 +663,7 @@ namespace System.Xml.Serialization return member; } + [RequiresUnreferencedCode("calls ImportAccessorMapping")] private MemberMapping? ImportFieldMapping(FieldModel model, SoapAttributes a, string ns, RecursionLimiter limiter) { if (a.SoapIgnore) return null; @@ -659,6 +680,7 @@ namespace System.Xml.Serialization return member; } + [RequiresUnreferencedCode("calls GetTypeDesc")] private void ImportAccessorMapping(MemberMapping accessor, FieldModel model, SoapAttributes a, string? ns, XmlSchemaForm form, RecursionLimiter limiter) { Type accessorType = model.FieldType; @@ -714,6 +736,7 @@ namespace System.Xml.Serialization return element; } + [RequiresUnreferencedCode("calls GetTypeDesc")] private object? GetDefaultValue(TypeDesc fieldTypeDesc, SoapAttributes a) { if (a.SoapDefaultValue == null || a.SoapDefaultValue == DBNull.Value) return null; @@ -736,6 +759,7 @@ namespace System.Xml.Serialization return a.SoapDefaultValue; } + [RequiresUnreferencedCode("calls GetTypeDesc")] internal string XsdTypeName(Type type) { if (type == typeof(object)) return Soap.UrType; @@ -744,6 +768,8 @@ namespace System.Xml.Serialization return typeDesc.DataType.Name; return XsdTypeName(type, GetAttributes(type), typeDesc.Name); } + + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] internal string XsdTypeName(Type type, SoapAttributes a, string name) { string typeName = name; diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/SourceInfo.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/SourceInfo.cs index ec3f4d5..5b4e7fe 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/SourceInfo.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/SourceInfo.cs @@ -32,10 +32,13 @@ namespace System.Xml.Serialization public string Source; public readonly string Arg; public readonly MemberInfo? MemberInfo; + + [DynamicallyAccessedMembers(TrimmerConstants.AllMethods)] public readonly Type? Type; public readonly CodeGenerator ILG; - public SourceInfo(string source, string? arg, MemberInfo? memberInfo, Type? type, CodeGenerator ilg) + public SourceInfo(string source, string? arg, MemberInfo? memberInfo, + [DynamicallyAccessedMembers(TrimmerConstants.AllMethods)] Type? type, CodeGenerator ilg) { this.Source = source; this.Arg = arg ?? source; @@ -49,16 +52,19 @@ namespace System.Xml.Serialization return new SourceInfo("((" + td.CSharpName + ")" + Source + ")", Arg, MemberInfo, td.Type!, ILG); } + [RequiresUnreferencedCode("calls InternalLoad")] public void LoadAddress(Type? elementType) { InternalLoad(elementType, asAddress: true); } + [RequiresUnreferencedCode("calls InternalLoad")] public void Load(Type? elementType) { InternalLoad(elementType); } + [RequiresUnreferencedCode("calls LoadMemberAddress")] private void InternalLoad(Type? elementType, bool asAddress = false) { Match match = s_regex.Match(Arg); @@ -209,7 +215,9 @@ namespace System.Xml.Serialization } } - private void ConvertNullableValue(Type nullableType, Type targetType) + private void ConvertNullableValue( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods + | DynamicallyAccessedMemberTypes.NonPublicMethods)] Type nullableType, Type targetType) { System.Diagnostics.Debug.Assert(targetType == nullableType || targetType.IsAssignableFrom(nullableType.GetGenericArguments()[0])); if (targetType != nullableType) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/TypeExtensions.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/TypeExtensions.cs index f84d014..77b150b 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/TypeExtensions.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/TypeExtensions.cs @@ -4,13 +4,17 @@ namespace System.Xml.Serialization { using System; + using System.Diagnostics.CodeAnalysis; using System.Reflection; internal static class TypeExtensions { private const string ImplicitCastOperatorName = "op_Implicit"; - public static bool TryConvertTo(this Type targetType, object? data, out object? returnValue) + public static bool TryConvertTo( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] + this Type targetType, + object? data, out object? returnValue) { if (targetType == null) { diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Types.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Types.cs index 83b660d..e2e92b3 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Types.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Types.cs @@ -7,6 +7,7 @@ namespace System.Xml.Serialization using System.Collections; using System.Collections.Generic; using System.Diagnostics; + using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Text; using System.Xml; @@ -62,6 +63,21 @@ namespace System.Xml.Serialization Unsupported = 0x100000, } + // Shorthands for common trimmer constants + internal static class TrimmerConstants + { + public const DynamicallyAccessedMemberTypes AllMethods = DynamicallyAccessedMemberTypes.PublicMethods + | DynamicallyAccessedMemberTypes.NonPublicMethods + | DynamicallyAccessedMemberTypes.PublicConstructors + | DynamicallyAccessedMemberTypes.NonPublicConstructors; + public const DynamicallyAccessedMemberTypes PublicMembers = DynamicallyAccessedMemberTypes.PublicConstructors + | DynamicallyAccessedMemberTypes.PublicMethods + | DynamicallyAccessedMemberTypes.PublicFields + | DynamicallyAccessedMemberTypes.PublicNestedTypes + | DynamicallyAccessedMemberTypes.PublicProperties + | DynamicallyAccessedMemberTypes.PublicEvents; + } + internal sealed class TypeDesc { private readonly string _name; @@ -72,6 +88,7 @@ namespace System.Xml.Serialization private TypeDesc? _nullableTypeDesc; private readonly TypeKind _kind; private readonly XmlSchemaType? _dataType; + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] private Type? _type; private TypeDesc? _baseTypeDesc; private TypeFlags _flags; @@ -105,13 +122,15 @@ namespace System.Xml.Serialization : this(name, fullName, (XmlSchemaType?)null, kind, baseTypeDesc, flags, null) { } - internal TypeDesc(Type type, bool isXsdType, XmlSchemaType dataType, string formatterName, TypeFlags flags) + internal TypeDesc( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, bool isXsdType, XmlSchemaType dataType, string formatterName, TypeFlags flags) : this(type!.Name, type.FullName!, dataType, TypeKind.Primitive, (TypeDesc?)null, flags, formatterName) { _isXsdType = isXsdType; _type = type; } - internal TypeDesc(Type? type, string name, string fullName, TypeKind kind, TypeDesc? baseTypeDesc, TypeFlags flags, TypeDesc? arrayElementTypeDesc) + internal TypeDesc( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? type, string name, string fullName, TypeKind kind, TypeDesc? baseTypeDesc, TypeFlags flags, TypeDesc? arrayElementTypeDesc) : this(name, fullName, null, kind, baseTypeDesc, flags, null) { _arrayElementTypeDesc = arrayElementTypeDesc; @@ -165,6 +184,7 @@ namespace System.Xml.Serialization get { return _dataType; } } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] internal Type? Type { get { return _type; } @@ -347,7 +367,8 @@ namespace System.Xml.Serialization set { _exception = value; } } - internal TypeDesc GetNullableTypeDesc(Type type) + internal TypeDesc GetNullableTypeDesc( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type) { if (IsOptionalValue) return this; @@ -622,7 +643,9 @@ namespace System.Xml.Serialization AddSoapEncodedPrimitive(typeof(byte[]), "base64", ns, "ByteArrayBase64", new XmlQualifiedName("base64Binary", XmlSchema.Namespace), TypeFlags.CanBeAttributeValue | TypeFlags.CanBeElementValue | TypeFlags.IgnoreDefault | TypeFlags.Reference); } - private static void AddPrimitive(Type type, string dataTypeName, string formatterName, TypeFlags flags) + private static void AddPrimitive( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, + string dataTypeName, string formatterName, TypeFlags flags) { XmlSchemaSimpleType dataType = new XmlSchemaSimpleType(); dataType.Name = dataTypeName; @@ -633,7 +656,9 @@ namespace System.Xml.Serialization s_primitiveNames.Add(dataTypeName, XmlSchema.Namespace, typeDesc); } - private static void AddNonXsdPrimitive(Type type, string dataTypeName, string ns, string formatterName, XmlQualifiedName baseTypeName, XmlSchemaFacet[] facets, TypeFlags flags) + private static void AddNonXsdPrimitive( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, + string dataTypeName, string ns, string formatterName, XmlQualifiedName baseTypeName, XmlSchemaFacet[] facets, TypeFlags flags) { XmlSchemaSimpleType dataType = new XmlSchemaSimpleType(); dataType.Name = dataTypeName; @@ -651,7 +676,9 @@ namespace System.Xml.Serialization s_primitiveNames.Add(dataTypeName, ns, typeDesc); } - private static void AddSoapEncodedPrimitive(Type type, string dataTypeName, string ns, string formatterName, XmlQualifiedName baseTypeName, TypeFlags flags) + private static void AddSoapEncodedPrimitive( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, + string dataTypeName, string ns, string formatterName, XmlQualifiedName baseTypeName, TypeFlags flags) { AddNonXsdPrimitive(type, dataTypeName, ns, formatterName, baseTypeName, Array.Empty(), flags); } @@ -679,16 +706,19 @@ namespace System.Xml.Serialization return (TypeDesc?)s_primitiveDataTypes[dataType]; } + [RequiresUnreferencedCode("calls GetTypeDesc")] internal TypeDesc GetTypeDesc(Type type) { return GetTypeDesc(type, null, true, true); } + [RequiresUnreferencedCode("calls GetTypeDesc")] internal TypeDesc GetTypeDesc(Type type, MemberInfo? source, bool directReference) { return GetTypeDesc(type, source, directReference, true); } + [RequiresUnreferencedCode("calls ImportTypeDesc")] internal TypeDesc GetTypeDesc(Type type, MemberInfo? source, bool directReference, bool throwOnError) { if (type.ContainsGenericParameters) @@ -711,6 +741,7 @@ namespace System.Xml.Serialization return typeDesc; } + [RequiresUnreferencedCode("calls ImportTypeDesc")] internal TypeDesc GetArrayTypeDesc(Type type) { TypeDesc? typeDesc = (TypeDesc?)_arrayTypeDescs[type]; @@ -747,6 +778,7 @@ namespace System.Xml.Serialization return null; } + [RequiresUnreferencedCode("calls GetEnumeratorElementType")] private TypeDesc ImportTypeDesc(Type type, MemberInfo? memberInfo, bool directReference) { TypeDesc? typeDesc = null; @@ -1012,6 +1044,7 @@ namespace System.Xml.Serialization return t.Name; } + [RequiresUnreferencedCode("calls GetEnumeratorElementType")] internal static Type? GetArrayElementType(Type type, string? memberInfo) { if (type.IsArray) @@ -1160,7 +1193,13 @@ namespace System.Xml.Serialization } } - private static bool ShouldBeReplaced(MemberInfo memberInfoToBeReplaced, Type derivedType, out MemberInfo replacedInfo) + private static bool ShouldBeReplaced( + MemberInfo memberInfoToBeReplaced, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties + | DynamicallyAccessedMemberTypes.NonPublicProperties + | DynamicallyAccessedMemberTypes.PublicFields + | DynamicallyAccessedMemberTypes.NonPublicFields)] Type derivedType, + out MemberInfo replacedInfo) { replacedInfo = memberInfoToBeReplaced; Type currentType = derivedType; @@ -1214,7 +1253,10 @@ namespace System.Xml.Serialization return false; } - private static TypeFlags GetConstructorFlags(Type type, ref Exception? exception) + private static TypeFlags GetConstructorFlags( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors + | DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type type, + ref Exception? exception) { ConstructorInfo? ctor = type.GetConstructor(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic, Type.EmptyTypes); if (ctor != null) @@ -1239,6 +1281,7 @@ namespace System.Xml.Serialization return 0; } + [RequiresUnreferencedCode("Needs to mark members on the return type of the GetEnumerator method")] private static Type? GetEnumeratorElementType(Type type, ref TypeFlags flags) { if (typeof(IEnumerable).IsAssignableFrom(type)) @@ -1299,7 +1342,8 @@ namespace System.Xml.Serialization } } - internal static PropertyInfo GetDefaultIndexer(Type type, string? memberInfo) + internal static PropertyInfo GetDefaultIndexer( + [DynamicallyAccessedMembers(TrimmerConstants.PublicMembers)] Type type, string? memberInfo) { if (typeof(IDictionary).IsAssignableFrom(type)) { @@ -1349,7 +1393,9 @@ namespace System.Xml.Serialization } return indexer; } - private static Type GetCollectionElementType(Type type, string? memberInfo) + private static Type GetCollectionElementType( + [DynamicallyAccessedMembers(TrimmerConstants.PublicMembers)] Type type, + string? memberInfo) { return GetDefaultIndexer(type, memberInfo).PropertyType; } diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlAttributes.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlAttributes.cs index 06c999c..0a0cbd0 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlAttributes.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlAttributes.cs @@ -41,7 +41,6 @@ namespace System.Xml.Serialization private XmlTypeAttribute? _xmlType; private XmlAnyAttributeAttribute? _xmlAnyAttribute; private readonly XmlChoiceIdentifierAttribute? _xmlChoiceIdentifier; - private static volatile Type? s_ignoreAttributeType; /// @@ -72,22 +71,6 @@ namespace System.Xml.Serialization } } - private static Type IgnoreAttribute - { - get - { - if (s_ignoreAttributeType == null) - { - s_ignoreAttributeType = typeof(object).Assembly.GetType("System.XmlIgnoreMemberAttribute"); - if (s_ignoreAttributeType == null) - { - s_ignoreAttributeType = typeof(XmlIgnoreAttribute); - } - } - return s_ignoreAttributeType; - } - } - /// /// [To be supplied.] /// @@ -99,7 +82,7 @@ namespace System.Xml.Serialization XmlAnyElementAttribute? wildcard = null; for (int i = 0; i < attrs.Length; i++) { - if (attrs[i] is XmlIgnoreAttribute || attrs[i] is ObsoleteAttribute || attrs[i].GetType() == IgnoreAttribute) + if (attrs[i] is XmlIgnoreAttribute || attrs[i] is ObsoleteAttribute) { _xmlIgnore = true; break; diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlReflectionImporter.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlReflectionImporter.cs index dc29d7c..e84d599 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlReflectionImporter.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlReflectionImporter.cs @@ -15,6 +15,8 @@ namespace System.Xml.Serialization using System.Xml.Extensions; using System.Xml; using System.Xml.Serialization; + using System.Diagnostics.CodeAnalysis; + using System.Runtime.CompilerServices; /// /// @@ -86,11 +88,13 @@ namespace System.Xml.Serialization /// /// [To be supplied.] /// + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public void IncludeTypes(ICustomAttributeProvider provider) { IncludeTypes(provider, new RecursionLimiter()); } + [RequiresUnreferencedCode("calls IncludeType")] private void IncludeTypes(ICustomAttributeProvider provider, RecursionLimiter limiter) { object[] attrs = provider.GetCustomAttributes(typeof(XmlIncludeAttribute), false); @@ -104,11 +108,13 @@ namespace System.Xml.Serialization /// /// [To be supplied.] /// + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public void IncludeType(Type type) { IncludeType(type, new RecursionLimiter()); } + [RequiresUnreferencedCode("calls ImportTypeMapping")] private void IncludeType(Type type, RecursionLimiter limiter) { int previousNestingLevel = _arrayNestingLevel; @@ -132,6 +138,7 @@ namespace System.Xml.Serialization /// /// [To be supplied.] /// + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlTypeMapping ImportTypeMapping(Type type) { return ImportTypeMapping(type, null, null); @@ -140,6 +147,7 @@ namespace System.Xml.Serialization /// /// [To be supplied.] /// + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlTypeMapping ImportTypeMapping(Type type, string? defaultNamespace) { return ImportTypeMapping(type, null, defaultNamespace); @@ -148,6 +156,7 @@ namespace System.Xml.Serialization /// /// [To be supplied.] /// + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlTypeMapping ImportTypeMapping(Type type, XmlRootAttribute? root) { return ImportTypeMapping(type, root, null); @@ -156,6 +165,7 @@ namespace System.Xml.Serialization /// /// [To be supplied.] /// + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlTypeMapping ImportTypeMapping(Type type, XmlRootAttribute? root, string? defaultNamespace) { if (type == null) @@ -169,6 +179,7 @@ namespace System.Xml.Serialization /// /// [To be supplied.] /// + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, XmlReflectionMember[] members, bool hasWrapperElement) { return ImportMembersMapping(elementName, ns, members, hasWrapperElement, false); @@ -177,6 +188,7 @@ namespace System.Xml.Serialization /// /// [To be supplied.] /// + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, XmlReflectionMember[] members, bool hasWrapperElement, bool rpc) { return ImportMembersMapping(elementName, ns, members, hasWrapperElement, rpc, false); @@ -186,6 +198,7 @@ namespace System.Xml.Serialization /// [To be supplied.] /// /// + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, XmlReflectionMember[] members, bool hasWrapperElement, bool rpc, bool openModel) { return ImportMembersMapping(elementName, ns, members, hasWrapperElement, rpc, openModel, XmlMappingAccess.Read | XmlMappingAccess.Write); @@ -195,6 +208,7 @@ namespace System.Xml.Serialization /// [To be supplied.] /// /// + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, XmlReflectionMember[] members, bool hasWrapperElement, bool rpc, bool openModel, XmlMappingAccess access) { ElementAccessor element = new ElementAccessor(); @@ -242,6 +256,7 @@ namespace System.Xml.Serialization return new XmlAttributes(memberInfo); } + [RequiresUnreferencedCode("calls ImportTypeMapping")] private ElementAccessor ImportElement(TypeModel model, XmlRootAttribute? root, string? defaultNamespace, RecursionLimiter limiter) { XmlAttributes a = GetAttributes(model.Type, true); @@ -366,11 +381,13 @@ namespace System.Xml.Serialization return new InvalidOperationException(SR.Format(model.IsProperty ? SR.XmlPropertyReflectionError : SR.XmlFieldReflectionError, model.Name), e); } + [RequiresUnreferencedCode("calls ImportTypeMapping")] private TypeMapping ImportTypeMapping(TypeModel model, string? ns, ImportContext context, string dataType, XmlAttributes? a, RecursionLimiter limiter) { return ImportTypeMapping(model, ns, context, dataType, a, false, false, limiter); } + [RequiresUnreferencedCode("calls ImportEnumMapping")] private TypeMapping ImportTypeMapping(TypeModel model, string? ns, ImportContext context, string dataType, XmlAttributes? a, bool repeats, bool openModel, RecursionLimiter limiter) { try @@ -460,7 +477,8 @@ namespace System.Xml.Serialization } } - internal static MethodInfo? GetMethodFromSchemaProvider(XmlSchemaProviderAttribute provider, Type type) + internal static MethodInfo? GetMethodFromSchemaProvider(XmlSchemaProviderAttribute provider, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type type) { if (provider.IsAny) { @@ -484,6 +502,7 @@ namespace System.Xml.Serialization return getMethod; } + [RequiresUnreferencedCode("calls IncludeTypes")] private SpecialMapping ImportSpecialMapping(Type type, TypeDesc typeDesc, string? ns, ImportContext context, RecursionLimiter limiter) { if (_specials == null) @@ -609,6 +628,7 @@ namespace System.Xml.Serialization return new InvalidOperationException(SR.Format(SR.XmlIllegalTypeContext, typeDesc.FullName, GetContextName(context))); } + [RequiresUnreferencedCode("calls GetTypeDesc")] private StructMapping CreateRootMapping() { TypeDesc typeDesc = _typeScope.GetTypeDesc(typeof(object)); @@ -621,7 +641,8 @@ namespace System.Xml.Serialization return mapping; } - private NullableMapping CreateNullableMapping(TypeMapping baseMapping, Type type) + private NullableMapping CreateNullableMapping(TypeMapping baseMapping, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type) { TypeDesc typeDesc = baseMapping.TypeDesc!.GetNullableTypeDesc(type); TypeMapping? existingMapping; @@ -675,6 +696,7 @@ namespace System.Xml.Serialization return mapping; } + [RequiresUnreferencedCode("calls CreateRootMapping")] private StructMapping GetRootMapping() { if (_root == null) @@ -699,6 +721,7 @@ namespace System.Xml.Serialization return mapping; } + [RequiresUnreferencedCode("calls GetRootMapping")] private StructMapping ImportStructLikeMapping(StructModel model, string? ns, bool openModel, XmlAttributes? a, RecursionLimiter limiter) { if (model.TypeDesc.Kind == TypeKind.Root) return GetRootMapping(); @@ -764,6 +787,7 @@ namespace System.Xml.Serialization return mapping; } + [RequiresUnreferencedCode("calls GetTypeModel")] private bool InitializeStructMembers(StructMapping mapping, StructModel model, bool openModel, string? typeName, RecursionLimiter limiter) { if (mapping.IsFullyInitialized) @@ -926,6 +950,7 @@ namespace System.Xml.Serialization return false; } + [RequiresUnreferencedCode("calls GetTypeDesc")] internal string XsdTypeName(Type type) { if (type == typeof(object)) return Soap.UrType; @@ -935,6 +960,7 @@ namespace System.Xml.Serialization return XsdTypeName(type, GetAttributes(type, false), typeDesc.Name); } + [RequiresUnreferencedCode("Calls XsdTypeName")] internal string XsdTypeName(Type type, XmlAttributes a, string name) { string typeName = name; @@ -971,6 +997,7 @@ namespace System.Xml.Serialization return sum; } + [RequiresUnreferencedCode("calls XsdTypeName")] private void SetArrayMappingType(ArrayMapping mapping, string? defaultNs, Type type) { XmlAttributes a = GetAttributes(type, false); @@ -1061,6 +1088,7 @@ namespace System.Xml.Serialization mapping.Namespace = ns; } + [RequiresUnreferencedCode("calls SetArrayMappingType")] private ArrayMapping ImportArrayLikeMapping(ArrayModel model, string? ns, RecursionLimiter limiter) { ArrayMapping mapping = new ArrayMapping(); @@ -1156,6 +1184,7 @@ namespace System.Xml.Serialization return mapping; } + [RequiresUnreferencedCode("calls XsdTypeName")] private EnumMapping ImportEnumMapping(EnumModel model, string? ns, bool repeats) { XmlAttributes a = GetAttributes(model.Type, false); @@ -1214,6 +1243,7 @@ namespace System.Xml.Serialization return constant; } + [RequiresUnreferencedCode("calls GetTypeDesc")] private MembersMapping ImportMembersMapping(XmlReflectionMember[] xmlReflectionMembers, string? ns, bool hasWrapperElement, bool rpc, bool openModel, RecursionLimiter limiter) { MembersMapping members = new MembersMapping(); @@ -1291,6 +1321,7 @@ namespace System.Xml.Serialization return members; } + [RequiresUnreferencedCode("Calls TypeScope.GetTypeDesc(Type) and XmlReflectionImporter.ImportAccessorMapping both of which RequireUnreferencedCode")] private MemberMapping ImportMemberMapping(XmlReflectionMember xmlReflectionMember, string? ns, XmlReflectionMember[] xmlReflectionMembers, bool rpc, bool openModel, RecursionLimiter limiter) { XmlSchemaForm form = rpc ? XmlSchemaForm.Unqualified : XmlSchemaForm.Qualified; @@ -1371,6 +1402,7 @@ namespace System.Xml.Serialization return null; } + [RequiresUnreferencedCode("calls ImportAccessorMapping")] private MemberMapping ImportFieldMapping(StructModel parent, FieldModel model, XmlAttributes a, string? ns, RecursionLimiter limiter) { MemberMapping member = new MemberMapping(); @@ -1428,6 +1460,7 @@ namespace System.Xml.Serialization throw new InvalidOperationException(SR.Format(SR.XmlChoiceIdentiferMemberMissing, choice.MemberName, accessorName)); } + [RequiresUnreferencedCode("calls GetFieldModel")] private Type GetChoiceIdentifierType(XmlChoiceIdentifierAttribute choice, StructModel structModel, bool isArrayLike, string accessorName) { // check that the choice field exists @@ -1463,6 +1496,7 @@ namespace System.Xml.Serialization return enumType; } + [RequiresUnreferencedCode("calls ImportTypeMapping")] private void CreateArrayElementsFromAttributes(ArrayMapping arrayMapping, XmlArrayItemAttributes attributes, Type arrayElementType, string? arrayElementNs, RecursionLimiter limiter) { NameTable arrayItemElements = new NameTable(); // xmlelementname + xmlns -> ElementAccessor @@ -1487,6 +1521,7 @@ namespace System.Xml.Serialization arrayMapping.Elements = (ElementAccessor[])arrayItemElements.ToArray(typeof(ElementAccessor)); } + [RequiresUnreferencedCode("calls GetArrayElementType")] private void ImportAccessorMapping(MemberMapping accessor, FieldModel model, XmlAttributes a, string? ns, Type? choiceIdentifierType, bool rpc, bool openModel, RecursionLimiter limiter) { XmlSchemaForm elementFormDefault = XmlSchemaForm.Qualified; @@ -2219,6 +2254,7 @@ namespace System.Xml.Serialization } // will create a shallow type mapping for a top-level type + [RequiresUnreferencedCode("Calls TypeScope.GetTypeDesc(Type) which has RequiresUnreferencedCode")] internal static XmlTypeMapping GetTopLevelMapping(Type type, string? defaultNamespace) { defaultNamespace = defaultNamespace ?? string.Empty; diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSchemaImporter.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSchemaImporter.cs index 4eb4259..9aaf0a3 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSchemaImporter.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSchemaImporter.cs @@ -8,6 +8,7 @@ namespace System.Xml.Serialization using System.Collections; using System.Collections.Generic; using System.ComponentModel; + using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Xml.Serialization.Configuration; using System.Collections.Specialized; @@ -19,10 +20,13 @@ namespace System.Xml.Serialization public class XmlSchemaImporter : SchemaImporter { + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlSchemaImporter(XmlSchemas schemas) : base(schemas, CodeGenerationOptions.GenerateProperties, new ImportContext()) { } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlSchemaImporter(XmlSchemas schemas, CodeIdentifiers? typeIdentifiers) : base(schemas, CodeGenerationOptions.GenerateProperties, new ImportContext(typeIdentifiers, false)) { } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlTypeMapping ImportDerivedTypeMapping(XmlQualifiedName name, Type? baseType) { return ImportDerivedTypeMapping(name, baseType, false); @@ -42,6 +46,7 @@ namespace System.Xml.Serialization return mapping; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlTypeMapping ImportDerivedTypeMapping(XmlQualifiedName name, Type? baseType, bool baseTypeCanBeIndirect) { ElementAccessor element = ImportElement(name, typeof(TypeMapping), baseType); @@ -67,16 +72,19 @@ namespace System.Xml.Serialization return new XmlTypeMapping(Scope, element); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlTypeMapping ImportSchemaType(XmlQualifiedName typeName) { return ImportSchemaType(typeName, null, false); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlTypeMapping ImportSchemaType(XmlQualifiedName typeName, Type? baseType) { return ImportSchemaType(typeName, baseType, false); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlTypeMapping ImportSchemaType(XmlQualifiedName typeName, Type? baseType, bool baseTypeCanBeIndirect) { TypeMapping typeMapping = ImportType(typeName, typeof(TypeMapping), baseType, TypeFlags.CanBeElementValue, true)!; @@ -114,16 +122,19 @@ namespace System.Xml.Serialization return new XmlTypeMapping(Scope, accessor); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlTypeMapping ImportTypeMapping(XmlQualifiedName name) { return ImportDerivedTypeMapping(name, null); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlMembersMapping ImportMembersMapping(XmlQualifiedName name) { return new XmlMembersMapping(Scope, ImportElement(name, typeof(MembersMapping), null), XmlMappingAccess.Read | XmlMappingAccess.Write); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlMembersMapping? ImportAnyType(XmlQualifiedName typeName, string elementName) { TypeMapping? typeMapping = ImportType(typeName, typeof(MembersMapping), null, TypeFlags.CanBeElementValue, true); @@ -163,11 +174,13 @@ namespace System.Xml.Serialization return members; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlMembersMapping ImportMembersMapping(XmlQualifiedName[] names) { return ImportMembersMapping(names, null, false); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlMembersMapping ImportMembersMapping(XmlQualifiedName[] names, Type? baseType, bool baseTypeCanBeIndirect) { CodeIdentifiers memberScope = new CodeIdentifiers(); @@ -196,6 +209,7 @@ namespace System.Xml.Serialization return new XmlMembersMapping(Scope, element, XmlMappingAccess.Read | XmlMappingAccess.Write); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlMembersMapping ImportMembersMapping(string name, string? ns, SoapSchemaMember[] members) { XmlSchemaComplexType type = new XmlSchemaComplexType(); @@ -219,6 +233,7 @@ namespace System.Xml.Serialization return new XmlMembersMapping(Scope, accessor, XmlMappingAccess.Read | XmlMappingAccess.Write); } + [RequiresUnreferencedCode("calls ImportElement")] private ElementAccessor ImportElement(XmlQualifiedName name, Type desiredMappingType, Type? baseType) { XmlSchemaElement element = FindElement(name); @@ -234,6 +249,7 @@ namespace System.Xml.Serialization return accessor; } + [RequiresUnreferencedCode("calls ImportElementType")] private ElementAccessor ImportElement(XmlSchemaElement element, string identifier, Type desiredMappingType, Type? baseType, string? ns, bool topLevelElement) { if (!element.RefName.IsEmpty) @@ -292,6 +308,7 @@ namespace System.Xml.Serialization return accessor; } + [RequiresUnreferencedCode("calls ImportMembersType")] private TypeMapping ImportElementType(XmlSchemaElement element, string identifier, Type desiredMappingType, Type? baseType, string? ns) { TypeMapping? mapping; @@ -366,6 +383,7 @@ namespace System.Xml.Serialization return TypeIdentifiers.AddUnique(typeName, typeName); } + [RequiresUnreferencedCode("calls ImportType")] internal override void ImportDerivedTypes(XmlQualifiedName baseName) { foreach (XmlSchema schema in Schemas) @@ -387,6 +405,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls FindType")] private TypeMapping? ImportType(XmlQualifiedName name, Type desiredMappingType, Type? baseType, TypeFlags flags, bool addref) { if (name.Name == Soap.UrType && name.Namespace == XmlSchema.Namespace) @@ -414,6 +433,7 @@ namespace System.Xml.Serialization return mapping; } + [RequiresUnreferencedCode("calls ImportMembersType")] private TypeMapping? ImportType(XmlSchemaComplexType type, string? typeNs, string identifier, Type desiredMappingType, Type? baseType, TypeFlags flags) { if (type.Redefined != null) @@ -447,6 +467,7 @@ namespace System.Xml.Serialization throw new ArgumentException(SR.XmlInternalError, nameof(desiredMappingType)); } + [RequiresUnreferencedCode("calls GetTypeDesc")] private MembersMapping ImportMembersType(XmlSchemaType type, string? typeNs, string identifier) { if (!type.DerivedFrom.IsEmpty) throw new InvalidOperationException(SR.XmlMembersDeriveError); @@ -461,6 +482,7 @@ namespace System.Xml.Serialization return mappings; } + [RequiresUnreferencedCode("calls GetTypeDesc")] private StructMapping ImportStructType(XmlSchemaType type, string? typeNs, string identifier, Type? baseType, bool arrayLike) { TypeDesc? baseTypeDesc = null; @@ -570,6 +592,7 @@ namespace System.Xml.Serialization return (items.Particle != null) && (items.Particle is XmlSchemaAll); } + [RequiresUnreferencedCode("calls GetTypeDesc")] private StructMapping ImportStructDataType(XmlSchemaSimpleType dataType, string? typeNs, string identifier, Type baseType) { identifier = Accessor.UnescapeName(identifier); @@ -600,6 +623,7 @@ namespace System.Xml.Serialization internal bool IsUnbounded; } + [RequiresUnreferencedCode("calls FindType")] private MemberMapping[] ImportTypeMembers(XmlSchemaType type, string? typeNs, string identifier, CodeIdentifiers members, CodeIdentifiers membersScope, INameScope elementsScope, ref bool needExplicitOrder, bool order, bool allowUnboundedElements) { TypeItems items = GetTypeItems(type); @@ -718,6 +742,7 @@ namespace System.Xml.Serialization return items; } + [RequiresUnreferencedCode("calls ImportChoiceGroup")] private void ImportGroup(XmlSchemaGroupBase group, string identifier, CodeIdentifiers members, CodeIdentifiers membersScope, INameScope elementsScope, string? ns, bool mixed, ref bool needExplicitOrder, bool allowDuplicates, bool groupRepeats, bool allowUnboundedElements) { if (group is XmlSchemaChoice) @@ -731,6 +756,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls GetTypeDesc")] private MemberMapping ImportChoiceGroup(XmlSchemaGroupBase group, string identifier, CodeIdentifiers? members, CodeIdentifiers? membersScope, INameScope? elementsScope, string? ns, bool groupRepeats, ref bool needExplicitOrder, bool allowDuplicates) { NameTable choiceElements = new NameTable(); @@ -872,11 +898,13 @@ namespace System.Xml.Serialization return false; } + [RequiresUnreferencedCode("calls GatherGroupChoices")] private bool GatherGroupChoices(XmlSchemaGroup group, NameTable choiceElements, string identifier, string? ns, ref bool needExplicitOrder, bool allowDuplicates) { return GatherGroupChoices(group.Particle, choiceElements, identifier, ns, ref needExplicitOrder, allowDuplicates); } + [RequiresUnreferencedCode("Calls ImportAny")] private bool GatherGroupChoices(XmlSchemaParticle? particle, NameTable choiceElements, string identifier, string? ns, ref bool needExplicitOrder, bool allowDuplicates) { if (particle is XmlSchemaGroupRef) @@ -980,6 +1008,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls ImportChoiceGroup")] private void ImportGroupMembers(XmlSchemaParticle? particle, string identifier, CodeIdentifiers members, CodeIdentifiers membersScope, INameScope elementsScope, string? ns, bool groupRepeats, ref bool mixed, ref bool needExplicitOrder, bool allowDuplicates, bool allowUnboundedElements) { if (particle is XmlSchemaGroupRef) @@ -1057,6 +1086,7 @@ namespace System.Xml.Serialization return (XmlSchemaElement[])equivalentElements.ToArray(typeof(XmlSchemaElement)); } + [RequiresUnreferencedCode("calls ImportChoiceGroup")] private bool ImportSubstitutionGroupMember(XmlSchemaElement element, string identifier, CodeIdentifiers members, CodeIdentifiers membersScope, string? ns, bool repeats, ref bool needExplicitOrder, bool allowDuplicates) { XmlSchemaElement[] elements = GetEquivalentElements(element); @@ -1076,6 +1106,7 @@ namespace System.Xml.Serialization return true; } + [RequiresUnreferencedCode("calls ImportType")] private void ImportTextMember(CodeIdentifiers members, CodeIdentifiers membersScope, XmlQualifiedName? simpleContentType) { TypeMapping? mapping; @@ -1128,6 +1159,7 @@ namespace System.Xml.Serialization members.Add(member.Name, member); } + [RequiresUnreferencedCode("calls GetTypeDesc")] private MemberMapping ImportAnyMember(XmlSchemaAny any, string identifier, CodeIdentifiers members, CodeIdentifiers membersScope, INameScope elementsScope, string? ns, ref bool mixed, ref bool needExplicitOrder, bool allowDuplicates) { ElementAccessor[] accessors = ImportAny(any, !mixed, ns); @@ -1160,6 +1192,8 @@ namespace System.Xml.Serialization } return member; } + + [RequiresUnreferencedCode("calls GetTypeDesc")] private ElementAccessor[] ImportAny(XmlSchemaAny any, bool makeElement, string? targetNamespace) { SpecialMapping mapping = new SpecialMapping(); @@ -1205,6 +1239,7 @@ namespace System.Xml.Serialization return new ElementAccessor[] { anyAccessor }; } + [RequiresUnreferencedCode("calls ImportArrayMapping")] private ElementAccessor? ImportArray(XmlSchemaElement element, string identifier, string? ns, bool repeats) { if (repeats) return null; @@ -1223,6 +1258,7 @@ namespace System.Xml.Serialization return arrayAccessor; } + [RequiresUnreferencedCode("calls ImportChoiceGroup")] private ArrayMapping? ImportArrayMapping(XmlSchemaType type, string identifier, string? ns, bool repeats) { if (!(type is XmlSchemaComplexType)) return null; @@ -1327,6 +1363,7 @@ namespace System.Xml.Serialization return false; } + [RequiresUnreferencedCode("calls GetTypeDesc")] private SpecialMapping? ImportAnyMapping(XmlSchemaType? type, string identifier, string? ns, bool repeats) { if (type == null) return null; @@ -1373,6 +1410,7 @@ namespace System.Xml.Serialization return mapping; } + [RequiresUnreferencedCode("calls ImportSubstitutionGroupMember")] private void ImportElementMember(XmlSchemaElement element, string identifier, CodeIdentifiers members, CodeIdentifiers membersScope, INameScope elementsScope, string? ns, bool repeats, ref bool needExplicitOrder, bool allowDuplicates, bool allowUnboundedElements) { repeats = repeats | element.IsMultipleOccurrence; @@ -1429,6 +1467,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls ImportAttribute")] private void ImportAttributeMember(XmlSchemaAttribute attribute, string identifier, CodeIdentifiers members, CodeIdentifiers membersScope, string? ns) { AttributeAccessor? accessor = ImportAttribute(attribute, identifier, ns, attribute); @@ -1453,6 +1492,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls GetTypeDesc")] private void ImportAnyAttributeMember(XmlSchemaAnyAttribute any, CodeIdentifiers members, CodeIdentifiers membersScope) { SpecialMapping mapping = new SpecialMapping(); @@ -1509,6 +1549,7 @@ namespace System.Xml.Serialization return false; } + [RequiresUnreferencedCode("calls GetTypeDesc")] private void ImportXmlnsDeclarationsMember(XmlSchemaType type, CodeIdentifiers members, CodeIdentifiers membersScope) { string? xmlnsMemberName; @@ -1536,6 +1577,7 @@ namespace System.Xml.Serialization member.Ignore = true; } + [RequiresUnreferencedCode("calls ImportAnyAttributeMember")] private void ImportAttributeGroupMembers(XmlSchemaAttributeGroup group, string identifier, CodeIdentifiers members, CodeIdentifiers membersScope, string ns) { for (int i = 0; i < group.Attributes.Count; i++) @@ -1550,6 +1592,7 @@ namespace System.Xml.Serialization ImportAnyAttributeMember(group.AnyAttribute, members, membersScope); } + [RequiresUnreferencedCode("calls GetTypeDesc")] private AttributeAccessor ImportSpecialAttribute(XmlQualifiedName name, string identifier) { PrimitiveMapping mapping = new PrimitiveMapping(); @@ -1563,6 +1606,7 @@ namespace System.Xml.Serialization return accessor; } + [RequiresUnreferencedCode("calls ImportSpecialAttribute")] private AttributeAccessor? ImportAttribute(XmlSchemaAttribute attribute, string identifier, string? ns, XmlSchemaAttribute defaultValueProvider) { if (attribute.Use == XmlSchemaUse.Prohibited) return null; @@ -1626,6 +1670,7 @@ namespace System.Xml.Serialization return accessor; } + [RequiresUnreferencedCode("calls ImportStructDataType")] private TypeMapping? ImportDataType(XmlSchemaSimpleType dataType, string? typeNs, string identifier, Type? baseType, TypeFlags flags, bool isList) { if (baseType != null) @@ -1688,6 +1733,7 @@ namespace System.Xml.Serialization return ImportPrimitiveDataType(dataType, flags); } + [RequiresUnreferencedCode("calls FindType")] private TypeMapping? ImportEnumeratedDataType(XmlSchemaSimpleType dataType, string? typeNs, string identifier, TypeFlags flags, bool isList) { TypeMapping? mapping = (TypeMapping?)ImportedMappings[dataType]; @@ -1789,6 +1835,7 @@ namespace System.Xml.Serialization return enumMapping; } + [RequiresUnreferencedCode("calls GetDataTypeSource")] private PrimitiveMapping ImportPrimitiveDataType(XmlSchemaSimpleType dataType, TypeFlags flags) { TypeDesc sourceTypeDesc = GetDataTypeSource(dataType, flags); @@ -1855,6 +1902,7 @@ namespace System.Xml.Serialization return new XmlQualifiedName("string", XmlSchema.Namespace); } + [RequiresUnreferencedCode("calls FindDataType")] private TypeDesc GetDataTypeSource(XmlSchemaSimpleType dataType, TypeFlags flags) { TypeDesc? typeDesc = null; @@ -1872,6 +1920,7 @@ namespace System.Xml.Serialization return typeDesc; } + [RequiresUnreferencedCode("calls GetTypeDesc")] private XmlSchemaSimpleType? FindDataType(XmlQualifiedName? name, TypeFlags flags) { if (name == null || name.IsEmpty) @@ -1906,6 +1955,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls GetTypeDesc")] private XmlSchemaType? FindType(XmlQualifiedName? name, TypeFlags flags) { if (name == null || name.IsEmpty) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSchemas.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSchemas.cs index 78ea35d..fc48042 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSchemas.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSchemas.cs @@ -343,6 +343,7 @@ namespace System.Xml.Serialization return false; } + [RequiresUnreferencedCode("calls Merge")] private void Merge(XmlSchema schema) { if (MergedSchemas[schema] != null) @@ -382,6 +383,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("Calls MergeFailedMessage")] private void Merge(IList originals, XmlSchema schema) { foreach (XmlSchema s in originals) @@ -593,6 +595,7 @@ namespace System.Xml.Serialization return item; } + [RequiresUnreferencedCode("Creates XmlSerializer")] private static string Dump(XmlSchemaObject o) { XmlWriterSettings settings = new XmlWriterSettings(); @@ -606,6 +609,8 @@ namespace System.Xml.Serialization s.Serialize(xmlWriter, o, ns); return sw.ToString(); } + + [RequiresUnreferencedCode("calls Dump")] private static string MergeFailedMessage(XmlSchemaObject src, XmlSchemaObject dest, string? ns) { string err = SR.Format(SR.XmlSerializableMergeItem, ns, GetSchemaItem(src, ns, null)); @@ -640,6 +645,7 @@ namespace System.Xml.Serialization get { return _isCompiled; } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public void Compile(ValidationEventHandler? handler, bool fullCompile) { if (_isCompiled) @@ -779,6 +785,7 @@ namespace System.Xml.Serialization return schema; } + [RequiresUnreferencedCode("calls GenerateSchemaGraph")] internal void SetCache(SchemaObjectCache cache, bool shareTypes) { _shareTypes = shareTypes; diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationGeneratedCode.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationGeneratedCode.cs index 4874478..60b8eb8 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationGeneratedCode.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationGeneratedCode.cs @@ -11,6 +11,7 @@ namespace System.Xml.Serialization using System.Reflection; using System.Security; using System.Globalization; + using System.Diagnostics.CodeAnalysis; /// public abstract class XmlSerializationGeneratedCode @@ -39,6 +40,7 @@ namespace System.Xml.Serialization private int _references; private readonly Hashtable _generatedMethods = new Hashtable(); + [RequiresUnreferencedCode("Calls GetTypeDesc")] internal XmlSerializationCodeGen(IndentedWriter writer, TypeScope[] scopes, string access, string className) { _writer = writer; @@ -64,8 +66,10 @@ namespace System.Xml.Serialization internal Hashtable MethodNames { get { return _methodNames; } } internal Hashtable GeneratedMethods { get { return _generatedMethods; } } + [RequiresUnreferencedCode("calls WriteStructMethod")] internal virtual void GenerateMethod(TypeMapping mapping) { } + [RequiresUnreferencedCode("calls GenerateMethod")] internal void GenerateReferencedMethods() { while (_references > 0) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationILGen.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationILGen.cs index 6ff443e..dfee0a1 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationILGen.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationILGen.cs @@ -35,6 +35,7 @@ namespace System.Xml.Serialization protected TypeBuilder typeBuilder = null!; protected CodeGenerator ilg = null!; + [RequiresUnreferencedCode("Calls GetTypeDesc")] internal XmlSerializationILGen(TypeScope[] scopes, string access, string className) { _scopes = scopes; @@ -108,8 +109,10 @@ namespace System.Xml.Serialization System.Diagnostics.Debug.Assert(_methodBuilders.ContainsKey(methodName)); return _methodBuilders[methodName]; } + [RequiresUnreferencedCode("calls WriteStructMethod")] internal virtual void GenerateMethod(TypeMapping mapping) { } + [RequiresUnreferencedCode("calls GenerateMethod")] internal void GenerateReferencedMethods() { while (_references > 0) @@ -147,6 +150,7 @@ namespace System.Xml.Serialization return ReflectionAwareILGen.GetCSharpString(value); } + [RequiresUnreferencedCode("calls LoadMember")] internal FieldBuilder GenerateHashtableGetBegin(string privateName, string publicName, TypeBuilder serializerContractTypeBuilder) { FieldBuilder fieldBuilder = serializerContractTypeBuilder.DefineField( @@ -187,6 +191,7 @@ namespace System.Xml.Serialization return fieldBuilder; } + [RequiresUnreferencedCode("calls LoadMember")] internal void GenerateHashtableGetEnd(FieldBuilder fieldBuilder) { ilg!.Ldarg(0); @@ -208,6 +213,8 @@ namespace System.Xml.Serialization ilg.EndMethod(); } + + [RequiresUnreferencedCode("calls GenerateHashtableGetBegin")] internal FieldBuilder GeneratePublicMethods(string privateName, string publicName, string[] methods, XmlMapping[] xmlMappings, TypeBuilder serializerContractTypeBuilder) { FieldBuilder fieldBuilder = GenerateHashtableGetBegin(privateName, publicName, serializerContractTypeBuilder); @@ -268,6 +275,7 @@ namespace System.Xml.Serialization ilg.EndMethod(); } + [RequiresUnreferencedCode("Uses CreatedTypes Dictionary")] internal string GenerateBaseSerializer(string baseSerializer, string readerClass, string writerClass, CodeIdentifiers classes) { baseSerializer = CodeIdentifier.MakeValid(baseSerializer); @@ -313,6 +321,7 @@ namespace System.Xml.Serialization return baseSerializer; } + [RequiresUnreferencedCode("uses CreatedTypes dictionary")] internal string GenerateTypedSerializer(string readMethod, string writeMethod, XmlMapping mapping, CodeIdentifiers classes, string baseSerializer, string readerClass, string writerClass) { string serializerName = CodeIdentifier.MakeValid(Accessor.UnescapeName(mapping.Accessor.Mapping!.TypeDesc!.Name)); @@ -409,6 +418,7 @@ namespace System.Xml.Serialization return typedSerializerType.Name; } + [RequiresUnreferencedCode("calls GetConstructor")] private FieldBuilder GenerateTypedSerializers(Dictionary serializers, TypeBuilder serializerContractTypeBuilder) { string privateName = "typedSerializers"; @@ -435,6 +445,7 @@ namespace System.Xml.Serialization } //GenerateGetSerializer(serializers, xmlMappings); + [RequiresUnreferencedCode("Uses CreatedTypes Dictionary")] private void GenerateGetSerializer(Dictionary serializers, XmlMapping[] xmlMappings, TypeBuilder serializerContractTypeBuilder) { ilg = new CodeGenerator(serializerContractTypeBuilder); @@ -480,6 +491,7 @@ namespace System.Xml.Serialization ilg.EndMethod(); } + [RequiresUnreferencedCode("calls GenerateTypedSerializers")] internal void GenerateSerializerContract(string className, XmlMapping[] xmlMappings, Type[] types, string readerType, string[] readMethods, string writerType, string[] writerMethods, Dictionary serializers) { TypeBuilder serializerContractTypeBuilder = CodeGenerator.CreateTypeBuilder( @@ -572,10 +584,14 @@ namespace System.Xml.Serialization return ((SerializableMapping)mapping).IsAny; return mapping.TypeDesc!.CanBeElementValue; } + + [RequiresUnreferencedCode("calls ILGenLoad")] internal void ILGenLoad(string source) { ILGenLoad(source, null); } + + [RequiresUnreferencedCode("calls LoadMember")] internal void ILGenLoad(string source, Type? type) { if (source.StartsWith("o.@", StringComparison.Ordinal)) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReader.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReader.cs index 008643d..73e92ab 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReader.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReader.cs @@ -1557,6 +1557,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls GetArrayElementType")] private object? ReadArray(string? typeName, string? typeNs) { SoapArrayInfo arrayInfo; @@ -1756,8 +1757,10 @@ namespace System.Xml.Serialization return array; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected abstract void InitCallbacks(); + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected void ReadReferencedElements() { _r.MoveToContent(); @@ -1772,28 +1775,33 @@ namespace System.Xml.Serialization HandleUnreferencedObjects(); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected object? ReadReferencedElement() { return ReadReferencedElement(null, null); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected object? ReadReferencedElement(string? name, string? ns) { string? dummy; return ReadReferencingElement(name, ns, out dummy); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected object? ReadReferencingElement(out string? fixupReference) { return ReadReferencingElement(null, null, out fixupReference); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected object? ReadReferencingElement(string? name, string? ns, out string? fixupReference) { return ReadReferencingElement(name, ns, false, out fixupReference); } [MemberNotNull(nameof(_callbacks))] + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected object? ReadReferencingElement(string? name, string? ns, bool elementCanBeType, out string? fixupReference) { object? o = null; @@ -1832,6 +1840,7 @@ namespace System.Xml.Serialization } [MemberNotNull(nameof(_callbacks))] + [RequiresUnreferencedCode("calls InitCallbacks")] internal void EnsureCallbackTables() { if (_callbacks == null) @@ -2226,10 +2235,12 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("creates XmlSerializationCodeGen")] internal XmlSerializationReaderCodeGen(IndentedWriter writer, TypeScope[] scopes, string access, string className) : base(writer, scopes, access, className) { } + [RequiresUnreferencedCode("calls WriteReflectionInit")] internal void GenerateBegin() { Writer.Write(Access); @@ -2267,6 +2278,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteStructMethod")] internal override void GenerateMethod(TypeMapping mapping) { if (GeneratedMethods.Contains(mapping)) @@ -2287,6 +2299,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls GenerateReferencedMethods")] internal void GenerateEnd(string?[] methods, XmlMapping[] xmlMappings, Type?[]? types) { GenerateReferencedMethods(); diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReaderILGen.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReaderILGen.cs index feb269c..010d537 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReaderILGen.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReaderILGen.cs @@ -15,6 +15,7 @@ namespace System.Xml.Serialization using System.Xml; using System.Xml.Schema; using System.Xml.Extensions; + using System.Diagnostics.CodeAnalysis; internal sealed class XmlSerializationReaderILGen : XmlSerializationILGen { @@ -181,11 +182,13 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("Creates XmlSerializationILGen")] internal XmlSerializationReaderILGen(TypeScope[] scopes, string access, string className) : base(scopes, access, className) { } + [RequiresUnreferencedCode("calls WriteReflectionInit")] internal void GenerateBegin() { this.typeBuilder = CodeGenerator.CreateTypeBuilder( @@ -205,6 +208,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteStructMethod")] internal override void GenerateMethod(TypeMapping mapping) { if (!GeneratedMethods.Add(mapping)) @@ -224,6 +228,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls GenerateReferencedMethods")] internal void GenerateEnd(string[] methods, XmlMapping[] xmlMappings, Type[] types) { GenerateReferencedMethods(); @@ -266,6 +271,7 @@ namespace System.Xml.Serialization CreatedTypes.Add(readerType.Name, readerType); } + [RequiresUnreferencedCode("calls GenerateMembersElement")] internal string? GenerateElement(XmlMapping xmlMapping) { if (!xmlMapping.IsReadable) @@ -280,6 +286,7 @@ namespace System.Xml.Serialization throw new ArgumentException(SR.XmlInternalError, nameof(xmlMapping)); } + [RequiresUnreferencedCode("calls LoadMember")] private void WriteIsStartTag(string? name, string? ns) { WriteID(name); @@ -304,6 +311,7 @@ namespace System.Xml.Serialization ilg.If(); } + [RequiresUnreferencedCode("XmlSerializationReader methods have RequiresUnreferencedCode")] private void WriteUnknownNode(string func, string node, ElementAccessor? e, bool anyIfs) { if (anyIfs) @@ -350,6 +358,7 @@ namespace System.Xml.Serialization ilg.EndMethod(); } + [RequiresUnreferencedCode("calls GenerateLiteralMembersElement")] private string GenerateMembersElement(XmlMembersMapping xmlMembersMapping) { return GenerateLiteralMembersElement(xmlMembersMapping); @@ -384,6 +393,7 @@ namespace System.Xml.Serialization return RaCodeGen.GetStringForMember(parent, mapping.ChoiceIdentifier.MemberName, parentTypeDesc); } + [RequiresUnreferencedCode("calls InitializeValueTypes")] private string GenerateLiteralMembersElement(XmlMembersMapping xmlMembersMapping) { ElementAccessor element = xmlMembersMapping.Accessor; @@ -613,6 +623,7 @@ namespace System.Xml.Serialization return methodName; } + [RequiresUnreferencedCode("calls ILGenForCreateInstance")] private void InitializeValueTypes(string arrayName, MemberMapping[] mappings) { for (int i = 0; i < mappings.Length; i++) @@ -628,6 +639,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteMemberElements")] private string GenerateTypeElement(XmlTypeMapping xmlTypeMapping) { ElementAccessor element = xmlTypeMapping.Accessor; @@ -683,6 +695,7 @@ namespace System.Xml.Serialization return "id" + (++_nextIdNumber).ToString(CultureInfo.InvariantCulture) + "_" + CodeIdentifier.MakeValidInternal(name); } + [RequiresUnreferencedCode("XmlSerializationReader methods have RequiresUnreferencedCode")] private void WritePrimitive(TypeMapping mapping, string source) { System.Diagnostics.Debug.Assert(source == "Reader.ReadElementString()" || source == "Reader.ReadString()" @@ -943,6 +956,7 @@ namespace System.Xml.Serialization return uniqueName; } + [RequiresUnreferencedCode("calls LoadMember")] private string WriteHashtable(EnumMapping mapping, string typeName, out MethodBuilder? get_TableName) { get_TableName = null; @@ -1020,6 +1034,7 @@ namespace System.Xml.Serialization return propName; } + [RequiresUnreferencedCode("calls WriteHashtable")] private void WriteEnumMethod(EnumMapping mapping) { MethodBuilder? get_TableName = null; @@ -1136,6 +1151,7 @@ namespace System.Xml.Serialization ilg.EndMethod(); } + [RequiresUnreferencedCode("calls WriteQNameEqual")] private void WriteDerivedTypes(StructMapping mapping, bool isTypedReturn, string returnTypeName) { for (StructMapping? derived = mapping.DerivedMappings; derived != null; derived = derived.NextDerivedMapping) @@ -1175,6 +1191,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls ILGenForCreateInstance")] private void WriteEnumAndArrayTypes() { foreach (TypeScope scope in Scopes) @@ -1281,6 +1298,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteElement")] private void WriteNullableMethod(NullableMapping nullableMapping) { string? methodName; @@ -1326,11 +1344,13 @@ namespace System.Xml.Serialization ilg.EndMethod(); } + [RequiresUnreferencedCode("calls WriteLiteralStructMethod")] private void WriteStructMethod(StructMapping structMapping) { WriteLiteralStructMethod(structMapping); } + [RequiresUnreferencedCode("calls WriteEnumAndArrayTypes")] private void WriteLiteralStructMethod(StructMapping structMapping) { string? methodName; @@ -1701,6 +1721,7 @@ namespace System.Xml.Serialization ilg.EndMethod(); } + [RequiresUnreferencedCode("calls LoadMember")] private void WriteQNameEqual(string source, string? name, string? ns) { WriteID(name); @@ -1736,10 +1757,12 @@ namespace System.Xml.Serialization ilg.MarkLabel(labelEnd); } + [RequiresUnreferencedCode("XmlSerializationReader methods have RequiresUnreferencedCode")] private void WriteXmlNodeEqual(string source, string name, string? ns) { WriteXmlNodeEqual(source, name, ns, true); } + [RequiresUnreferencedCode("XmlSerializationReader methods have RequiresUnreferencedCode")] private void WriteXmlNodeEqual(string source, string name, string? ns, bool doAndIf) { bool isNameNullOrEmpty = string.IsNullOrEmpty(name); @@ -1814,6 +1837,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteSourceEnd")] private void WriteAttributes(Member[] members, Member? anyAttribute, string elseCall, LocalBuilder firstParam) { int count = 0; @@ -2044,6 +2068,7 @@ namespace System.Xml.Serialization ilg.WhileEnd(); } + [RequiresUnreferencedCode("calls WriteSourceEnd")] private void WriteAttribute(Member member) { AttributeAccessor attribute = member.Mapping.Attribute!; @@ -2136,6 +2161,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls ILGenForCreateInstance")] private void WriteMemberBegin(Member[] members) { for (int i = 0; i < members.Length; i++) @@ -2242,6 +2268,7 @@ namespace System.Xml.Serialization return ReflectionAwareILGen.GetQuotedCSharpString(qnames); } + [RequiresUnreferencedCode("calls WriteMemberElementsIf")] private void WriteMemberElements(Member[] members, string elementElseString, string elseString, Member? anyElement, Member? anyText) { if (anyText != null) @@ -2277,6 +2304,7 @@ namespace System.Xml.Serialization ilg.EndIf(); } + [RequiresUnreferencedCode("calls WriteText")] private void WriteMemberText(Member anyText, string elseString) { ilg.InitElseIf(); @@ -2328,6 +2356,7 @@ namespace System.Xml.Serialization Debug.Assert(anyText != null); } + [RequiresUnreferencedCode("calls WriteSourceEnd")] private void WriteText(Member member) { TextAccessor text = member.Mapping.Text!; @@ -2435,7 +2464,7 @@ namespace System.Xml.Serialization } } - + [RequiresUnreferencedCode("calls WriteElement")] private void WriteMemberElementsElse(Member? anyElement, string elementElseString) { if (anyElement != null) @@ -2466,6 +2495,8 @@ namespace System.Xml.Serialization } return false; } + + [RequiresUnreferencedCode("calls WriteElement")] private void WriteMemberElementsIf(Member[] members, Member? anyElement, string elementElseString) { int count = 0; @@ -2630,12 +2661,13 @@ namespace System.Xml.Serialization } } - + [RequiresUnreferencedCode("calls WriteMemberEnd")] private void WriteMemberEnd(Member[] members) { WriteMemberEnd(members, false); } + [RequiresUnreferencedCode("calls WriteSourceEnd")] private void WriteMemberEnd(Member[] members, bool soapRefs) { for (int i = 0; i < members.Length; i++) @@ -2780,10 +2812,12 @@ namespace System.Xml.Serialization throw Globals.NotSupported("Unexpected: " + source); } + [RequiresUnreferencedCode("calls WriteSourceEnd")] private void WriteSourceEnd(string source, Type elementType) { WriteSourceEnd(source, elementType, elementType); } + [RequiresUnreferencedCode("string-based IL generation")] private void WriteSourceEnd(string source, Type elementType, Type stackType) { object? variable; @@ -2864,6 +2898,7 @@ namespace System.Xml.Serialization throw Globals.NotSupported("Unexpected: " + source); } + [RequiresUnreferencedCode("calls WriteMemberBegin")] private void WriteArray(string source, string? arrayName, ArrayMapping arrayMapping, bool readOnly, bool isNullable, int fixupIndex, int elementIndex) { MethodInfo XmlSerializationReader_ReadNull = typeof(XmlSerializationReader).GetMethod( @@ -2976,6 +3011,7 @@ namespace System.Xml.Serialization ilg.EndIf(); } + [RequiresUnreferencedCode("calls ILGenForCreateInstance")] private void WriteElement(string source, string? arrayName, string? choiceSource, ElementAccessor element, ChoiceIdentifierAccessor? choice, string? checkSpecified, bool checkForNull, bool readOnly, int fixupIndex, int elementIndex) { if (checkSpecified != null && checkSpecified.Length > 0) @@ -3285,6 +3321,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls ILGenForCreateInstance")] private void WriteDerivedSerializable(SerializableMapping head, SerializableMapping? mapping, string source, bool isWrappedAny) { if (mapping == null) @@ -3432,6 +3469,7 @@ namespace System.Xml.Serialization ilg.Stloc(paramsRead); } + [RequiresUnreferencedCode("calls ILGenForCreateInstance")] private void WriteCreateMapping(TypeMapping mapping, string local) { string fullTypeName = mapping.TypeDesc!.CSharpName; @@ -3482,14 +3520,19 @@ namespace System.Xml.Serialization ilg.Pop(); } + [RequiresUnreferencedCode("calls WriteArrayLocalDecl")] private void WriteArrayLocalDecl(string typeName, string variableName, string initValue, TypeDesc arrayTypeDesc) { RaCodeGen.WriteArrayLocalDecl(typeName, variableName, new SourceInfo(initValue, initValue, null, arrayTypeDesc.Type, ilg), arrayTypeDesc); } + + [RequiresUnreferencedCode("calls WriteCreateInstance")] private void WriteCreateInstance(string source, bool ctorInaccessible, Type type) { RaCodeGen.WriteCreateInstance(source, ctorInaccessible, type, ilg); } + + [RequiresUnreferencedCode("calls WriteLocalDecl")] private void WriteLocalDecl(string variableName, SourceInfo initValue) { RaCodeGen.WriteLocalDecl(variableName, initValue); @@ -3600,6 +3643,8 @@ namespace System.Xml.Serialization } throw Globals.NotSupported("Unexpected: " + elementElseString); } + + [RequiresUnreferencedCode("calls WriteSourceEnd")] private void ILGenSet(string source, object value) { WriteSourceBegin(source); diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationWriter.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationWriter.cs index 0a975b1..35bda1c 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationWriter.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationWriter.cs @@ -174,11 +174,13 @@ namespace System.Xml.Serialization WriteAttribute("type", XmlSchema.InstanceNamespace, GetQualifiedName(name, ns)); } + [RequiresUnreferencedCode("calls GetPrimitiveTypeName")] private XmlQualifiedName GetPrimitiveTypeName(Type type) { return GetPrimitiveTypeName(type, true)!; } + [RequiresUnreferencedCode("calls CreateUnknownTypeException")] private XmlQualifiedName? GetPrimitiveTypeName(Type type, bool throwIfUnknown) { XmlQualifiedName? qname = GetPrimitiveTypeNameInternal(type); @@ -236,6 +238,7 @@ namespace System.Xml.Serialization return new XmlQualifiedName(typeName, typeNs); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected void WriteTypedPrimitive(string? name, string? ns, object o, bool xsiType) { string? value = null; @@ -770,11 +773,13 @@ namespace System.Xml.Serialization _w.WriteEndElement(); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected Exception CreateUnknownTypeException(object o) { return CreateUnknownTypeException(o.GetType()); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected Exception CreateUnknownTypeException(Type type) { if (typeof(IXmlSerializable).IsAssignableFrom(type)) return new InvalidOperationException(SR.Format(SR.XmlInvalidSerializable, type.FullName)); @@ -1145,6 +1150,7 @@ namespace System.Xml.Serialization _typeEntries![type] = entry; } + [RequiresUnreferencedCode("calls GetArrayElementType")] private void WriteArray(string name, string? ns, object o, Type type) { Type elementType = TypeScope.GetArrayElementType(type, null)!; @@ -1269,21 +1275,25 @@ namespace System.Xml.Serialization } _w.WriteEndElement(); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected void WritePotentiallyReferencingElement(string? n, string? ns, object? o) { WritePotentiallyReferencingElement(n, ns, o, null, false, false); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected void WritePotentiallyReferencingElement(string? n, string? ns, object? o, Type? ambientType) { WritePotentiallyReferencingElement(n, ns, o, ambientType, false, false); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected void WritePotentiallyReferencingElement(string n, string? ns, object? o, Type? ambientType, bool suppressReference) { WritePotentiallyReferencingElement(n, ns, o, ambientType, suppressReference, false); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected void WritePotentiallyReferencingElement(string? n, string? ns, object? o, Type? ambientType, bool suppressReference, bool isNullable) { if (o == null) @@ -1332,12 +1342,13 @@ namespace System.Xml.Serialization } } - + [RequiresUnreferencedCode("calls WriteReferencedElement")] private void WriteReferencedElement(object o, Type? ambientType) { WriteReferencedElement(null, null, o, ambientType); } + [RequiresUnreferencedCode("calls WriteArray")] private void WriteReferencedElement(string? name, string? ns, object o, Type? ambientType) { if (name == null) name = string.Empty; @@ -1358,6 +1369,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls InitCallbacks")] private TypeEntry? GetTypeEntry(Type t) { if (_typeEntries == null) @@ -1368,8 +1380,10 @@ namespace System.Xml.Serialization return (TypeEntry?)_typeEntries[t]; } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected abstract void InitCallbacks(); + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] protected void WriteReferencedElements() { if (_referencesToWrite == null) return; @@ -1559,6 +1573,7 @@ namespace System.Xml.Serialization _writer = writer; } + [RequiresUnreferencedCode("calls GetTypeDesc")] internal void WriteReflectionInit(TypeScope scope) { foreach (Type type in scope.Types) @@ -1569,6 +1584,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] private string WriteTypeInfo(TypeScope scope, TypeDesc typeDesc, Type type) { InitTheFirstTime(); @@ -1643,7 +1659,8 @@ namespace System.Xml.Serialization } } - private void WriteMappingInfo(TypeMapping mapping, string typeVariable, Type type) + private void WriteMappingInfo(TypeMapping mapping, string typeVariable, + [DynamicallyAccessedMembers(TrimmerConstants.PublicMembers)] Type type) { string typeFullName = mapping.TypeDesc!.CSharpName; if (mapping is StructMapping) @@ -1679,7 +1696,8 @@ namespace System.Xml.Serialization } } } - private void WriteCollectionInfo(string typeVariable, TypeDesc typeDesc, Type type) + private void WriteCollectionInfo(string typeVariable, TypeDesc typeDesc, + [DynamicallyAccessedMembers(TrimmerConstants.PublicMembers)] Type type) { string typeFullName = CodeIdentifier.GetCSharpName(type); string elementTypeFullName = typeDesc.ArrayElementTypeDesc!.CSharpName; @@ -1720,7 +1738,8 @@ namespace System.Xml.Serialization return assemblyVariable; } - private string WriteMemberInfo(Type type, string escapedName, string typeVariable, string memberName) + private string WriteMemberInfo( + [DynamicallyAccessedMembers(TrimmerConstants.PublicMembers)] Type type, string escapedName, string typeVariable, string memberName) { MemberInfo[] memberInfos = type.GetMember(memberName); for (int i = 0; i < memberInfos.Length; i++) @@ -1781,7 +1800,8 @@ namespace System.Xml.Serialization return methodVariable; } - private string WriteDefaultIndexerInit(Type type, string escapedName, bool collectionUseReflection, bool elementUseReflection) + private string WriteDefaultIndexerInit( + [DynamicallyAccessedMembers(TrimmerConstants.PublicMembers)] Type type, string escapedName, bool collectionUseReflection, bool elementUseReflection) { string itemVariable = GenerateVariableName("item", escapedName); PropertyInfo defaultIndexer = TypeScope.GetDefaultIndexer(type, null); @@ -2189,10 +2209,12 @@ namespace System.Xml.Serialization internal sealed class XmlSerializationWriterCodeGen : XmlSerializationCodeGen { + [RequiresUnreferencedCode("creates XmlSerializationCodeGen")] internal XmlSerializationWriterCodeGen(IndentedWriter writer, TypeScope[] scopes, string access, string className) : base(writer, scopes, access, className) { } + [RequiresUnreferencedCode("calls WriteStructMethod")] internal void GenerateBegin() { Writer.Write(Access); @@ -2232,6 +2254,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteStructMethod")] internal override void GenerateMethod(TypeMapping mapping) { if (GeneratedMethods.Contains(mapping)) @@ -2247,6 +2270,8 @@ namespace System.Xml.Serialization WriteEnumMethod((EnumMapping)mapping); } } + + [RequiresUnreferencedCode("calls GenerateReferencedMethods")] internal void GenerateEnd() { GenerateReferencedMethods(); @@ -2255,6 +2280,7 @@ namespace System.Xml.Serialization Writer.WriteLine("}"); } + [RequiresUnreferencedCode("calls GenerateMembersElement")] internal string? GenerateElement(XmlMapping xmlMapping) { if (!xmlMapping.IsWriteable) @@ -2303,6 +2329,7 @@ namespace System.Xml.Serialization Writer.WriteLine("}"); } + [RequiresUnreferencedCode("calls WriteCheckDefault")] private void WriteQualifiedNameElement(string name, string? ns, object? defaultValue, string source, bool nullable, bool IsSoap, TypeMapping mapping) { bool hasDefault = defaultValue != null && defaultValue != DBNull.Value; @@ -2385,6 +2412,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteCheckDefault")] private void WritePrimitive(string method, string name, string? ns, object? defaultValue, string source, TypeMapping mapping, bool writeXsiType, bool isElement, bool isNullable) { TypeDesc typeDesc = mapping.TypeDesc!; @@ -2540,6 +2568,7 @@ namespace System.Xml.Serialization WriteTag("WriteEmptyTag", name, ns); } + [RequiresUnreferencedCode("calls WriteMember")] private string GenerateMembersElement(XmlMembersMapping xmlMembersMapping) { ElementAccessor element = xmlMembersMapping.Accessor; @@ -2749,6 +2778,7 @@ namespace System.Xml.Serialization return methodName; } + [RequiresUnreferencedCode("calls WriteMember")] private string GenerateTypeElement(XmlTypeMapping xmlTypeMapping) { ElementAccessor element = xmlTypeMapping.Accessor; @@ -2943,6 +2973,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteMember")] private void WriteEnumAndArrayTypes() { foreach (TypeScope scope in Scopes) @@ -3011,6 +3042,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteMember")] private void WriteStructMethod(StructMapping mapping) { if (mapping.IsSoap && mapping.TypeDesc!.IsRoot) return; @@ -3222,6 +3254,7 @@ namespace System.Xml.Serialization return (listElementTypeDesc != null && listElementTypeDesc != QnameTypeDesc); } + [RequiresUnreferencedCode("calls WriteAttribute")] private void WriteMember(string source, AttributeAccessor attribute, TypeDesc memberTypeDesc, string parent) { if (memberTypeDesc.IsAbstract) return; @@ -3393,6 +3426,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WritePrimitive")] private void WriteAttribute(string source, AttributeAccessor attribute, string parent) { if (attribute.Mapping is SpecialMapping) @@ -3417,6 +3451,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteElements")] private void WriteMember(string source, string? choiceSource, ElementAccessor[] elements, TextAccessor? text, ChoiceIdentifierAccessor? choice, TypeDesc memberTypeDesc, bool writeAccessors) { if (memberTypeDesc.IsArrayLike && @@ -3426,7 +3461,7 @@ namespace System.Xml.Serialization WriteElements(source, choiceSource, elements, text, choice, "a", writeAccessors, memberTypeDesc.IsNullable); } - + [RequiresUnreferencedCode("calls WriteArrayItems")] private void WriteArray(string source, string? choiceSource, ElementAccessor[] elements, TextAccessor? text, ChoiceIdentifierAccessor? choice, TypeDesc arrayTypeDesc) { if (elements.Length == 0 && text == null) return; @@ -3466,6 +3501,7 @@ namespace System.Xml.Serialization Writer.WriteLine("}"); } + [RequiresUnreferencedCode("calls WriteElements")] private void WriteArrayItems(ElementAccessor[] elements, TextAccessor? text, ChoiceIdentifierAccessor? choice, TypeDesc arrayTypeDesc, string arrayName, string? choiceName) { TypeDesc arrayElementTypeDesc = arrayTypeDesc.ArrayElementTypeDesc!; @@ -3567,11 +3603,13 @@ namespace System.Xml.Serialization Writer.WriteLine("}"); } + [RequiresUnreferencedCode("calls WriteElements")] private void WriteElements(string source, ElementAccessor[] elements, TextAccessor? text, ChoiceIdentifierAccessor? choice, string arrayName, bool writeAccessors, bool isNullable) { WriteElements(source, null, elements, text, choice, arrayName, writeAccessors, isNullable); } + [RequiresUnreferencedCode("calls WriteElement")] private void WriteElements(string source, string? enumSource, ElementAccessor[] elements, TextAccessor? text, ChoiceIdentifierAccessor? choice, string arrayName, bool writeAccessors, bool isNullable) { if (elements.Length == 0 && text == null) return; @@ -3837,6 +3875,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WritePrimitive")] private void WriteElement(string source, ElementAccessor element, string arrayName, bool writeAccessor) { string name = writeAccessor ? element.Name : element.Mapping!.TypeName!; @@ -4125,6 +4164,7 @@ namespace System.Xml.Serialization Writer.WriteLine(");"); } + [RequiresUnreferencedCode("calls GetType")] private void WriteCheckDefault(TypeMapping mapping, string source, object value, bool isNullable) { Writer.Write("if ("); diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationWriterILGen.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationWriterILGen.cs index b8e1251..46eda85 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationWriterILGen.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationWriterILGen.cs @@ -17,11 +17,13 @@ namespace System.Xml.Serialization { internal sealed class XmlSerializationWriterILGen : XmlSerializationILGen { + [RequiresUnreferencedCode("creates XmlSerializationILGen")] internal XmlSerializationWriterILGen(TypeScope[] scopes, string access, string className) : base(scopes, access, className) { } + [RequiresUnreferencedCode("calls WriteReflectionInit")] internal void GenerateBegin() { this.typeBuilder = CodeGenerator.CreateTypeBuilder( @@ -44,6 +46,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteStructMethod")] internal override void GenerateMethod(TypeMapping mapping) { if (!GeneratedMethods.Add(mapping)) @@ -58,6 +61,8 @@ namespace System.Xml.Serialization WriteEnumMethod((EnumMapping)mapping); } } + + [RequiresUnreferencedCode("calls GenerateReferencedMethods")] internal Type GenerateEnd() { GenerateReferencedMethods(); @@ -67,6 +72,7 @@ namespace System.Xml.Serialization return this.typeBuilder.CreateTypeInfo()!.AsType(); } + [RequiresUnreferencedCode("calls GenerateTypeElement")] internal string? GenerateElement(XmlMapping xmlMapping) { if (!xmlMapping.IsWriteable) @@ -89,6 +95,7 @@ namespace System.Xml.Serialization ilg.EndMethod(); } + [RequiresUnreferencedCode("calls Load")] private void WriteQualifiedNameElement(string name, string? ns, object? defaultValue, SourceInfo source, bool nullable, TypeMapping mapping) { bool hasDefault = defaultValue != null && defaultValue != DBNull.Value; @@ -121,6 +128,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls Load")] private void WriteEnumValue(EnumMapping mapping, SourceInfo source, out Type returnType) { string? methodName = ReferenceMapping(mapping); @@ -143,6 +151,7 @@ namespace System.Xml.Serialization returnType = typeof(string); } + [RequiresUnreferencedCode("calls Load")] private void WritePrimitiveValue(TypeDesc typeDesc, SourceInfo source, out Type returnType) { if (typeDesc == StringTypeDesc || typeDesc.FormatterName == "String") @@ -191,6 +200,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("Calls WriteCheckDefault")] private void WritePrimitive(string method, string name, string? ns, object? defaultValue, SourceInfo source, TypeMapping mapping, bool writeXsiType, bool isElement, bool isNullable) { TypeDesc typeDesc = mapping.TypeDesc!; @@ -277,6 +287,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("XmlSerializationWriter methods have RequiresUnreferencedCode")] private void WriteTag(string methodName, string name, string? ns) { MethodInfo XmlSerializationWriter_Method = typeof(XmlSerializationWriter).GetMethod( @@ -290,6 +301,7 @@ namespace System.Xml.Serialization ilg.Call(XmlSerializationWriter_Method); } + [RequiresUnreferencedCode("XmlSerializationWriter methods have RequiresUnreferencedCode")] private void WriteTag(string methodName, string name, string? ns, bool writePrefixed) { MethodInfo XmlSerializationWriter_Method = typeof(XmlSerializationWriter).GetMethod( @@ -305,6 +317,7 @@ namespace System.Xml.Serialization ilg.Call(XmlSerializationWriter_Method); } + [RequiresUnreferencedCode("calls WriteTag")] private void WriteStartElement(string name, string? ns, bool writePrefixed) { WriteTag("WriteStartElement", name, ns, writePrefixed); @@ -334,16 +347,19 @@ namespace System.Xml.Serialization ilg.Call(XmlSerializationWriter_WriteEndElement); } + [RequiresUnreferencedCode("calls WriteTag")] private void WriteLiteralNullTag(string name, string? ns) { WriteTag("WriteNullTagLiteral", name, ns); } + [RequiresUnreferencedCode("calls WriteTag")] private void WriteEmptyTag(string name, string? ns) { WriteTag("WriteEmptyTag", name, ns); } + [RequiresUnreferencedCode("calls WriteMember")] private string GenerateMembersElement(XmlMembersMapping xmlMembersMapping) { ElementAccessor element = xmlMembersMapping.Accessor; @@ -537,6 +553,7 @@ namespace System.Xml.Serialization return methodName; } + [RequiresUnreferencedCode("calls WriteMember")] private string GenerateTypeElement(XmlTypeMapping xmlTypeMapping) { ElementAccessor element = xmlTypeMapping.Accessor; @@ -776,6 +793,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteMember")] private void WriteEnumAndArrayTypes() { foreach (TypeScope scope in Scopes) @@ -904,6 +922,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("Calls WriteMember")] private void WriteStructMethod(StructMapping mapping) { string? methodName; @@ -1147,6 +1166,7 @@ namespace System.Xml.Serialization return (listElementTypeDesc != null && listElementTypeDesc != QnameTypeDesc); } + [RequiresUnreferencedCode("calls WriteAttribute")] private void WriteMember(SourceInfo source, AttributeAccessor attribute, TypeDesc memberTypeDesc, string parent) { if (memberTypeDesc.IsAbstract) return; @@ -1348,6 +1368,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WritePrimitive")] private void WriteAttribute(SourceInfo source, AttributeAccessor attribute, string parent) { if (attribute.Mapping is SpecialMapping) @@ -1378,7 +1399,10 @@ namespace System.Xml.Serialization } } - private static object? GetConvertedDefaultValue(Type? targetType, object? rawDefaultValue) + private static object? GetConvertedDefaultValue( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] + Type? targetType, + object? rawDefaultValue) { if (targetType == null) { @@ -1394,6 +1418,7 @@ namespace System.Xml.Serialization return convertedDefaultValue; } + [RequiresUnreferencedCode("Calls WriteElements")] private void WriteMember(SourceInfo source, string? choiceSource, ElementAccessor[] elements, TextAccessor? text, ChoiceIdentifierAccessor? choice, TypeDesc memberTypeDesc, bool writeAccessors) { if (memberTypeDesc.IsArrayLike && @@ -1404,7 +1429,7 @@ namespace System.Xml.Serialization WriteElements(source, choiceSource, elements, text, choice, "a" + memberTypeDesc.Name, writeAccessors, memberTypeDesc.IsNullable); } - + [RequiresUnreferencedCode("calls WriteArrayItems")] private void WriteArray(SourceInfo source, string? choiceSource, ElementAccessor[] elements, TextAccessor? text, ChoiceIdentifierAccessor? choice, TypeDesc arrayTypeDesc) { if (elements.Length == 0 && text == null) return; @@ -1463,6 +1488,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls WriteElements")] private void WriteArrayItems(ElementAccessor[] elements, TextAccessor? text, ChoiceIdentifierAccessor? choice, TypeDesc arrayTypeDesc, string arrayName, string? choiceName) { TypeDesc arrayElementTypeDesc = arrayTypeDesc.ArrayElementTypeDesc!; @@ -1552,6 +1578,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("Calls WriteElement")] private void WriteElements(SourceInfo source, string? enumSource, ElementAccessor[] elements, TextAccessor? text, ChoiceIdentifierAccessor? choice, string arrayName, bool writeAccessors, bool isNullable) { if (elements.Length == 0 && text == null) return; @@ -1834,6 +1861,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls Load")] private void WriteText(SourceInfo source, TextAccessor text) { if (text.Mapping is PrimitiveMapping) @@ -1883,6 +1911,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("Calls WriteCheckDefault")] private void WriteElement(SourceInfo source, ElementAccessor element, string arrayName, bool writeAccessor) { string name = writeAccessor ? element.Name : element.Mapping!.TypeName!; @@ -2053,6 +2082,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("XmlSerializationWriter methods have RequiresUnreferencedCode")] private void WriteElementCall(string func, Type cast, SourceInfo source, string? name, string? ns, bool isNullable, bool isAny) { MethodInfo XmlSerializationWriter_func = typeof(XmlSerializationWriter).GetMethod( @@ -2069,6 +2099,7 @@ namespace System.Xml.Serialization ilg.Call(XmlSerializationWriter_func); } + [RequiresUnreferencedCode("Dynamically looks for '!=' operator on 'value' parameter")] private void WriteCheckDefault(SourceInfo source, object value, bool isNullable) { if (value is string && ((string)value).Length == 0) @@ -2140,6 +2171,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls Load")] private void WriteChoiceTypeCheck(SourceInfo source, string fullTypeName, ChoiceIdentifierAccessor choice, string enumName, TypeDesc typeDesc) { Label labelFalse = ilg.DefineLabel(); @@ -2170,6 +2202,7 @@ namespace System.Xml.Serialization ilg.EndIf(); } + [RequiresUnreferencedCode("calls WriteLiteralNullTag")] private void WriteNullCheckBegin(string source, ElementAccessor element) { LocalBuilder local = ilg.GetLocal(source); @@ -2181,7 +2214,7 @@ namespace System.Xml.Serialization ilg.Else(); } - + [RequiresUnreferencedCode("calls ILGenLoad")] private void WriteNamespaces(string source) { MethodInfo XmlSerializationWriter_WriteNamespaceDeclarations = typeof(XmlSerializationWriter).GetMethod( @@ -2205,12 +2238,13 @@ namespace System.Xml.Serialization return -1; } - + [RequiresUnreferencedCode("calls WriteLocalDecl")] private void WriteLocalDecl(string variableName, string initValue, Type type) { RaCodeGen.WriteLocalDecl(variableName, new SourceInfo(initValue, initValue, null, type, ilg)); } + [RequiresUnreferencedCode("calls WriteArrayLocalDecl")] private void WriteArrayLocalDecl(string typeName, string variableName, SourceInfo initValue, TypeDesc arrayTypeDesc) { RaCodeGen.WriteArrayLocalDecl(typeName, variableName, initValue, arrayTypeDesc); @@ -2219,6 +2253,8 @@ namespace System.Xml.Serialization { RaCodeGen.WriteTypeCompare(variable, type, ilg); } + + [RequiresUnreferencedCode("calls WriteInstanceOf")] private void WriteInstanceOf(SourceInfo source, Type type) { RaCodeGen.WriteInstanceOf(source, type, ilg); @@ -2297,6 +2333,7 @@ namespace System.Xml.Serialization // ---------------------------------------------------------------------------------- internal ReflectionAwareILGen() { } + [RequiresUnreferencedCode("calls GetTypeDesc")] internal void WriteReflectionInit(TypeScope scope) { foreach (Type type in scope.Types) @@ -2345,6 +2382,8 @@ namespace System.Xml.Serialization { return obj + "." + memberName + "("; } + + [RequiresUnreferencedCode("calls ILGenForCreateInstance")] internal void ILGenForCreateInstance(CodeGenerator ilg, Type type, bool ctorInaccessible, bool cast) { if (!ctorInaccessible) @@ -2368,6 +2407,7 @@ namespace System.Xml.Serialization ILGenForCreateInstance(ilg, type, cast ? type : null, ctorInaccessible); } + [RequiresUnreferencedCode("calls GetType")] internal void ILGenForCreateInstance(CodeGenerator ilg, Type type, Type? cast, bool nonPublic) { // Special case DBNull @@ -2476,6 +2516,7 @@ namespace System.Xml.Serialization ilg.ConvertValue(Activator_CreateInstance.ReturnType, cast); } + [RequiresUnreferencedCode("calls LoadMember")] internal void WriteLocalDecl(string variableName, SourceInfo initValue) { Type localType = initValue.Type!; @@ -2517,12 +2558,15 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls ILGenForCreateInstance")] internal void WriteCreateInstance(string source, bool ctorInaccessible, Type type, CodeGenerator ilg) { LocalBuilder sLoc = ilg.DeclareOrGetLocal(type, source); ILGenForCreateInstance(ilg, type, ctorInaccessible, ctorInaccessible); ilg.Stloc(sLoc); } + + [RequiresUnreferencedCode("calls Load")] internal void WriteInstanceOf(SourceInfo source, Type type, CodeGenerator ilg) { { @@ -2534,6 +2578,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls Load")] internal void WriteArrayLocalDecl(string typeName, string variableName, SourceInfo initValue, TypeDesc arrayTypeDesc) { Debug.Assert(typeName == arrayTypeDesc.CSharpName || typeName == arrayTypeDesc.CSharpName + "[]"); diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializer.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializer.cs index 41d0d4f..2e6ecc3 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializer.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializer.cs @@ -150,29 +150,38 @@ namespace System.Xml.Serialization } } + // Trimmer warning messages + internal const string TrimSerializationWarning = "Members from serialized types may be trimmed if not referenced directly"; + private const string TrimDeserializationWarning = "Members from deserialized types may be trimmed if not referenced directly"; + private static readonly Dictionary> s_xmlSerializerTable = new Dictionary>(); protected XmlSerializer() { } + [RequiresUnreferencedCode(TrimSerializationWarning)] public XmlSerializer(Type type, XmlAttributeOverrides? overrides, Type[]? extraTypes, XmlRootAttribute? root, string? defaultNamespace) : this(type, overrides, extraTypes, root, defaultNamespace, null) { } + [RequiresUnreferencedCode(TrimSerializationWarning)] public XmlSerializer(Type type, XmlRootAttribute? root) : this(type, null, Type.EmptyTypes, root, null, null) { } + [RequiresUnreferencedCode(TrimSerializationWarning)] public XmlSerializer(Type type, Type[]? extraTypes) : this(type, null, extraTypes, null, null, null) { } + [RequiresUnreferencedCode(TrimSerializationWarning)] public XmlSerializer(Type type, XmlAttributeOverrides? overrides) : this(type, overrides, Type.EmptyTypes, null, null, null) { } + [RequiresUnreferencedCode(TrimSerializationWarning)] public XmlSerializer(XmlTypeMapping xmlTypeMapping) { if (xmlTypeMapping == null) @@ -182,10 +191,12 @@ namespace System.Xml.Serialization _mapping = xmlTypeMapping; } + [RequiresUnreferencedCode(TrimSerializationWarning)] public XmlSerializer(Type type) : this(type, (string?)null) { } + [RequiresUnreferencedCode(TrimSerializationWarning)] public XmlSerializer(Type type, string? defaultNamespace) { if (type == null) @@ -243,6 +254,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(TrimSerializationWarning)] public XmlSerializer(Type type, XmlAttributeOverrides? overrides, Type[]? extraTypes, XmlRootAttribute? root, string? defaultNamespace, string? location) { if (type == null) @@ -254,6 +266,7 @@ namespace System.Xml.Serialization _tempAssembly = GenerateTempAssembly(_mapping, type, defaultNamespace, location); } + [RequiresUnreferencedCode("calls ImportTypeMapping")] private XmlTypeMapping GenerateXmlTypeMapping(Type type, XmlAttributeOverrides? overrides, Type[]? extraTypes, XmlRootAttribute? root, string? defaultNamespace) { XmlReflectionImporter importer = new XmlReflectionImporter(overrides, defaultNamespace); @@ -266,16 +279,19 @@ namespace System.Xml.Serialization return importer.ImportTypeMapping(type, root, defaultNamespace); } + [RequiresUnreferencedCode("creates TempAssembly")] internal static TempAssembly? GenerateTempAssembly(XmlMapping xmlMapping) { return GenerateTempAssembly(xmlMapping, null, null); } + [RequiresUnreferencedCode("creates TempAssembly")] internal static TempAssembly? GenerateTempAssembly(XmlMapping xmlMapping, Type? type, string? defaultNamespace) { return GenerateTempAssembly(xmlMapping, type, defaultNamespace, null); } + [RequiresUnreferencedCode("creates TempAssembly")] internal static TempAssembly? GenerateTempAssembly(XmlMapping xmlMapping, Type? type, string? defaultNamespace, string? location) { if (xmlMapping == null) @@ -292,11 +308,13 @@ namespace System.Xml.Serialization return new TempAssembly(new XmlMapping[] { xmlMapping }, new Type?[] { type }, defaultNamespace, location); } + [RequiresUnreferencedCode(TrimSerializationWarning)] public void Serialize(TextWriter textWriter, object? o) { Serialize(textWriter, o, null); } + [RequiresUnreferencedCode(TrimSerializationWarning)] public void Serialize(TextWriter textWriter, object? o, XmlSerializerNamespaces? namespaces) { XmlTextWriter xmlWriter = new XmlTextWriter(textWriter); @@ -305,11 +323,13 @@ namespace System.Xml.Serialization Serialize(xmlWriter, o, namespaces); } + [RequiresUnreferencedCode(TrimSerializationWarning)] public void Serialize(Stream stream, object? o) { Serialize(stream, o, null); } + [RequiresUnreferencedCode(TrimSerializationWarning)] public void Serialize(Stream stream, object? o, XmlSerializerNamespaces? namespaces) { XmlTextWriter xmlWriter = new XmlTextWriter(stream, null); @@ -318,21 +338,25 @@ namespace System.Xml.Serialization Serialize(xmlWriter, o, namespaces); } + [RequiresUnreferencedCode(TrimSerializationWarning)] public void Serialize(XmlWriter xmlWriter, object? o) { Serialize(xmlWriter, o, null); } + [RequiresUnreferencedCode(TrimSerializationWarning)] public void Serialize(XmlWriter xmlWriter, object? o, XmlSerializerNamespaces? namespaces) { Serialize(xmlWriter, o, namespaces, null); } + [RequiresUnreferencedCode(TrimSerializationWarning)] public void Serialize(XmlWriter xmlWriter, object? o, XmlSerializerNamespaces? namespaces, string? encodingStyle) { Serialize(xmlWriter, o, namespaces, encodingStyle, null); } + [RequiresUnreferencedCode(TrimSerializationWarning)] public void Serialize(XmlWriter xmlWriter, object? o, XmlSerializerNamespaces? namespaces, string? encodingStyle, string? id) { try @@ -375,6 +399,7 @@ namespace System.Xml.Serialization xmlWriter.Flush(); } + [RequiresUnreferencedCode("calls GetMapping")] private void SerializeUsingReflection(XmlWriter xmlWriter, object? o, XmlSerializerNamespaces? namespaces, string? encodingStyle, string? id) { XmlMapping mapping = GetMapping(); @@ -382,6 +407,7 @@ namespace System.Xml.Serialization writer.WriteObject(o); } + [RequiresUnreferencedCode("calls GenerateXmlTypeMapping")] private XmlMapping GetMapping() { if (_mapping == null || !_mapping.GenerateSerializer) @@ -392,6 +418,7 @@ namespace System.Xml.Serialization return _mapping; } + [RequiresUnreferencedCode(TrimDeserializationWarning)] public object? Deserialize(Stream stream) { XmlTextReader xmlReader = new XmlTextReader(stream); @@ -401,6 +428,7 @@ namespace System.Xml.Serialization return Deserialize(xmlReader, null); } + [RequiresUnreferencedCode(TrimDeserializationWarning)] public object? Deserialize(TextReader textReader) { XmlTextReader xmlReader = new XmlTextReader(textReader); @@ -410,21 +438,25 @@ namespace System.Xml.Serialization return Deserialize(xmlReader, null); } + [RequiresUnreferencedCode(TrimDeserializationWarning)] public object? Deserialize(XmlReader xmlReader) { return Deserialize(xmlReader, null); } + [RequiresUnreferencedCode(TrimDeserializationWarning)] public object? Deserialize(XmlReader xmlReader, XmlDeserializationEvents events) { return Deserialize(xmlReader, null, events); } + [RequiresUnreferencedCode(TrimDeserializationWarning)] public object? Deserialize(XmlReader xmlReader, string? encodingStyle) { return Deserialize(xmlReader, encodingStyle, _events); } + [RequiresUnreferencedCode(TrimDeserializationWarning)] public object? Deserialize(XmlReader xmlReader, string? encodingStyle, XmlDeserializationEvents events) { events.sender = this; @@ -477,6 +509,7 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode("calls GetMapping")] private object? DeserializeUsingReflection(XmlReader xmlReader, string? encodingStyle, XmlDeserializationEvents events) { XmlMapping mapping = GetMapping(); @@ -507,11 +540,13 @@ namespace System.Xml.Serialization } } + [RequiresUnreferencedCode(TrimSerializationWarning)] public static XmlSerializer[] FromMappings(XmlMapping[]? mappings) { return FromMappings(mappings, (Type?)null); } + [RequiresUnreferencedCode(TrimSerializationWarning)] public static XmlSerializer[] FromMappings(XmlMapping[]? mappings, Type? type) { if (mappings == null || mappings.Length == 0) return Array.Empty(); @@ -593,6 +628,7 @@ namespace System.Xml.Serialization return serializers; } + [RequiresUnreferencedCode("calls GenerateSerializerToStream")] internal static bool GenerateSerializer(Type[]? types, XmlMapping[] mappings, Stream stream) { if (types == null || types.Length == 0) @@ -631,6 +667,7 @@ namespace System.Xml.Serialization return TempAssembly.GenerateSerializerToStream(mappings, types, null, assembly, new Hashtable(), stream); } + [RequiresUnreferencedCode("calls Contract")] private static XmlSerializer[] GetSerializersFromCache(XmlMapping[] mappings, Type type) { XmlSerializer?[] serializers = new XmlSerializer?[mappings.Length]; @@ -683,6 +720,7 @@ namespace System.Xml.Serialization return serializers!; } + [RequiresUnreferencedCode(TrimSerializationWarning)] public static XmlSerializer[] FromTypes(Type[]? types) { if (types == null) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializerFactory.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializerFactory.cs index 746698c..301f3c4 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializerFactory.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializerFactory.cs @@ -14,44 +14,53 @@ namespace System.Xml.Serialization using System.Xml.Serialization.Configuration; using System.Diagnostics; using System.Xml.Serialization; + using System.Diagnostics.CodeAnalysis; public class XmlSerializerFactory { + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlSerializer CreateSerializer(Type type, XmlAttributeOverrides? overrides, Type[]? extraTypes, XmlRootAttribute? root, string? defaultNamespace) { return CreateSerializer(type, overrides, extraTypes, root, defaultNamespace, null); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlSerializer CreateSerializer(Type type, XmlRootAttribute? root) { return CreateSerializer(type, null, Type.EmptyTypes, root, null, null); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlSerializer CreateSerializer(Type type, Type[]? extraTypes) { return CreateSerializer(type, null, extraTypes, null, null, null); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlSerializer CreateSerializer(Type type, XmlAttributeOverrides? overrides) { return CreateSerializer(type, overrides, Type.EmptyTypes, null, null, null); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlSerializer CreateSerializer(XmlTypeMapping xmlTypeMapping) { return new XmlSerializer(xmlTypeMapping); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlSerializer CreateSerializer(Type type) { return CreateSerializer(type, (string?)null); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlSerializer CreateSerializer(Type type, string? defaultNamespace) { return new XmlSerializer(type, defaultNamespace); } + [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)] public XmlSerializer CreateSerializer(Type type, XmlAttributeOverrides? overrides, Type[]? extraTypes, XmlRootAttribute? root, string? defaultNamespace, string? location) { return new XmlSerializer(type, overrides, extraTypes, root, defaultNamespace, location); diff --git a/src/libraries/System.Private.Xml/tests/TrimmingTests/System.Private.Xml.TrimmingTests.proj b/src/libraries/System.Private.Xml/tests/TrimmingTests/System.Private.Xml.TrimmingTests.proj index 44cc404..89084f6 100644 --- a/src/libraries/System.Private.Xml/tests/TrimmingTests/System.Private.Xml.TrimmingTests.proj +++ b/src/libraries/System.Private.Xml/tests/TrimmingTests/System.Private.Xml.TrimmingTests.proj @@ -3,6 +3,7 @@ + diff --git a/src/libraries/System.Private.Xml/tests/TrimmingTests/XmlSchema.Write.cs b/src/libraries/System.Private.Xml/tests/TrimmingTests/XmlSchema.Write.cs new file mode 100644 index 0000000..9316ddd --- /dev/null +++ b/src/libraries/System.Private.Xml/tests/TrimmingTests/XmlSchema.Write.cs @@ -0,0 +1,62 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Schema; + +class XMLSchemaExamples +{ + public static int Main() + { + + XmlSchema schema = new XmlSchema(); + string expectedSchema = @""; + + // + XmlSchemaElement elementCat = new XmlSchemaElement(); + schema.Items.Add(elementCat); + elementCat.Name = "cat"; + elementCat.SchemaTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema"); + + // + XmlSchemaElement elementDog = new XmlSchemaElement(); + schema.Items.Add(elementDog); + elementDog.Name = "dog"; + elementDog.SchemaTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema"); + + // + XmlSchemaElement elementRedDog = new XmlSchemaElement(); + schema.Items.Add(elementRedDog); + elementRedDog.Name = "redDog"; + elementRedDog.SubstitutionGroup = new XmlQualifiedName("dog"); + + // + XmlSchemaElement elementBrownDog = new XmlSchemaElement(); + schema.Items.Add(elementBrownDog); + elementBrownDog.Name = "brownDog"; + elementBrownDog.SubstitutionGroup = new XmlQualifiedName("dog"); + + // + XmlSchemaElement elementPets = new XmlSchemaElement(); + schema.Items.Add(elementPets); + elementPets.Name = "pets"; + + using (var stream = new MemoryStream()) + { + using (var writer = XmlWriter.Create(stream)) + { + schema.Write(writer, null); + } + + var str = Encoding.UTF8.GetString(stream.ToArray()); + if (str.Equals(expectedSchema, StringComparison.OrdinalIgnoreCase)) + { + return 100; + } + return -1; + } + } +} \ No newline at end of file diff --git a/src/libraries/System.Xml.ReaderWriter/ref/System.Xml.ReaderWriter.cs b/src/libraries/System.Xml.ReaderWriter/ref/System.Xml.ReaderWriter.cs index 479251e..de6c76d 100644 --- a/src/libraries/System.Xml.ReaderWriter/ref/System.Xml.ReaderWriter.cs +++ b/src/libraries/System.Xml.ReaderWriter/ref/System.Xml.ReaderWriter.cs @@ -1479,11 +1479,17 @@ namespace System.Xml.Schema public static System.Xml.Schema.XmlSchema? Read(System.IO.Stream stream, System.Xml.Schema.ValidationEventHandler? validationEventHandler) { throw null; } public static System.Xml.Schema.XmlSchema? Read(System.IO.TextReader reader, System.Xml.Schema.ValidationEventHandler? validationEventHandler) { throw null; } public static System.Xml.Schema.XmlSchema? Read(System.Xml.XmlReader reader, System.Xml.Schema.ValidationEventHandler? validationEventHandler) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Write(System.IO.Stream stream) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Write(System.IO.Stream stream, System.Xml.XmlNamespaceManager? namespaceManager) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Write(System.IO.TextWriter writer) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Write(System.IO.TextWriter writer, System.Xml.XmlNamespaceManager? namespaceManager) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Write(System.Xml.XmlWriter writer) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Write(System.Xml.XmlWriter writer, System.Xml.XmlNamespaceManager? namespaceManager) { } } public partial class XmlSchemaAll : System.Xml.Schema.XmlSchemaGroupBase diff --git a/src/libraries/System.Xml.XmlSerializer/ref/System.Xml.XmlSerializer.cs b/src/libraries/System.Xml.XmlSerializer/ref/System.Xml.XmlSerializer.cs index 47b3000..cfe7762 100644 --- a/src/libraries/System.Xml.XmlSerializer/ref/System.Xml.XmlSerializer.cs +++ b/src/libraries/System.Xml.XmlSerializer/ref/System.Xml.XmlSerializer.cs @@ -128,13 +128,21 @@ namespace System.Xml.Serialization public SoapReflectionImporter(string? defaultNamespace) { } public SoapReflectionImporter(System.Xml.Serialization.SoapAttributeOverrides? attributeOverrides) { } public SoapReflectionImporter(System.Xml.Serialization.SoapAttributeOverrides? attributeOverrides, string? defaultNamespace) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, System.Xml.Serialization.XmlReflectionMember[] members) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, System.Xml.Serialization.XmlReflectionMember[] members, bool hasWrapperElement, bool writeAccessors) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, System.Xml.Serialization.XmlReflectionMember[] members, bool hasWrapperElement, bool writeAccessors, bool validate) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, System.Xml.Serialization.XmlReflectionMember[] members, bool hasWrapperElement, bool writeAccessors, bool validate, System.Xml.Serialization.XmlMappingAccess access) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlTypeMapping ImportTypeMapping(System.Type type) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlTypeMapping ImportTypeMapping(System.Type type, string? defaultNamespace) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void IncludeType(System.Type type) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void IncludeTypes(System.Reflection.ICustomAttributeProvider provider) { } } public partial class SoapSchemaMember @@ -349,15 +357,25 @@ namespace System.Xml.Serialization public XmlReflectionImporter(string? defaultNamespace) { } public XmlReflectionImporter(System.Xml.Serialization.XmlAttributeOverrides? attributeOverrides) { } public XmlReflectionImporter(System.Xml.Serialization.XmlAttributeOverrides? attributeOverrides, string? defaultNamespace) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, System.Xml.Serialization.XmlReflectionMember[] members, bool hasWrapperElement) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, System.Xml.Serialization.XmlReflectionMember[] members, bool hasWrapperElement, bool rpc) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, System.Xml.Serialization.XmlReflectionMember[] members, bool hasWrapperElement, bool rpc, bool openModel) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlMembersMapping ImportMembersMapping(string? elementName, string? ns, System.Xml.Serialization.XmlReflectionMember[] members, bool hasWrapperElement, bool rpc, bool openModel, System.Xml.Serialization.XmlMappingAccess access) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlTypeMapping ImportTypeMapping(System.Type type) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlTypeMapping ImportTypeMapping(System.Type type, string? defaultNamespace) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlTypeMapping ImportTypeMapping(System.Type type, System.Xml.Serialization.XmlRootAttribute? root) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlTypeMapping ImportTypeMapping(System.Type type, System.Xml.Serialization.XmlRootAttribute? root, string? defaultNamespace) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void IncludeType(System.Type type) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void IncludeTypes(System.Reflection.ICustomAttributeProvider provider) { } } public partial class XmlReflectionMember @@ -391,18 +409,31 @@ namespace System.Xml.Serialization } public partial class XmlSchemaImporter : System.Xml.Serialization.SchemaImporter { + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public XmlSchemaImporter(System.Xml.Serialization.XmlSchemas schemas) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public XmlSchemaImporter(System.Xml.Serialization.XmlSchemas schemas, System.Xml.Serialization.CodeIdentifiers? typeIdentifiers) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlMembersMapping? ImportAnyType(System.Xml.XmlQualifiedName typeName, string elementName) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlTypeMapping ImportDerivedTypeMapping(System.Xml.XmlQualifiedName name, System.Type? baseType) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlTypeMapping ImportDerivedTypeMapping(System.Xml.XmlQualifiedName name, System.Type? baseType, bool baseTypeCanBeIndirect) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlMembersMapping ImportMembersMapping(string name, string? ns, System.Xml.Serialization.SoapSchemaMember[] members) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlMembersMapping ImportMembersMapping(System.Xml.XmlQualifiedName name) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlMembersMapping ImportMembersMapping(System.Xml.XmlQualifiedName[] names) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlMembersMapping ImportMembersMapping(System.Xml.XmlQualifiedName[] names, System.Type? baseType, bool baseTypeCanBeIndirect) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlTypeMapping ImportSchemaType(System.Xml.XmlQualifiedName typeName) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlTypeMapping ImportSchemaType(System.Xml.XmlQualifiedName typeName, System.Type? baseType) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlTypeMapping ImportSchemaType(System.Xml.XmlQualifiedName typeName, System.Type? baseType, bool baseTypeCanBeIndirect) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlTypeMapping ImportTypeMapping(System.Xml.XmlQualifiedName name) { throw null; } } public partial class XmlSchemas : System.Collections.CollectionBase, System.Collections.Generic.IEnumerable, System.Collections.IEnumerable @@ -415,6 +446,7 @@ namespace System.Xml.Serialization public int Add(System.Xml.Schema.XmlSchema schema, System.Uri? baseUri) { throw null; } public void Add(System.Xml.Serialization.XmlSchemas schemas) { } public void AddReference(System.Xml.Schema.XmlSchema schema) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Compile(System.Xml.Schema.ValidationEventHandler? handler, bool fullCompile) { } public bool Contains(string? targetNamespace) { throw null; } public bool Contains(System.Xml.Schema.XmlSchema schema) { throw null; } @@ -470,6 +502,7 @@ namespace System.Xml.Serialization protected bool GetNullAttr() { throw null; } protected object GetTarget(string id) { throw null; } protected System.Xml.XmlQualifiedName? GetXsiType() { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected abstract void InitCallbacks(); protected abstract void InitIDs(); protected bool IsXmlnsAttribute(string name) { throw null; } @@ -480,11 +513,17 @@ namespace System.Xml.Serialization protected System.Xml.XmlQualifiedName? ReadNullableQualifiedName() { throw null; } protected string? ReadNullableString() { throw null; } protected bool ReadReference([System.Diagnostics.CodeAnalysis.NotNullWhenAttribute(true)] out string? fixupReference) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected object? ReadReferencedElement() { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected object? ReadReferencedElement(string? name, string? ns) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected void ReadReferencedElements() { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected object? ReadReferencingElement(string? name, string? ns, bool elementCanBeType, out string? fixupReference) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected object? ReadReferencingElement(string? name, string? ns, out string? fixupReference) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected object? ReadReferencingElement(out string? fixupReference) { throw null; } protected System.Xml.Serialization.IXmlSerializable ReadSerializable(System.Xml.Serialization.IXmlSerializable serializable) { throw null; } protected System.Xml.Serialization.IXmlSerializable ReadSerializable(System.Xml.Serialization.IXmlSerializable serializable, bool wrappedAny) { throw null; } @@ -557,7 +596,9 @@ namespace System.Xml.Serialization protected System.Exception CreateInvalidEnumValueException(object value, string typeName) { throw null; } protected System.Exception CreateMismatchChoiceException(string value, string elementName, string enumValue) { throw null; } protected System.Exception CreateUnknownAnyElementException(string name, string ns) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected System.Exception CreateUnknownTypeException(object o) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected System.Exception CreateUnknownTypeException(System.Type type) { throw null; } protected static byte[] FromByteArrayBase64(byte[] value) { throw null; } [return: System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute("value")] @@ -578,6 +619,7 @@ namespace System.Xml.Serialization protected static string? FromXmlNmTokens(string? nmTokens) { throw null; } protected string? FromXmlQualifiedName(System.Xml.XmlQualifiedName? xmlQualifiedName) { throw null; } protected string? FromXmlQualifiedName(System.Xml.XmlQualifiedName? xmlQualifiedName, bool ignoreEmpty) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected abstract void InitCallbacks(); protected static System.Reflection.Assembly? ResolveDynamicAssembly(string assemblyFullName) { throw null; } protected void TopLevelElement() { } @@ -622,10 +664,15 @@ namespace System.Xml.Serialization protected void WriteNullTagEncoded(string? name, string? ns) { } protected void WriteNullTagLiteral(string? name) { } protected void WriteNullTagLiteral(string? name, string? ns) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected void WritePotentiallyReferencingElement(string? n, string? ns, object? o) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected void WritePotentiallyReferencingElement(string? n, string? ns, object? o, System.Type? ambientType) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected void WritePotentiallyReferencingElement(string n, string? ns, object? o, System.Type? ambientType, bool suppressReference) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected void WritePotentiallyReferencingElement(string? n, string? ns, object? o, System.Type? ambientType, bool suppressReference, bool isNullable) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected void WriteReferencedElements() { } protected void WriteReferencingElement(string n, string? ns, object? o) { } protected void WriteReferencingElement(string n, string? ns, object? o, bool isNullable) { } @@ -639,6 +686,7 @@ namespace System.Xml.Serialization protected void WriteStartElement(string name, string? ns, object? o) { } protected void WriteStartElement(string name, string? ns, object? o, bool writePrefixed) { } protected void WriteStartElement(string name, string? ns, object? o, bool writePrefixed, System.Xml.Serialization.XmlSerializerNamespaces? xmlns) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] protected void WriteTypedPrimitive(string? name, string? ns, object o, bool xsiType) { } protected void WriteValue(byte[]? value) { } protected void WriteValue(string? value) { } @@ -649,13 +697,21 @@ namespace System.Xml.Serialization public partial class XmlSerializer { protected XmlSerializer() { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public XmlSerializer(System.Type type) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public XmlSerializer(System.Type type, string? defaultNamespace) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public XmlSerializer(System.Type type, System.Type[]? extraTypes) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public XmlSerializer(System.Type type, System.Xml.Serialization.XmlAttributeOverrides? overrides) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public XmlSerializer(System.Type type, System.Xml.Serialization.XmlAttributeOverrides? overrides, System.Type[]? extraTypes, System.Xml.Serialization.XmlRootAttribute? root, string? defaultNamespace) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public XmlSerializer(System.Type type, System.Xml.Serialization.XmlAttributeOverrides? overrides, System.Type[]? extraTypes, System.Xml.Serialization.XmlRootAttribute? root, string? defaultNamespace, string? location) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public XmlSerializer(System.Type type, System.Xml.Serialization.XmlRootAttribute? root) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public XmlSerializer(System.Xml.Serialization.XmlTypeMapping xmlTypeMapping) { } public event System.Xml.Serialization.XmlAttributeEventHandler UnknownAttribute { add { } remove { } } public event System.Xml.Serialization.XmlElementEventHandler UnknownElement { add { } remove { } } @@ -664,26 +720,43 @@ namespace System.Xml.Serialization public virtual bool CanDeserialize(System.Xml.XmlReader xmlReader) { throw null; } protected virtual System.Xml.Serialization.XmlSerializationReader CreateReader() { throw null; } protected virtual System.Xml.Serialization.XmlSerializationWriter CreateWriter() { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from deserialized types may be trimmed if not referenced directly")] public object? Deserialize(System.IO.Stream stream) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from deserialized types may be trimmed if not referenced directly")] public object? Deserialize(System.IO.TextReader textReader) { throw null; } protected virtual object Deserialize(System.Xml.Serialization.XmlSerializationReader reader) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from deserialized types may be trimmed if not referenced directly")] public object? Deserialize(System.Xml.XmlReader xmlReader) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from deserialized types may be trimmed if not referenced directly")] public object? Deserialize(System.Xml.XmlReader xmlReader, string? encodingStyle) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from deserialized types may be trimmed if not referenced directly")] public object? Deserialize(System.Xml.XmlReader xmlReader, string? encodingStyle, System.Xml.Serialization.XmlDeserializationEvents events) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from deserialized types may be trimmed if not referenced directly")] public object? Deserialize(System.Xml.XmlReader xmlReader, System.Xml.Serialization.XmlDeserializationEvents events) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public static System.Xml.Serialization.XmlSerializer[] FromMappings(System.Xml.Serialization.XmlMapping[]? mappings) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public static System.Xml.Serialization.XmlSerializer[] FromMappings(System.Xml.Serialization.XmlMapping[]? mappings, System.Type? type) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public static System.Xml.Serialization.XmlSerializer[] FromTypes(System.Type[]? types) { throw null; } public static string GetXmlSerializerAssemblyName(System.Type type) { throw null; } public static string GetXmlSerializerAssemblyName(System.Type type, string? defaultNamespace) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Serialize(System.IO.Stream stream, object? o) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Serialize(System.IO.Stream stream, object? o, System.Xml.Serialization.XmlSerializerNamespaces? namespaces) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Serialize(System.IO.TextWriter textWriter, object? o) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Serialize(System.IO.TextWriter textWriter, object? o, System.Xml.Serialization.XmlSerializerNamespaces? namespaces) { } protected virtual void Serialize(object? o, System.Xml.Serialization.XmlSerializationWriter writer) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Serialize(System.Xml.XmlWriter xmlWriter, object? o) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Serialize(System.Xml.XmlWriter xmlWriter, object? o, System.Xml.Serialization.XmlSerializerNamespaces? namespaces) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Serialize(System.Xml.XmlWriter xmlWriter, object? o, System.Xml.Serialization.XmlSerializerNamespaces? namespaces, string? encodingStyle) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public void Serialize(System.Xml.XmlWriter xmlWriter, object? o, System.Xml.Serialization.XmlSerializerNamespaces? namespaces, string? encodingStyle, string? id) { } } [System.AttributeUsageAttribute(System.AttributeTargets.Class | System.AttributeTargets.Enum | System.AttributeTargets.Interface | System.AttributeTargets.Struct, AllowMultiple=false)] @@ -698,13 +771,21 @@ namespace System.Xml.Serialization public partial class XmlSerializerFactory { public XmlSerializerFactory() { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlSerializer CreateSerializer(System.Type type) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlSerializer CreateSerializer(System.Type type, string? defaultNamespace) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlSerializer CreateSerializer(System.Type type, System.Type[]? extraTypes) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlSerializer CreateSerializer(System.Type type, System.Xml.Serialization.XmlAttributeOverrides? overrides) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlSerializer CreateSerializer(System.Type type, System.Xml.Serialization.XmlAttributeOverrides? overrides, System.Type[]? extraTypes, System.Xml.Serialization.XmlRootAttribute? root, string? defaultNamespace) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlSerializer CreateSerializer(System.Type type, System.Xml.Serialization.XmlAttributeOverrides? overrides, System.Type[]? extraTypes, System.Xml.Serialization.XmlRootAttribute? root, string? defaultNamespace, string? location) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlSerializer CreateSerializer(System.Type type, System.Xml.Serialization.XmlRootAttribute? root) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Members from serialized types may be trimmed if not referenced directly")] public System.Xml.Serialization.XmlSerializer CreateSerializer(System.Xml.Serialization.XmlTypeMapping xmlTypeMapping) { throw null; } } public abstract partial class XmlSerializerImplementation -- 2.7.4