Imported Upstream version 5.10.0.69

Former-commit-id: fc39669a0b707dd3c063977486506b6793da2890
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2018-01-29 19:03:06 +00:00
parent d8f8abd549
commit e2950ec768
6283 changed files with 453847 additions and 91879 deletions

View File

@@ -19,10 +19,10 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0D1E2954-A5C7-4B8C-932A-31EB4A96A737}.Debug|Any CPU.ActiveCfg = netstandard-Debug|Any CPU
{0D1E2954-A5C7-4B8C-932A-31EB4A96A737}.Debug|Any CPU.Build.0 = netstandard-Debug|Any CPU
{0D1E2954-A5C7-4B8C-932A-31EB4A96A737}.Release|Any CPU.ActiveCfg = netstandard-Release|Any CPU
{0D1E2954-A5C7-4B8C-932A-31EB4A96A737}.Release|Any CPU.Build.0 = netstandard-Release|Any CPU
{0D1E2954-A5C7-4B8C-932A-31EB4A96A737}.Debug|Any CPU.ActiveCfg = netcoreapp-Debug|Any CPU
{0D1E2954-A5C7-4B8C-932A-31EB4A96A737}.Debug|Any CPU.Build.0 = netcoreapp-Debug|Any CPU
{0D1E2954-A5C7-4B8C-932A-31EB4A96A737}.Release|Any CPU.ActiveCfg = netcoreapp-Release|Any CPU
{0D1E2954-A5C7-4B8C-932A-31EB4A96A737}.Release|Any CPU.Build.0 = netcoreapp-Release|Any CPU
{80958E8B-2FEB-4F95-83F9-825CA1ED26F8}.Debug|Any CPU.ActiveCfg = netstandard-Debug|Any CPU
{80958E8B-2FEB-4F95-83F9-825CA1ED26F8}.Debug|Any CPU.Build.0 = netstandard-Debug|Any CPU
{80958E8B-2FEB-4F95-83F9-825CA1ED26F8}.Release|Any CPU.ActiveCfg = netstandard-Release|Any CPU

View File

@@ -3,7 +3,7 @@
<Import Project="..\dir.props" />
<PropertyGroup>
<PreReleaseLabel>preview1</PreReleaseLabel>
<PackageVersion>1.0.0</PackageVersion>
<PackageVersion>1.1.0</PackageVersion>
<SkipValidatePackage>true</SkipValidatePackage>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
<AssemblyFileVersion>$(AssemblyVersion)</AssemblyFileVersion>

View File

@@ -5,7 +5,10 @@
<ProjectReference Include="..\src\Microsoft.XmlSerializer.Generator.csproj" />
</ItemGroup>
<PropertyGroup>
<ReleaseNotes>https://go.microsoft.com/fwlink/?LinkID=863421</ReleaseNotes>
<ProjectUrl>https://go.microsoft.com/fwlink/?linkid=858594</ProjectUrl>
<SkipPackageFileCheck>true</SkipPackageFileCheck>
<HarvestStablePackage>false</HarvestStablePackage>
</PropertyGroup>
<ItemGroup>
<PackageFile Include=".\build\prefercliruntime"/>

View File

@@ -1,27 +1,61 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SerializerName>$(AssemblyName).XmlSerializers</SerializerName>
<SerializerDllImmediatePath>$(IntermediateOutputPath)$(SerializerName).dll</SerializerDllImmediatePath>
<SerializerPdbImmediatePath>$(IntermediateOutputPath)$(SerializerName).pdb</SerializerPdbImmediatePath>
<SerializerCsImmediatePath>$(IntermediateOutputPath)$(SerializerName).cs</SerializerCsImmediatePath>
<SGenWarningText>SGEN : warning SGEN1: Fail to generate the serializer for $(AssemblyName).dll. Please follow the instructions in https://go.microsoft.com/fwlink/?linkid=858594 and try again.</SGenWarningText>
<_SerializationAssemblyName>$(AssemblyName).XmlSerializers</_SerializationAssemblyName>
<_SerializerDllIntermediateFolder>$(IntermediateOutputPath)$(_SerializationAssemblyName).dll</_SerializerDllIntermediateFolder>
<_SerializerPdbIntermediateFolder>$(IntermediateOutputPath)$(_SerializationAssemblyName).pdb</_SerializerPdbIntermediateFolder>
<_SerializerCsIntermediateFolder>$(IntermediateOutputPath)$(_SerializationAssemblyName).cs</_SerializerCsIntermediateFolder>
<_SGenWarningText>SGEN : warning SGEN1: Fail to generate the serializer for $(AssemblyName)$(TargetExt). Please follow the instructions at https://go.microsoft.com/fwlink/?linkid=858594 and try again.</_SGenWarningText>
<_SerializationAssemblyDisabledWarnings>$(NoWarn);219;162;$(SerializationAssemblyDisabledWarnings)</_SerializationAssemblyDisabledWarnings>
</PropertyGroup>
<Target Name="GenerateSerializationAssembly" AfterTargets="Build">
<Delete Condition="Exists('$(SerializerDllImmediatePath)') == 'true'" Files="$(SerializerDllImmediatePath)" />
<Delete Condition="Exists('$(SerializerPdbImmediatePath)') == 'true'" Files="$(SerializerPdbImmediatePath)" />
<Delete Condition="Exists('$(SerializerCsImmediatePath)') == 'true'" Files="$(SerializerCsImmediatePath)" />
<Delete Condition="Exists('$(_SerializerDllIntermediateFolder)') == 'true'" Files="$(_SerializerDllIntermediateFolder)" ContinueOnError="true"/>
<Delete Condition="Exists('$(_SerializerPdbIntermediateFolder)') == 'true'" Files="$(_SerializerPdbIntermediateFolder)" ContinueOnError="true"/>
<Delete Condition="Exists('$(_SerializerCsIntermediateFolder)') == 'true'" Files="$(_SerializerCsIntermediateFolder)" ContinueOnError="true"/>
<Message Text="Running Serialization Tool" Importance="normal" />
<Exec Command="dotnet Microsoft.XmlSerializer.Generator $(IntermediateOutputPath)$(AssemblyName).dll /force /quiet" ContinueOnError="true"/>
<Warning Condition="Exists('$(SerializerCsImmediatePath)') != 'true'" Text="$(SGenWarningText)" />
<Csc Condition="Exists('$(SerializerCsImmediatePath)') == 'true'" ContinueOnError="true" OutputAssembly="$(SerializerDllImmediatePath)" References="@(ReferencePath);@(IntermediateAssembly)" EmitDebugInformation="$(DebugSymbols)" Sources="$(SerializerCsImmediatePath)" TargetType="Library" ToolExe="$(CscToolExe)" ToolPath="$(CscToolPath)"/>
<Warning Condition="Exists('$(SerializerDllImmediatePath)') != 'true' And Exists('$(SerializerCsImmediatePath)') == 'true'" Text="$(SGenWarningText)"/>
<Copy Condition="Exists('$(SerializerDllImmediatePath)') == 'true'" SourceFiles="$(SerializerDllImmediatePath)" DestinationFolder="$(OutputPath)" />
<Exec Command="dotnet Microsoft.XmlSerializer.Generator $(IntermediateOutputPath)$(AssemblyName)$(TargetExt) /force /quiet" ContinueOnError="true"/>
<Warning Condition="Exists('$(_SerializerCsIntermediateFolder)') != 'true'" Text="$(_SGenWarningText)" />
<Csc Condition="Exists('$(_SerializerCsIntermediateFolder)') == 'true'" ContinueOnError="true" OutputAssembly="$(_SerializerDllIntermediateFolder)" References="@(ReferencePath);@(IntermediateAssembly)" EmitDebugInformation="$(DebugSymbols)" Sources="$(_SerializerCsIntermediateFolder)" TargetType="Library" ToolExe="$(CscToolExe)" ToolPath="$(CscToolPath)" DisabledWarnings="$(_SerializationAssemblyDisabledWarnings)"/>
<Warning Condition="Exists('$(_SerializerDllIntermediateFolder)') != 'true' And Exists('$(_SerializerCsIntermediateFolder)') == 'true'" Text="$(_SGenWarningText)"/>
<Copy Condition="Exists('$(_SerializerDllIntermediateFolder)') == 'true'" SourceFiles="$(_SerializerDllIntermediateFolder)" DestinationFolder="$(OutputPath)" />
</Target>
<Target Name="CleanSerializationAssembly" AfterTargets="CoreClean">
<Message Text="Cleaning serialization files..." Importance="normal"/>
<Delete Condition="Exists('$(OutputPath)\$(SerializerName).dll') == 'true'" Files="$(OutputPath)\$(SerializerName).dll" />
<Delete Condition="Exists('$(OutputPath)\$(_SerializationAssemblyName).dll') == 'true'" Files="$(OutputPath)\$(_SerializationAssemblyName).dll" />
</Target>
<Target Name="CopySerializer" AfterTargets="PrepareForPublish">
<Target Name="CopySerializationAssembly" AfterTargets="PrepareForPublish">
<Copy Condition="Exists('$(OutputPath)\$(AssemblyName).XmlSerializers.dll')=='true'" SourceFiles="$(OutputPath)\$(AssemblyName).XmlSerializers.dll" DestinationFolder="$(PublishDir)" SkipUnchangedFiles="false" />
</Target>
<Target Name="GenerateSerializationAssemblyForReferenceAssemblies" AfterTargets="GenerateSerializationAssembly" Condition="@(SerializationAssembly)!=''">
<ItemGroup>
<_SearchSerializationAssembly Include="@(Reference)">
<AssemblyName>%(SerializationAssembly.Identity)</AssemblyName>
<SerializationTypes>%(SerializationAssembly.SerializationType)</SerializationTypes>
</_SearchSerializationAssembly>
<_TargetSerializationAssembly Include="@(_SearchSerializationAssembly)" Condition="$([System.String]::new('%(_SearchSerializationAssembly.Identity)').EndsWith('%(_SearchSerializationAssembly.AssemblyName).dll'))" />
<_ReferenceSerializationAssemblyName Include="%(SerializationAssembly.Identity).XmlSerializers" />
<_ReferenceSerializerIntermediateFolder Include="$(IntermediateOutputPath)%(_ReferenceSerializationAssemblyName.Identity)" />
</ItemGroup>
<Delete Files="%(_ReferenceSerializerIntermediateFolder.Identity).dll" ContinueOnError="true"/>
<Delete Files="%(_ReferenceSerializerIntermediateFolder.Identity).cs" ContinueOnError="true"/>
<Delete Files="%(_ReferenceSerializerIntermediateFolder.Identity).pdb" ContinueOnError="true"/>
<Message Text="Running Serialization Tool for Reference Assembly" Importance="normal" />
<Exec Command="dotnet Microsoft.XmlSerializer.Generator /force /quiet /assembly:%(_TargetSerializationAssembly.Identity) /type:%(_TargetSerializationAssembly.SerializationTypes) /out:$(IntermediateOutputPath)" ContinueOnError="true" />
<Warning Condition="Exists('$(IntermediateOutputPath)%(_ReferenceSerializationAssemblyName.Identity).cs') != 'true'" Text="SGEN : warning SGEN1: Fail to generate %(_ReferenceSerializationAssemblyName.Identity)'. Please follow the instructions at https://go.microsoft.com/fwlink/?linkid=858594 and try again." />
<Csc Condition="Exists('$(IntermediateOutputPath)%(_ReferenceSerializationAssemblyName.Identity).cs') == 'true'" ContinueOnError="true" OutputAssembly="$(IntermediateOutputPath)%(_ReferenceSerializationAssemblyName.Identity).dll" References="@(ReferencePath);@(IntermediateAssembly)" EmitDebugInformation="$(DebugSymbols)" Sources="$(IntermediateOutputPath)%(_ReferenceSerializationAssemblyName.Identity).cs" TargetType="Library" ToolExe="$(CscToolExe)" ToolPath="$(CscToolPath)" DisabledWarnings="$(_SerializationAssemblyDisabledWarnings)"/>
<Warning Condition="Exists('$(IntermediateOutputPath)%(_ReferenceSerializationAssemblyName.Identity).dll') != 'true' And Exists('$(IntermediateOutputPath)%(_ReferenceSerializationAssemblyName.Identity).cs') == 'true'" Text="SGEN : warning SGEN1: Fail to compile %(_ReferenceSerializationAssemblyName.Identity).cs. Please follow the instructions at https://go.microsoft.com/fwlink/?linkid=858594 and try again." />
<Copy Condition="Exists('%(_ReferenceSerializerIntermediateFolder.Identity).dll') == 'true'" SourceFiles="%(_ReferenceSerializerIntermediateFolder.Identity).dll" DestinationFolder="$(OutputPath)" />
</Target>
<Target Name="CleanReferenceSerializationAssemblies" AfterTargets="CoreClean" Condition="@(SerializationAssembly)!=''">
<Message Text="Cleaning serialization files for reference assemblies ..." Importance="normal" />
<Delete Condition="Exists('$(OutputPath)%(SerializationAssembly.Identity).XmlSerializers.dll') == 'true'" Files="$(OutputPath)%(SerializationAssembly.Identity).XmlSerializers.dll" />
</Target>
<Target Name="CopySerializerForReferenceAssemblies" AfterTargets="PrepareForPublish" Condition="@(SerializationAssembly)!=''">
<Copy Condition="Exists('$(OutputPath)%(SerializationAssembly.Identity).XmlSerializers.dll') == 'true'" SourceFiles="$(OutputPath)%(SerializationAssembly.Identity).XmlSerializers.dll" DestinationFolder="$(PublishDir)" SkipUnchangedFiles="false" />
</Target>
</Project>

View File

@@ -6,8 +6,6 @@
<AssemblyName>dotnet-Microsoft.XmlSerializer.Generator</AssemblyName>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<StringResourcesPath>..\..\System.Private.Xml\src\Resources\Strings.resx</StringResourcesPath>
<DefineConstants>$(DefineConstants);XMLSERIALIZERGENERATOR</DefineConstants>
<SourceDir>..\..\System.Private.Xml\src</SourceDir>
<OutputType>Exe</OutputType>
<TargetExt>.dll</TargetExt>
<NoWarn>$(NoWarn);0169;0414;0649</NoWarn>
@@ -15,144 +13,8 @@
<!-- Default configurations to help VS understand the options -->
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Release|AnyCPU'" />
<ItemGroup Condition="'$(TargetGroup)' == 'netstandard'">
<Compile Include="$(CommonPath)\System\CSharpHelpers.cs" />
<Compile Include="$(CommonPath)\System\LocalAppContext.cs" />
<Compile Include="$(SourceDir)\System\Xml\BinHexDecoder.cs">
<Link>System\Xml\BinHexDecoder.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\BinHexEncoder.cs">
<Link>System\Xml\BinHexEncoder.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Core\LocalAppContextSwitches.cs">
<Link>System\Xml\Core\LocalAppContextSwitches.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Extensions\ExtensionMethods.cs">
<Link>System\Xml\Extensions\ExtensionMethods.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\CodeGenerationoptions.cs">
<Link>System\Xml\Serialization\CodeGenerationoptions.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\CodeIdentifier.cs">
<Link>System\Xml\Serialization\CodeIdentifier.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\CodeIdentifiers.cs">
<Link>System\Xml\Serialization\CodeIdentifiers.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\Compilation.cs">
<Link>System\Xml\Serialization\Compilation.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\Compiler.cs">
<Link>System\Xml\Serialization\Compiler.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\Configuration\DateTimeSerializationSection.cs">
<Link>System\Xml\Serialization\Configuration\DateTimeSerializationSection.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\Globals.cs">
<Link>System\Xml\Serialization\Globals.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\indentedWriter.cs">
<Link>System\Xml\Serialization\indentedWriter.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\IXmlTextParser.cs">
<Link>System\Xml\Serialization\IXmlTextParser.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\Mappings.cs">
<Link>System\Xml\Serialization\Mappings.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\Models.cs">
<Link>System\Xml\Serialization\Models.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\NameTable.cs">
<Link>System\Xml\Serialization\NameTable.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\PrimitiveXmlSerializers.cs">
<Link>System\Xml\Serialization\PrimitiveXmlSerializers.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\SoapReflectionImporter.cs">
<Link>System\Xml\Serialization\SoapReflectionImporter.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\SoapSchemamember.cs">
<Link>System\Xml\Serialization\SoapSchemamember.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\TypeCode.cs">
<Link>System\Xml\Serialization\TypeCode.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\TypeExtensions.cs">
<Link>System\Xml\Serialization\TypeExtensions.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\Types.cs">
<Link>System\Xml\Serialization\Types.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlAttributeOverrides.cs">
<Link>System\Xml\Serialization\XmlAttributeOverrides.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlAttributes.cs">
<Link>System\Xml\Serialization\XmlAttributes.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlCountingReader.cs">
<Link>System\Xml\Serialization\XmlCountingReader.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\Xmlcustomformatter.cs">
<Link>System\Xml\Serialization\Xmlcustomformatter.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlMapping.cs">
<Link>System\Xml\Serialization\XmlMapping.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlMemberMapping.cs">
<Link>System\Xml\Serialization\XmlMemberMapping.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlMembersMapping.cs">
<Link>System\Xml\Serialization\XmlMembersMapping.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlReflectionImporter.cs">
<Link>System\Xml\Serialization\XmlReflectionImporter.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlReflectionMember.cs">
<Link>System\Xml\Serialization\XmlReflectionMember.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlSerializationGeneratedCode.cs">
<Link>System\Xml\Serialization\XmlSerializationGeneratedCode.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlSerializationReader.cs">
<Link>System\Xml\Serialization\XmlSerializationReader.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlSerializationWriter.cs">
<Link>System\Xml\Serialization\XmlSerializationWriter.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlSerializer.cs">
<Link>System\Xml\Serialization\XmlSerializer.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlSerializerFactory.cs">
<Link>System\Xml\Serialization\XmlSerializerFactory.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlSerializerNamespaces.cs">
<Link>System\Xml\Serialization\XmlSerializerNamespaces.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\XmlTypeMapping.cs">
<Link>System\Xml\Serialization\XmlTypeMapping.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\Serialization\_Events.cs">
<Link>System\Xml\Serialization\_Events.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\XmlCharType.cs">
<Link>System\Xml\XmlCharType.cs</Link>
</Compile>
<Compile Include="$(SourceDir)\System\Xml\XmlReservedNs.cs">
<Link>System\Xml\XmlReservedNs.cs</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<Compile Include="Microsoft\XmlSerializer\Generator\XmlSerializationGeneratedCode.cs" />
<Compile Include="Microsoft\XmlSerializer\Generator\XmlSerializationReader.cs" />
<Compile Include="Microsoft\XmlSerializer\Generator\XmlSerializationWriter.cs" />
<Compile Include="Sgen.cs" />
<Compile Include="System\Xml\Serialization\SoapAttributesExtensions.cs" />
<Compile Include="System\Xml\Serialization\XmlAnyElementAttributeExtensions.cs" />
<Compile Include="System\Xml\Serialization\XmlArrayItemAttributeExtensions.cs" />
<Compile Include="System\Xml\Serialization\XmlChoiceIdentifierAttributeExtensions.cs" />
<Compile Include="System\Xml\Serialization\XmlElementAttributeExtension.cs" />
<Compile Include="System\Xml\Serialization\XmlRootAttributeExtensions.cs" />
</ItemGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
<Import Project=".\GenerateThisAssemblyCs.targets" />

View File

@@ -1,399 +0,0 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
namespace Microsoft.XmlSerializer.Generator
{
using System;
using System.IO;
using System.Collections;
using System.ComponentModel;
using System.Threading;
using System.Reflection;
using System.Security;
using System.Globalization;
using System.Xml;
using System.Xml.Serialization;
internal class XmlSerializationCodeGen
{
private IndentedWriter _writer;
private int _nextMethodNumber = 0;
private Hashtable _methodNames = new Hashtable();
private ReflectionAwareCodeGen _raCodeGen;
private TypeScope[] _scopes;
private TypeDesc _stringTypeDesc = null;
private TypeDesc _qnameTypeDesc = null;
private string _access;
private string _className;
private TypeMapping[] _referencedMethods;
private int _references = 0;
private Hashtable _generatedMethods = new Hashtable();
internal XmlSerializationCodeGen(IndentedWriter writer, TypeScope[] scopes, string access, string className)
{
_writer = writer;
_scopes = scopes;
if (scopes.Length > 0)
{
_stringTypeDesc = scopes[0].GetTypeDesc(typeof(string));
_qnameTypeDesc = scopes[0].GetTypeDesc(typeof(XmlQualifiedName));
}
_raCodeGen = new ReflectionAwareCodeGen(writer);
_className = className;
_access = access;
}
internal IndentedWriter Writer { get { return _writer; } }
internal int NextMethodNumber { get { return _nextMethodNumber; } set { _nextMethodNumber = value; } }
internal ReflectionAwareCodeGen RaCodeGen { get { return _raCodeGen; } }
internal TypeDesc StringTypeDesc { get { return _stringTypeDesc; } }
internal TypeDesc QnameTypeDesc { get { return _qnameTypeDesc; } }
internal string ClassName { get { return _className; } }
internal string Access { get { return _access; } }
internal TypeScope[] Scopes { get { return _scopes; } }
internal Hashtable MethodNames { get { return _methodNames; } }
internal Hashtable GeneratedMethods { get { return _generatedMethods; } }
internal virtual void GenerateMethod(TypeMapping mapping) { }
internal void GenerateReferencedMethods()
{
while (_references > 0)
{
TypeMapping mapping = _referencedMethods[--_references];
GenerateMethod(mapping);
}
}
internal string ReferenceMapping(TypeMapping mapping)
{
if (!mapping.IsSoap)
{
if (_generatedMethods[mapping] == null)
{
_referencedMethods = EnsureArrayIndex(_referencedMethods, _references);
_referencedMethods[_references++] = mapping;
}
}
return (string)_methodNames[mapping];
}
private TypeMapping[] EnsureArrayIndex(TypeMapping[] a, int index)
{
if (a == null) return new TypeMapping[32];
if (index < a.Length) return a;
TypeMapping[] b = new TypeMapping[a.Length + 32];
Array.Copy(a, b, index);
return b;
}
internal void WriteQuotedCSharpString(string value)
{
_raCodeGen.WriteQuotedCSharpString(value);
}
internal void GenerateHashtableGetBegin(string privateName, string publicName)
{
_writer.Write(typeof(Hashtable).FullName);
_writer.Write(" ");
_writer.Write(privateName);
_writer.WriteLine(" = null;");
_writer.Write("public override ");
_writer.Write(typeof(Hashtable).FullName);
_writer.Write(" ");
_writer.Write(publicName);
_writer.WriteLine(" {");
_writer.Indent++;
_writer.WriteLine("get {");
_writer.Indent++;
_writer.Write("if (");
_writer.Write(privateName);
_writer.WriteLine(" == null) {");
_writer.Indent++;
_writer.Write(typeof(Hashtable).FullName);
_writer.Write(" _tmp = new ");
_writer.Write(typeof(Hashtable).FullName);
_writer.WriteLine("();");
}
internal void GenerateHashtableGetEnd(string privateName)
{
_writer.Write("if (");
_writer.Write(privateName);
_writer.Write(" == null) ");
_writer.Write(privateName);
_writer.WriteLine(" = _tmp;");
_writer.Indent--;
_writer.WriteLine("}");
_writer.Write("return ");
_writer.Write(privateName);
_writer.WriteLine(";");
_writer.Indent--;
_writer.WriteLine("}");
_writer.Indent--;
_writer.WriteLine("}");
}
internal void GeneratePublicMethods(string privateName, string publicName, string[] methods, XmlMapping[] xmlMappings)
{
GenerateHashtableGetBegin(privateName, publicName);
if (methods != null && methods.Length != 0 && xmlMappings != null && xmlMappings.Length == methods.Length)
{
for (int i = 0; i < methods.Length; i++)
{
if (methods[i] == null)
continue;
_writer.Write("_tmp[");
WriteQuotedCSharpString(xmlMappings[i].Key);
_writer.Write("] = ");
WriteQuotedCSharpString(methods[i]);
_writer.WriteLine(";");
}
}
GenerateHashtableGetEnd(privateName);
}
internal void GenerateSupportedTypes(Type[] types)
{
_writer.Write("public override ");
_writer.Write(typeof(bool).FullName);
_writer.Write(" CanSerialize(");
_writer.Write(typeof(Type).FullName);
_writer.WriteLine(" type) {");
_writer.Indent++;
Hashtable uniqueTypes = new Hashtable();
for (int i = 0; i < types.Length; i++)
{
Type type = types[i];
if (type == null)
continue;
if (!type.IsPublic && !type.IsNestedPublic)
continue;
if (uniqueTypes[type] != null)
continue;
if (DynamicAssemblies.IsTypeDynamic(type))
continue;
if (type.IsGenericType || type.ContainsGenericParameters && DynamicAssemblies.IsTypeDynamic(type.GetGenericArguments()))
continue;
uniqueTypes[type] = type;
_writer.Write("if (type == typeof(");
_writer.Write(CodeIdentifier.GetCSharpName(type));
_writer.WriteLine(")) return true;");
}
_writer.WriteLine("return false;");
_writer.Indent--;
_writer.WriteLine("}");
}
internal string GenerateBaseSerializer(string baseSerializer, string readerClass, string writerClass, CodeIdentifiers classes)
{
baseSerializer = CodeIdentifier.MakeValid(baseSerializer);
baseSerializer = classes.AddUnique(baseSerializer, baseSerializer);
_writer.WriteLine();
_writer.Write("public abstract class ");
_writer.Write(CodeIdentifier.GetCSharpName(baseSerializer));
_writer.Write(" : ");
_writer.Write(typeof(System.Xml.Serialization.XmlSerializer).FullName);
_writer.WriteLine(" {");
_writer.Indent++;
_writer.Write("protected override ");
_writer.Write(typeof(System.Xml.Serialization.XmlSerializationReader).FullName);
_writer.WriteLine(" CreateReader() {");
_writer.Indent++;
_writer.Write("return new ");
_writer.Write(readerClass);
_writer.WriteLine("();");
_writer.Indent--;
_writer.WriteLine("}");
_writer.Write("protected override ");
_writer.Write(typeof(System.Xml.Serialization.XmlSerializationWriter).FullName);
_writer.WriteLine(" CreateWriter() {");
_writer.Indent++;
_writer.Write("return new ");
_writer.Write(writerClass);
_writer.WriteLine("();");
_writer.Indent--;
_writer.WriteLine("}");
_writer.Indent--;
_writer.WriteLine("}");
return baseSerializer;
}
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));
serializerName = classes.AddUnique(serializerName + "Serializer", mapping);
_writer.WriteLine();
_writer.Write("public sealed class ");
_writer.Write(CodeIdentifier.GetCSharpName(serializerName));
_writer.Write(" : ");
_writer.Write(baseSerializer);
_writer.WriteLine(" {");
_writer.Indent++;
_writer.WriteLine();
_writer.Write("public override ");
_writer.Write(typeof(bool).FullName);
_writer.Write(" CanDeserialize(");
_writer.Write(typeof(XmlReader).FullName);
_writer.WriteLine(" xmlReader) {");
_writer.Indent++;
if (mapping.Accessor.Any)
{
_writer.WriteLine("return true;");
}
else
{
_writer.Write("return xmlReader.IsStartElement(");
WriteQuotedCSharpString(mapping.Accessor.Name);
_writer.Write(", ");
WriteQuotedCSharpString(mapping.Accessor.Namespace);
_writer.WriteLine(");");
}
_writer.Indent--;
_writer.WriteLine("}");
if (writeMethod != null)
{
_writer.WriteLine();
_writer.Write("protected override void Serialize(object objectToSerialize, ");
_writer.Write(typeof(System.Xml.Serialization.XmlSerializationWriter).FullName);
_writer.WriteLine(" writer) {");
_writer.Indent++;
_writer.Write("((");
_writer.Write(writerClass);
_writer.Write(")writer).");
_writer.Write(writeMethod);
_writer.Write("(");
if (mapping is XmlMembersMapping)
{
_writer.Write("(object[])");
}
_writer.WriteLine("objectToSerialize);");
_writer.Indent--;
_writer.WriteLine("}");
}
if (readMethod != null)
{
_writer.WriteLine();
_writer.Write("protected override object Deserialize(");
_writer.Write(typeof(System.Xml.Serialization.XmlSerializationReader).FullName);
_writer.WriteLine(" reader) {");
_writer.Indent++;
_writer.Write("return ((");
_writer.Write(readerClass);
_writer.Write(")reader).");
_writer.Write(readMethod);
_writer.WriteLine("();");
_writer.Indent--;
_writer.WriteLine("}");
}
_writer.Indent--;
_writer.WriteLine("}");
return serializerName;
}
private void GenerateTypedSerializers(Hashtable serializers)
{
string privateName = "typedSerializers";
GenerateHashtableGetBegin(privateName, "TypedSerializers");
foreach (string key in serializers.Keys)
{
_writer.Write("_tmp.Add(");
WriteQuotedCSharpString(key);
_writer.Write(", new ");
_writer.Write((string)serializers[key]);
_writer.WriteLine("());");
}
GenerateHashtableGetEnd("typedSerializers");
}
//GenerateGetSerializer(serializers, xmlMappings);
private void GenerateGetSerializer(Hashtable serializers, XmlMapping[] xmlMappings)
{
_writer.Write("public override ");
_writer.Write(typeof(System.Xml.Serialization.XmlSerializer).FullName);
_writer.Write(" GetSerializer(");
_writer.Write(typeof(Type).FullName);
_writer.WriteLine(" type) {");
_writer.Indent++;
for (int i = 0; i < xmlMappings.Length; i++)
{
if (xmlMappings[i] is XmlTypeMapping)
{
Type type = xmlMappings[i].Accessor.Mapping.TypeDesc.Type;
if (type == null)
continue;
if (!type.IsPublic && !type.IsNestedPublic)
continue;
if (DynamicAssemblies.IsTypeDynamic(type))
continue;
if (type.IsGenericType || type.ContainsGenericParameters && DynamicAssemblies.IsTypeDynamic(type.GetGenericArguments()))
continue;
_writer.Write("if (type == typeof(");
_writer.Write(CodeIdentifier.GetCSharpName(type));
_writer.Write(")) return new ");
_writer.Write((string)serializers[xmlMappings[i].Key]);
_writer.WriteLine("();");
}
}
_writer.WriteLine("return null;");
_writer.Indent--;
_writer.WriteLine("}");
}
internal void GenerateSerializerContract(string className, XmlMapping[] xmlMappings, Type[] types, string readerType, string[] readMethods, string writerType, string[] writerMethods, Hashtable serializers)
{
_writer.WriteLine();
_writer.Write("public class XmlSerializerContract : global::");
_writer.Write(typeof(System.Xml.Serialization.XmlSerializerImplementation).FullName);
_writer.WriteLine(" {");
_writer.Indent++;
_writer.Write("public override global::");
_writer.Write(typeof(System.Xml.Serialization.XmlSerializationReader).FullName);
_writer.Write(" Reader { get { return new ");
_writer.Write(readerType);
_writer.WriteLine("(); } }");
_writer.Write("public override global::");
_writer.Write(typeof(System.Xml.Serialization.XmlSerializationWriter).FullName);
_writer.Write(" Writer { get { return new ");
_writer.Write(writerType);
_writer.WriteLine("(); } }");
GeneratePublicMethods(nameof(readMethods), "ReadMethods", readMethods, xmlMappings);
GeneratePublicMethods("writeMethods", "WriteMethods", writerMethods, xmlMappings);
GenerateTypedSerializers(serializers);
GenerateSupportedTypes(types);
GenerateGetSerializer(serializers, xmlMappings);
_writer.Indent--;
_writer.WriteLine("}");
}
internal static bool IsWildcard(SpecialMapping mapping)
{
if (mapping is SerializableMapping)
return ((SerializableMapping)mapping).IsAny;
return mapping.TypeDesc.CanBeElementValue;
}
}
}

View File

@@ -9,6 +9,7 @@ using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Xml.Serialization;
namespace Microsoft.XmlSerializer.Generator
{
@@ -79,7 +80,14 @@ namespace Microsoft.XmlSerializer.Generator
}
else if (ArgumentMatch(arg, "type"))
{
types.Add(value);
if (value != string.Empty)
{
string[] typelist = value.Split(';');
foreach (var type in typelist)
{
types.Add(type);
}
}
}
else if (ArgumentMatch(arg, "assembly"))
{
@@ -155,7 +163,7 @@ namespace Microsoft.XmlSerializer.Generator
if(disableRun)
{
Console.WriteLine("This tool is not intended to be used directly.");
Console.WriteLine("Please refer to https://github.com/dotnet/core/blob/master/samples/xmlserializergenerator-instructions.md on how to use it.");
Console.WriteLine("Please refer to https://go.microsoft.com/fwlink/?linkid=858594 on how to use it.");
return 0;
}
@@ -256,7 +264,7 @@ namespace Microsoft.XmlSerializer.Generator
bool gac = assembly.GlobalAssemblyCache;
outputDirectory = outputDirectory == null ? (gac ? Environment.CurrentDirectory : Path.GetDirectoryName(assembly.Location)) : outputDirectory;
string serializerName = XmlSerializer.GetXmlSerializerAssemblyName(serializableTypes[0], null);
string serializerName = GetXmlSerializerAssemblyName(serializableTypes[0], null);
string codePath = Path.Combine(outputDirectory, serializerName + ".cs");
if (!force)
@@ -287,7 +295,15 @@ namespace Microsoft.XmlSerializer.Generator
using (FileStream fs = File.Create(codePath))
{
success = XmlSerializer.GenerateSerializer(serializableTypes, allMappings, fs);
MethodInfo method = typeof(System.Xml.Serialization.XmlSerializer).GetMethod("GenerateSerializer", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
if (method == null)
{
Console.Error.WriteLine(FormatMessage(parsableerrors: false, warning: false, message: SR.GenerateSerializerNotFound));
}
else
{
success = (bool)method.Invoke(null, new object[] { serializableTypes, allMappings, fs });
}
}
}
catch (UnauthorizedAccessException)
@@ -359,22 +375,6 @@ namespace Microsoft.XmlSerializer.Generator
}
if (xmlTypeMapping != null)
{
if (xmlTypeMapping.Mapping != null && xmlTypeMapping.Mapping is StructMapping)
{
foreach (MemberMapping memberMapping in ((StructMapping)xmlTypeMapping.Mapping).Members)
{
MemberInfo memberInfo = memberMapping.MemberInfo;
if (memberInfo != null && memberInfo.MemberType == MemberTypes.Property)
{
PropertyInfo propertyInfo = memberInfo as PropertyInfo;
if (propertyInfo != null && (propertyInfo.SetMethod == null || !propertyInfo.SetMethod.IsPublic))
{
return;
}
}
}
}
xmlTypeMapping = importer.ImportTypeMapping(type);
mappings.Add(xmlTypeMapping);
importedTypes.Add(type);
@@ -384,7 +384,7 @@ namespace Microsoft.XmlSerializer.Generator
private static Assembly LoadAssembly(string assemblyName, bool throwOnFail)
{
Assembly assembly = null;
string path = Path.GetFullPath(assemblyName);
string path = Path.IsPathRooted(assemblyName) ? assemblyName : Path.GetFullPath(assemblyName);
assembly = Assembly.LoadFile(path);
if (assembly == null)
{
@@ -448,5 +448,24 @@ namespace Microsoft.XmlSerializer.Generator
WriteWarning(e.InnerException, parsableerrors);
}
}
private static string GetXmlSerializerAssemblyName(Type type)
{
return GetXmlSerializerAssemblyName(type, null);
}
private static string GetXmlSerializerAssemblyName(Type type, string defaultNamespace)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
return GetTempAssemblyName(type.Assembly.GetName(), defaultNamespace);
}
private static string GetTempAssemblyName(AssemblyName parent, string ns)
{
return parent.Name + ".XmlSerializers" + (ns == null || ns.Length == 0 ? "" : "." + ns.GetHashCode());
}
}
}
}

View File

@@ -3,6 +3,7 @@
<PropertyGroup>
<BuildConfigurations>
netstandard;
netfx;
uap;
netcoreapp;
</BuildConfigurations>

View File

@@ -6,7 +6,7 @@
<DefineConstants>$(DefineConstants);XMLSERIALIZERGENERATORTESTS</DefineConstants>
</PropertyGroup>
<PropertyGroup>
<SkipTestsOnPlatform Condition="'$(TargetGroup)' == 'uap' OR '$(ArchGroup)' == 'arm' OR '$(ArchGroup)' == 'arm64' OR '$(ArchGroup)' == 'armel'">true</SkipTestsOnPlatform>
<SkipTestsOnPlatform Condition="'$(TargetGroup)' == 'uap' OR '$(ArchGroup)' == 'arm' OR '$(ArchGroup)' == 'arm64' OR '$(ArchGroup)' == 'armel' OR '$(TargetGroup)' == 'netfx'">true</SkipTestsOnPlatform>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetGroup)' == 'netcoreapp'">
<!-- We're building netcoreap, run on the test CLI
@@ -20,8 +20,10 @@
<GeneratorRuntimeConfig>$(ToolsDir)csc.runtimeconfig.json</GeneratorRuntimeConfig>
<GeneratorCliPath>$(ToolsDir)dotnetcli/</GeneratorCliPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='netstandard-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='netstandard-Release|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netstandard-Release|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netfx-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netfx-Release|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'uap-Debug|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'uap-Release|AnyCPU'" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Debug|AnyCPU'" />