Add UniversalCodeGenerator(.NET Core linux-x64,osx-x64, win-x64) project.

This commit is contained in:
Yoshifumi Kawai 2018-12-12 18:34:16 +09:00
Родитель 3ef4751881
Коммит b71cd0ec90
14 изменённых файлов: 5181 добавлений и 5 удалений

Просмотреть файл

@ -29,7 +29,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{344DC89D-8
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sandbox", "sandbox", "{BF4C4202-5015-4FBD-80E6-D0F36A06F700}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sandbox", "sandbox\Sandbox\Sandbox.csproj", "{ED43BDA5-947C-4769-A47A-F07D3C6142AE}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sandbox", "sandbox\Sandbox\Sandbox.csproj", "{ED43BDA5-947C-4769-A47A-F07D3C6142AE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.CodeGenerator", "src\MessagePack.CodeGenerator\MessagePack.CodeGenerator.csproj", "{D8B195AC-9E93-438E-8331-EF3A1F613D0B}"
EndProject
@ -37,9 +37,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DynamicCodeDumper", "sandbo
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedData", "sandbox\SharedData\SharedData.csproj", "{3ABC5C4C-2CE4-459E-8666-F2B181C3DEF3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.UnityShims", "src\MessagePack.UnityShims\MessagePack.UnityShims.csproj", "{C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.UnityShims", "src\MessagePack.UnityShims\MessagePack.UnityShims.csproj", "{C01E1407-7FEC-4C1D-B0B4-74D95A317AA6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.ReactiveProperty", "src\MessagePack.ReactiveProperty\MessagePack.ReactiveProperty.csproj", "{166A16C0-B89F-41AF-956A-235C6CA62C25}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.ReactiveProperty", "src\MessagePack.ReactiveProperty\MessagePack.ReactiveProperty.csproj", "{166A16C0-B89F-41AF-956A-235C6CA62C25}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.ImmutableCollection", "src\MessagePack.ImmutableCollection\MessagePack.ImmutableCollection.csproj", "{E066F547-7261-4561-AEFC-E64DBFD874F8}"
EndProject
@ -49,12 +49,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePackAnalyzer.Vsix",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PertNetFramework", "sandbox\PertNetFramework\PertNetFramework.csproj", "{014A3DCE-50A6-4774-A4C1-C66EEAB67133}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.AspNetCoreMvcFormatter", "src\MessagePack.AspNetCoreMvcFormatter\MessagePack.AspNetCoreMvcFormatter.csproj", "{17831017-C29C-4A48-B159-849BCE5079FB}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagePack.AspNetCoreMvcFormatter", "src\MessagePack.AspNetCoreMvcFormatter\MessagePack.AspNetCoreMvcFormatter.csproj", "{17831017-C29C-4A48-B159-849BCE5079FB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PerfBenchmarkDotNet", "sandbox\PerfBenchmarkDotNet\PerfBenchmarkDotNet.csproj", "{814F94D6-1413-4ACB-B1B5-A3488CAA1E6B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestData2", "sandbox\TestData2\TestData2.csproj", "{2A32A538-BA26-4D89-85D0-E4249AFA0837}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagePack.UniversalCodeGenerator", "src\MessagePack.UniversalCodeGenerator\MessagePack.UniversalCodeGenerator.csproj", "{10AD85DD-929D-49B8-BD43-45242C2644B7}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -245,6 +247,18 @@ Global
{2A32A538-BA26-4D89-85D0-E4249AFA0837}.Release|x64.Build.0 = Release|Any CPU
{2A32A538-BA26-4D89-85D0-E4249AFA0837}.Release|x86.ActiveCfg = Release|Any CPU
{2A32A538-BA26-4D89-85D0-E4249AFA0837}.Release|x86.Build.0 = Release|Any CPU
{10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|x64.ActiveCfg = Debug|Any CPU
{10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|x64.Build.0 = Debug|Any CPU
{10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|x86.ActiveCfg = Debug|Any CPU
{10AD85DD-929D-49B8-BD43-45242C2644B7}.Debug|x86.Build.0 = Debug|Any CPU
{10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|Any CPU.Build.0 = Release|Any CPU
{10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x64.ActiveCfg = Release|Any CPU
{10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x64.Build.0 = Release|Any CPU
{10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x86.ActiveCfg = Release|Any CPU
{10AD85DD-929D-49B8-BD43-45242C2644B7}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -265,5 +279,9 @@ Global
{17831017-C29C-4A48-B159-849BCE5079FB} = {86309CF6-0054-4CE3-BFD3-CA0AA7DB17BC}
{814F94D6-1413-4ACB-B1B5-A3488CAA1E6B} = {BF4C4202-5015-4FBD-80E6-D0F36A06F700}
{2A32A538-BA26-4D89-85D0-E4249AFA0837} = {BF4C4202-5015-4FBD-80E6-D0F36A06F700}
{10AD85DD-929D-49B8-BD43-45242C2644B7} = {86309CF6-0054-4CE3-BFD3-CA0AA7DB17BC}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {26F0752B-06F7-44AD-BFEE-8F2E36B3AA27}
EndGlobalSection
EndGlobal

Просмотреть файл

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\..\packages\Microsoft.Build.MSBuildLocator.1.0.1-preview-g6cd9a57801\build\Microsoft.Build.MSBuildLocator.props" Condition="Exists('..\..\packages\Microsoft.Build.MSBuildLocator.1.0.1-preview-g6cd9a57801\build\Microsoft.Build.MSBuildLocator.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>

Просмотреть файл

@ -0,0 +1,163 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MessagePack.CodeGenerator
{
public interface IResolverRegisterInfo
{
string FullName { get; }
string FormatterName { get; }
}
public class ObjectSerializationInfo : IResolverRegisterInfo
{
public string Name { get; set; }
public string FullName { get; set; }
public string Namespace { get; set; }
public bool IsIntKey { get; set; }
public bool IsStringKey { get { return !IsIntKey; } }
public bool IsClass { get; set; }
public bool IsStruct { get { return !IsClass; } }
public MemberSerializationInfo[] ConstructorParameters { get; set; }
public MemberSerializationInfo[] Members { get; set; }
public bool HasIMessagePackSerializationCallbackReceiver { get; set; }
public bool NeedsCastOnBefore { get; set; }
public bool NeedsCastOnAfter { get; set; }
public string FormatterName => (Namespace == null ? Name : Namespace + "." + Name) + "Formatter";
public int WriteCount
{
get
{
if (IsStringKey)
{
return Members.Count(x => x.IsReadable);
}
else
{
return MaxKey;
}
}
}
public int MaxKey
{
get
{
return Members.Where(x => x.IsReadable).Select(x => x.IntKey).DefaultIfEmpty(-1).Max();
}
}
public MemberSerializationInfo GetMember(int index)
{
return Members.FirstOrDefault(x => x.IntKey == index);
}
public string GetConstructorString()
{
var args = string.Join(", ", ConstructorParameters.Select(x => "__" + x.Name + "__"));
return $"{FullName}({args})";
}
}
public class MemberSerializationInfo
{
public bool IsProperty { get; set; }
public bool IsField { get; set; }
public bool IsWritable { get; set; }
public bool IsReadable { get; set; }
public int IntKey { get; set; }
public string StringKey { get; set; }
public string Type { get; set; }
public string Name { get; set; }
public string ShortTypeName { get; set; }
readonly HashSet<string> primitiveTypes = new HashSet<string>(new string[]
{
"short",
"int",
"long",
"ushort",
"uint",
"ulong",
"float",
"double",
"bool",
"byte",
"sbyte",
"char",
//"global::System.DateTime",
//"byte[]",
//"string",
});
public string GetSerializeMethodString()
{
if (primitiveTypes.Contains(Type))
{
return $"MessagePackBinary.Write{ShortTypeName.Replace("[]", "s")}(ref bytes, offset, value.{Name})";
}
else
{
return $"formatterResolver.GetFormatterWithVerify<{Type}>().Serialize(ref bytes, offset, value.{Name}, formatterResolver)";
}
}
public string GetDeserializeMethodString()
{
if (primitiveTypes.Contains(Type))
{
return $"MessagePackBinary.Read{ShortTypeName.Replace("[]", "s")}(bytes, offset, out readSize)";
}
else
{
return $"formatterResolver.GetFormatterWithVerify<{Type}>().Deserialize(bytes, offset, formatterResolver, out readSize)";
}
}
}
public class EnumSerializationInfo : IResolverRegisterInfo
{
public string Namespace { get; set; }
public string Name { get; set; }
public string FullName { get; set; }
public string UnderlyingType { get; set; }
public string FormatterName => (Namespace == null ? Name : Namespace + "." + Name) + "Formatter";
}
public class GenericSerializationInfo : IResolverRegisterInfo, IEquatable<GenericSerializationInfo>
{
public string FullName { get; set; }
public string FormatterName { get; set; }
public bool Equals(GenericSerializationInfo other)
{
return FullName.Equals(other.FullName);
}
public override int GetHashCode()
{
return FullName.GetHashCode();
}
}
public class UnionSerializationInfo : IResolverRegisterInfo
{
public string Namespace { get; set; }
public string Name { get; set; }
public string FullName { get; set; }
public string FormatterName => (Namespace == null ? Name : Namespace + "." + Name) + "Formatter";
public UnionSubTypeInfo[] SubTypes { get; set; }
}
public class UnionSubTypeInfo
{
public string Type { get; set; }
public int Key { get; set; }
}
}

Просмотреть файл

@ -0,0 +1,844 @@
using Microsoft.CodeAnalysis;
using System;
using System.Collections.Generic;
using System.Linq;
namespace MessagePack.CodeGenerator
{
public class ReferenceSymbols
{
public readonly INamedTypeSymbol Task;
public readonly INamedTypeSymbol TaskOfT;
public readonly INamedTypeSymbol MessagePackObjectAttribute;
public readonly INamedTypeSymbol UnionAttribute;
public readonly INamedTypeSymbol SerializationConstructorAttribute;
public readonly INamedTypeSymbol KeyAttribute;
public readonly INamedTypeSymbol IgnoreAttribute;
public readonly INamedTypeSymbol IgnoreDataMemberAttribute;
public readonly INamedTypeSymbol IMessagePackSerializationCallbackReceiver;
public ReferenceSymbols(Compilation compilation)
{
TaskOfT = compilation.GetTypeByMetadataName("System.Threading.Tasks.Task`1");
Task = compilation.GetTypeByMetadataName("System.Threading.Tasks.Task");
MessagePackObjectAttribute = compilation.GetTypeByMetadataName("MessagePack.MessagePackObjectAttribute");
UnionAttribute = compilation.GetTypeByMetadataName("MessagePack.UnionAttribute");
SerializationConstructorAttribute = compilation.GetTypeByMetadataName("MessagePack.SerializationConstructorAttribute");
KeyAttribute = compilation.GetTypeByMetadataName("MessagePack.KeyAttribute");
IgnoreAttribute = compilation.GetTypeByMetadataName("MessagePack.IgnoreMemberAttribute");
IgnoreDataMemberAttribute = compilation.GetTypeByMetadataName("System.Runtime.Serialization.IgnoreDataMemberAttribute");
IMessagePackSerializationCallbackReceiver = compilation.GetTypeByMetadataName("MessagePack.IMessagePackSerializationCallbackReceiver");
}
}
public class TypeCollector
{
const string CodegeneratorOnlyPreprocessorSymbol = "INCLUDE_ONLY_CODE_GENERATION";
static readonly SymbolDisplayFormat binaryWriteFormat = new SymbolDisplayFormat(
genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters,
miscellaneousOptions: SymbolDisplayMiscellaneousOptions.ExpandNullable,
typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameOnly);
static readonly SymbolDisplayFormat shortTypeNameFormat = new SymbolDisplayFormat(
typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypes);
readonly string csProjPath;
readonly bool isForceUseMap;
readonly ReferenceSymbols typeReferences;
readonly INamedTypeSymbol[] targetTypes;
readonly HashSet<string> embeddedTypes = new HashSet<string>(new string[]
{
"short",
"int",
"long",
"ushort",
"uint",
"ulong",
"float",
"double",
"bool",
"byte",
"sbyte",
"decimal",
"char",
"string",
"object",
"System.Guid",
"System.TimeSpan",
"System.DateTime",
"System.DateTimeOffset",
"MessagePack.Nil",
// and arrays
"short[]",
"int[]",
"long[]",
"ushort[]",
"uint[]",
"ulong[]",
"float[]",
"double[]",
"bool[]",
"byte[]",
"sbyte[]",
"decimal[]",
"char[]",
"string[]",
"System.DateTime[]",
"System.ArraySegment<byte>",
"System.ArraySegment<byte>?",
// extensions
"UnityEngine.Vector2",
"UnityEngine.Vector3",
"UnityEngine.Vector4",
"UnityEngine.Quaternion",
"UnityEngine.Color",
"UnityEngine.Bounds",
"UnityEngine.Rect",
"UnityEngine.AnimationCurve",
"UnityEngine.RectOffset",
"UnityEngine.Gradient",
"UnityEngine.WrapMode",
"UnityEngine.GradientMode",
"UnityEngine.Keyframe",
"UnityEngine.Matrix4x4",
"UnityEngine.GradientColorKey",
"UnityEngine.GradientAlphaKey",
"UnityEngine.Color32",
"UnityEngine.LayerMask",
"UnityEngine.Vector2Int",
"UnityEngine.Vector3Int",
"UnityEngine.RangeInt",
"UnityEngine.RectInt",
"UnityEngine.BoundsInt",
"System.Reactive.Unit",
});
readonly Dictionary<string, string> knownGenericTypes = new Dictionary<string, string>
{
{"System.Collections.Generic.List<>", "global::MessagePack.Formatters.ListFormatter<TREPLACE>" },
{"System.Collections.Generic.LinkedList<>", "global::MessagePack.Formatters.LinkedListFormatter<TREPLACE>"},
{"System.Collections.Generic.Queue<>", "global::MessagePack.Formatters.QeueueFormatter<TREPLACE>"},
{"System.Collections.Generic.Stack<>", "global::MessagePack.Formatters.StackFormatter<TREPLACE>"},
{"System.Collections.Generic.HashSet<>", "global::MessagePack.Formatters.HashSetFormatter<TREPLACE>"},
{"System.Collections.ObjectModel.ReadOnlyCollection<>", "global::MessagePack.Formatters.ReadOnlyCollectionFormatter<TREPLACE>"},
{"System.Collections.Generic.IList<>", "global::MessagePack.Formatters.InterfaceListFormatter<TREPLACE>"},
{"System.Collections.Generic.ICollection<>", "global::MessagePack.Formatters.InterfaceCollectionFormatter<TREPLACE>"},
{"System.Collections.Generic.IEnumerable<>", "global::MessagePack.Formatters.InterfaceEnumerableFormatter<TREPLACE>"},
{"System.Collections.Generic.Dictionary<,>", "global::MessagePack.Formatters.DictionaryFormatter<TREPLACE>"},
{"System.Collections.Generic.IDictionary<,>", "global::MessagePack.Formatters.InterfaceDictionaryFormatter<TREPLACE>"},
{"System.Collections.Generic.SortedDictionary<,>", "global::MessagePack.Formatters.SortedDictionaryFormatter<TREPLACE>"},
{"System.Collections.Generic.SortedList<,>", "global::MessagePack.Formatters.SortedListFormatter<TREPLACE>"},
{"System.Linq.ILookup<,>", "global::MessagePack.Formatters.InterfaceLookupFormatter<TREPLACE>"},
{"System.Linq.IGrouping<,>", "global::MessagePack.Formatters.InterfaceGroupingFormatter<TREPLACE>"},
{"System.Collections.ObjectModel.ObservableCollection<>", "global::MessagePack.Formatters.ObservableCollectionFormatter<TREPLACE>"},
{"System.Collections.ObjectModel.ReadOnlyObservableCollection<>", "global::MessagePack.Formatters.ReadOnlyObservableCollectionFormatter<TREPLACE>" },
{"System.Collections.Generic.IReadOnlyList<>", "global::MessagePack.Formatters.InterfaceReadOnlyListFormatter<TREPLACE>"},
{"System.Collections.Generic.IReadOnlyCollection<>", "global::MessagePack.Formatters.InterfaceReadOnlyCollectionFormatter<TREPLACE>"},
{"System.Collections.Generic.ISet<>", "global::MessagePack.Formatters.InterfaceSetFormatter<TREPLACE>"},
{"System.Collections.Concurrent.ConcurrentBag<>", "global::MessagePack.Formatters.ConcurrentBagFormatter<TREPLACE>"},
{"System.Collections.Concurrent.ConcurrentQueue<>", "global::MessagePack.Formatters.ConcurrentQueueFormatter<TREPLACE>"},
{"System.Collections.Concurrent.ConcurrentStack<>", "global::MessagePack.Formatters.ConcurrentStackFormatter<TREPLACE>"},
{"System.Collections.ObjectModel.ReadOnlyDictionary<,>", "global::MessagePack.Formatters.ReadOnlyDictionaryFormatter<TREPLACE>"},
{"System.Collections.Generic.IReadOnlyDictionary<,>", "global::MessagePack.Formatters.InterfaceReadOnlyDictionaryFormatter<TREPLACE>"},
{"System.Collections.Concurrent.ConcurrentDictionary<,>", "global::MessagePack.Formatters.ConcurrentDictionaryFormatter<TREPLACE>"},
{"System.Lazy<>", "global::MessagePack.Formatters.LazyFormatter<TREPLACE>"},
{"System.Threading.Tasks<>", "global::MessagePack.Formatters.TaskValueFormatter<TREPLACE>"},
{"System.Tuple<>", "global::MessagePack.Formatters.TupleFormatter<TREPLACE>"},
{"System.Tuple<,>", "global::MessagePack.Formatters.TupleFormatter<TREPLACE>"},
{"System.Tuple<,,>", "global::MessagePack.Formatters.TupleFormatter<TREPLACE>"},
{"System.Tuple<,,,>", "global::MessagePack.Formatters.TupleFormatter<TREPLACE>"},
{"System.Tuple<,,,,>", "global::MessagePack.Formatters.TupleFormatter<TREPLACE>"},
{"System.Tuple<,,,,,>", "global::MessagePack.Formatters.TupleFormatter<TREPLACE>"},
{"System.Tuple<,,,,,,>", "global::MessagePack.Formatters.TupleFormatter<TREPLACE>"},
{"System.Tuple<,,,,,,,>", "global::MessagePack.Formatters.TupleFormatter<TREPLACE>"},
{"System.ValueTuple<>", "global::MessagePack.Formatters.ValueTupleFormatter<TREPLACE>"},
{"System.ValueTuple<,>", "global::MessagePack.Formatters.ValueTupleFormatter<TREPLACE>"},
{"System.ValueTuple<,,>", "global::MessagePack.Formatters.ValueTupleFormatter<TREPLACE>"},
{"System.ValueTuple<,,,>", "global::MessagePack.Formatters.ValueTupleFormatter<TREPLACE>"},
{"System.ValueTuple<,,,,>", "global::MessagePack.Formatters.ValueTupleFormatter<TREPLACE>"},
{"System.ValueTuple<,,,,,>", "global::MessagePack.Formatters.ValueTupleFormatter<TREPLACE>"},
{"System.ValueTuple<,,,,,,>", "global::MessagePack.Formatters.ValueTupleFormatter<TREPLACE>"},
{"System.ValueTuple<,,,,,,,>", "global::MessagePack.Formatters.ValueTupleFormatter<TREPLACE>"},
{"System.Collections.Generic.KeyValuePair<,>", "global::MessagePack.Formatters.KeyValuePairFormatter<TREPLACE>"},
{"System.Threading.Tasks.ValueTask<>", "global::MessagePack.Formatters.KeyValuePairFormatter<TREPLACE>"},
{"System.ArraySegment<>", "global::MessagePack.Formatters.ArraySegmentFormatter<TREPLACE>"},
// extensions
{"System.Collections.Immutable.ImmutableArray<>", "global::MessagePack.ImmutableCollection.ImmutableArrayFormatter<TREPLACE>"},
{"System.Collections.Immutable.ImmutableList<>", "global::MessagePack.ImmutableCollection.ImmutableListFormatter<TREPLACE>"},
{"System.Collections.Immutable.ImmutableDictionary<,>", "global::MessagePack.ImmutableCollection.ImmutableDictionaryFormatter<TREPLACE>"},
{"System.Collections.Immutable.ImmutableHashSet<>", "global::MessagePack.ImmutableCollection.ImmutableHashSetFormatter<TREPLACE>"},
{"System.Collections.Immutable.ImmutableSortedDictionary<,>", "global::MessagePack.ImmutableCollection.ImmutableSortedDictionaryFormatter<TREPLACE>"},
{"System.Collections.Immutable.ImmutableSortedSet<>", "global::MessagePack.ImmutableCollection.ImmutableSortedSetFormatter<TREPLACE>"},
{"System.Collections.Immutable.ImmutableQueue<>", "global::MessagePack.ImmutableCollection.ImmutableQueueFormatter<TREPLACE>"},
{"System.Collections.Immutable.ImmutableStack<>", "global::MessagePack.ImmutableCollection.ImmutableStackFormatter<TREPLACE>"},
{"System.Collections.Immutable.IImmutableList<>", "global::MessagePack.ImmutableCollection.InterfaceImmutableListFormatter<TREPLACE>"},
{"System.Collections.Immutable.IImmutableDictionary<,>", "global::MessagePack.ImmutableCollection.InterfaceImmutableDictionaryFormatter<TREPLACE>"},
{"System.Collections.Immutable.IImmutableQueue<>", "global::MessagePack.ImmutableCollection.InterfaceImmutableQueueFormatter<TREPLACE>"},
{"System.Collections.Immutable.IImmutableSet<>", "global::MessagePack.ImmutableCollection.InterfaceImmutableSetFormatter<TREPLACE>"},
{"System.Collections.Immutable.IImmutableStack<>", "global::MessagePack.ImmutableCollection.InterfaceImmutableStackFormatter<TREPLACE>"},
{"Reactive.Bindings.ReactiveProperty<>", "global::MessagePack.ReactivePropertyExtension.ReactivePropertyFormatter<TREPLACE>"},
{"Reactive.Bindings.IReactiveProperty<>", "global::MessagePack.ReactivePropertyExtension.InterfaceReactivePropertyFormatter<TREPLACE>"},
{"Reactive.Bindings.IReadOnlyReactiveProperty<>", "global::MessagePack.ReactivePropertyExtension.InterfaceReadOnlyReactivePropertyFormatter<TREPLACE>"},
{"Reactive.Bindings.ReactiveCollection<>", "global::MessagePack.ReactivePropertyExtension.ReactiveCollectionFormatter<TREPLACE>"},
};
readonly bool disallowInternal;
// visitor workspace:
HashSet<ITypeSymbol> alreadyCollected;
List<ObjectSerializationInfo> collectedObjectInfo;
List<EnumSerializationInfo> collectedEnumInfo;
List<GenericSerializationInfo> collectedGenericInfo;
List<UnionSerializationInfo> collectedUnionInfo;
// ---
public TypeCollector(string csProjPath, IEnumerable<string> conditinalSymbols, bool disallowInternal, bool isForceUseMap)
{
this.csProjPath = csProjPath;
var compilation = RoslynExtensions.GetCompilationFromProject(csProjPath, conditinalSymbols.Concat(new[] { CodegeneratorOnlyPreprocessorSymbol }).ToArray()).GetAwaiter().GetResult();
this.typeReferences = new ReferenceSymbols(compilation);
this.disallowInternal = disallowInternal;
this.isForceUseMap = isForceUseMap;
targetTypes = compilation.GetNamedTypeSymbols()
.Where(x =>
{
if (x.DeclaredAccessibility == Accessibility.Public) return true;
if (!disallowInternal)
{
return (x.DeclaredAccessibility == Accessibility.Friend);
}
return false;
})
.Where(x =>
((x.TypeKind == TypeKind.Interface) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.UnionAttribute))
|| ((x.TypeKind == TypeKind.Class && x.IsAbstract) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.UnionAttribute))
|| ((x.TypeKind == TypeKind.Class) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribute))
|| ((x.TypeKind == TypeKind.Struct) && x.GetAttributes().Any(x2 => x2.AttributeClass == typeReferences.MessagePackObjectAttribute))
)
.ToArray();
}
void ResetWorkspace()
{
alreadyCollected = new HashSet<ITypeSymbol>();
collectedObjectInfo = new List<ObjectSerializationInfo>();
collectedEnumInfo = new List<EnumSerializationInfo>();
collectedGenericInfo = new List<GenericSerializationInfo>();
collectedUnionInfo = new List<UnionSerializationInfo>();
}
// EntryPoint
public (ObjectSerializationInfo[] objectInfo, EnumSerializationInfo[] enumInfo, GenericSerializationInfo[] genericInfo, UnionSerializationInfo[] unionInfo) Collect()
{
ResetWorkspace();
foreach (var item in targetTypes)
{
CollectCore(item);
}
return (collectedObjectInfo.ToArray(), collectedEnumInfo.ToArray(), collectedGenericInfo.Distinct().ToArray(), collectedUnionInfo.ToArray());
}
// Gate of recursive collect
void CollectCore(ITypeSymbol typeSymbol)
{
if (!alreadyCollected.Add(typeSymbol))
{
return;
}
if (embeddedTypes.Contains(typeSymbol.ToString()))
{
return;
}
if (typeSymbol.TypeKind == TypeKind.Array)
{
CollectArray(typeSymbol as IArrayTypeSymbol);
return;
}
if (!IsAllowAccessibility(typeSymbol))
{
return;
}
var type = typeSymbol as INamedTypeSymbol;
if (typeSymbol.TypeKind == TypeKind.Enum)
{
CollectEnum(type);
return;
}
if (type.IsGenericType)
{
CollectGeneric(type);
return;
}
if (type.Locations[0].IsInMetadata)
{
return;
}
if (type.TypeKind == TypeKind.Interface || (type.TypeKind == TypeKind.Class && type.IsAbstract))
{
CollectUnion(type);
return;
}
CollectObject(type);
return;
}
void CollectEnum(INamedTypeSymbol type)
{
var info = new EnumSerializationInfo
{
Name = type.Name,
Namespace = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString(),
FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
UnderlyingType = type.EnumUnderlyingType.ToDisplayString(binaryWriteFormat)
};
collectedEnumInfo.Add(info);
}
void CollectUnion(INamedTypeSymbol type)
{
var unionAttrs = type.GetAttributes().Where(x => x.AttributeClass == typeReferences.UnionAttribute).Select(x => x.ConstructorArguments).ToArray();
if (unionAttrs.Length == 0)
{
throw new MessagePackGeneratorResolveFailedException("Serialization Type must mark UnionAttribute." + " type: " + type.Name);
}
// 0, Int 1, SubType
var info = new UnionSerializationInfo
{
Name = type.Name,
Namespace = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString(),
FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
SubTypes = unionAttrs.Select(x => new UnionSubTypeInfo
{
Key = (int)x[0].Value,
Type = (x[1].Value as ITypeSymbol).ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
}).OrderBy(x => x.Key).ToArray()
};
collectedUnionInfo.Add(info);
}
void CollectArray(IArrayTypeSymbol array)
{
var elemType = array.ElementType;
CollectCore(elemType);
var info = new GenericSerializationInfo
{
FullName = array.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
};
if (array.IsSZArray)
{
info.FormatterName = $"global::MessagePack.Formatters.ArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>";
}
else if (array.Rank == 2)
{
info.FormatterName = $"global::MessagePack.Formatters.TwoDimentionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>";
}
else if (array.Rank == 3)
{
info.FormatterName = $"global::MessagePack.Formatters.ThreeDimentionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>";
}
else if (array.Rank == 4)
{
info.FormatterName = $"global::MessagePack.Formatters.FourDimentionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>";
}
else
{
throw new InvalidOperationException("does not supports array dimention, " + info.FullName);
}
collectedGenericInfo.Add(info);
return;
}
void CollectGeneric(INamedTypeSymbol type)
{
var genericType = type.ConstructUnboundGenericType();
var genericTypeString = genericType.ToDisplayString();
var fullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
// special case
if (fullName == "global::System.ArraySegment<byte>" || fullName == "global::System.ArraySegment<byte>?")
{
return;
}
// nullable
if (genericTypeString == "T?")
{
CollectCore(type.TypeArguments[0]);
if (!embeddedTypes.Contains(type.TypeArguments[0].ToString()))
{
var info = new GenericSerializationInfo
{
FormatterName = $"global::MessagePack.Formatters.NullableFormatter<{type.TypeArguments[0].ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>",
FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
};
collectedGenericInfo.Add(info);
}
return;
}
// collection
if (knownGenericTypes.TryGetValue(genericTypeString, out var formatter))
{
foreach (var item in type.TypeArguments)
{
CollectCore(item);
}
var typeArgs = string.Join(", ", type.TypeArguments.Select(x => x.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)));
var f = formatter.Replace("TREPLACE", typeArgs);
var info = new GenericSerializationInfo
{
FormatterName = f,
FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
};
collectedGenericInfo.Add(info);
if (genericTypeString == "System.Linq.ILookup<,>")
{
formatter = knownGenericTypes["System.Linq.IGrouping<,>"];
f = formatter.Replace("TREPLACE", typeArgs);
var groupingInfo = new GenericSerializationInfo
{
FormatterName = f,
FullName = $"global::System.Linq.IGrouping<{typeArgs}>",
};
collectedGenericInfo.Add(groupingInfo);
formatter = knownGenericTypes["System.Collections.Generic.IEnumerable<>"];
typeArgs = type.TypeArguments[1].ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
f = formatter.Replace("TREPLACE", typeArgs);
var enumerableInfo = new GenericSerializationInfo
{
FormatterName = f,
FullName = $"global::System.Collections.Generic.IEnumerable<{typeArgs}>",
};
collectedGenericInfo.Add(enumerableInfo);
}
}
}
void CollectObject(INamedTypeSymbol type)
{
var isClass = !type.IsValueType;
var contractAttr = type.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.MessagePackObjectAttribute);
if (contractAttr == null)
{
throw new MessagePackGeneratorResolveFailedException("Serialization Object must mark MessagePackObjectAttribute." + " type: " + type.Name);
}
var isIntKey = true;
var intMemebrs = new Dictionary<int, MemberSerializationInfo>();
var stringMembers = new Dictionary<string, MemberSerializationInfo>();
if (isForceUseMap || (bool)contractAttr.ConstructorArguments[0].Value)
{
// All public members are serialize target except [Ignore] member.
isIntKey = false;
var hiddenIntKey = 0;
foreach (var item in type.GetAllMembers().OfType<IPropertySymbol>().Where(x => !x.IsOverride))
{
if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue;
var member = new MemberSerializationInfo
{
IsReadable = (item.GetMethod != null) && item.GetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic,
IsWritable = (item.SetMethod != null) && item.SetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic,
StringKey = item.Name,
IsProperty = true,
IsField = false,
Name = item.Name,
Type = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
ShortTypeName = item.Type.ToDisplayString(binaryWriteFormat)
};
if (!member.IsReadable && !member.IsWritable) continue;
member.IntKey = hiddenIntKey++;
stringMembers.Add(member.StringKey, member);
CollectCore(item.Type); // recursive collect
}
foreach (var item in type.GetAllMembers().OfType<IFieldSymbol>())
{
if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue;
if (item.IsImplicitlyDeclared) continue;
var member = new MemberSerializationInfo
{
IsReadable = item.DeclaredAccessibility == Accessibility.Public && !item.IsStatic,
IsWritable = item.DeclaredAccessibility == Accessibility.Public && !item.IsReadOnly && !item.IsStatic,
StringKey = item.Name,
IsProperty = false,
IsField = true,
Name = item.Name,
Type = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
ShortTypeName = item.Type.ToDisplayString(binaryWriteFormat)
};
if (!member.IsReadable && !member.IsWritable) continue;
member.IntKey = hiddenIntKey++;
stringMembers.Add(member.StringKey, member);
CollectCore(item.Type); // recursive collect
}
}
else
{
// Only KeyAttribute members
var searchFirst = true;
var hiddenIntKey = 0;
foreach (var item in type.GetAllMembers().OfType<IPropertySymbol>())
{
if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute || x.AttributeClass == typeReferences.IgnoreDataMemberAttribute)) continue;
var member = new MemberSerializationInfo
{
IsReadable = (item.GetMethod != null) && item.GetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic,
IsWritable = (item.SetMethod != null) && item.SetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic,
IsProperty = true,
IsField = false,
Name = item.Name,
Type = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
ShortTypeName = item.Type.ToDisplayString(binaryWriteFormat)
};
if (!member.IsReadable && !member.IsWritable) continue;
var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribute)?.ConstructorArguments[0];
if (key == null) throw new MessagePackGeneratorResolveFailedException("all public members must mark KeyAttribute or IgnoreMemberAttribute." + " type: " + type.Name + " member:" + item.Name);
var intKey = (key.Value.Value is int) ? (int)key.Value.Value : (int?)null;
var stringKey = (key.Value.Value is string) ? (string)key.Value.Value : (string)null;
if (intKey == null && stringKey == null) throw new MessagePackGeneratorResolveFailedException("both IntKey and StringKey are null." + " type: " + type.Name + " member:" + item.Name);
if (searchFirst)
{
searchFirst = false;
isIntKey = intKey != null;
}
else
{
if ((isIntKey && intKey == null) || (!isIntKey && stringKey == null))
{
throw new MessagePackGeneratorResolveFailedException("all members key type must be same." + " type: " + type.Name + " member:" + item.Name);
}
}
if (isIntKey)
{
member.IntKey = (int)intKey;
if (intMemebrs.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name);
intMemebrs.Add(member.IntKey, member);
}
else
{
member.StringKey = (string)stringKey;
if (stringMembers.ContainsKey(member.StringKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name);
member.IntKey = hiddenIntKey++;
stringMembers.Add(member.StringKey, member);
}
CollectCore(item.Type); // recursive collect
}
foreach (var item in type.GetAllMembers().OfType<IFieldSymbol>())
{
if (item.IsImplicitlyDeclared) continue;
if (item.GetAttributes().Any(x => x.AttributeClass == typeReferences.IgnoreAttribute)) continue;
var member = new MemberSerializationInfo
{
IsReadable = item.DeclaredAccessibility == Accessibility.Public && !item.IsStatic,
IsWritable = item.DeclaredAccessibility == Accessibility.Public && !item.IsReadOnly && !item.IsStatic,
IsProperty = true,
IsField = false,
Name = item.Name,
Type = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
ShortTypeName = item.Type.ToDisplayString(binaryWriteFormat)
};
if (!member.IsReadable && !member.IsWritable) continue;
var key = item.GetAttributes().FirstOrDefault(x => x.AttributeClass == typeReferences.KeyAttribute)?.ConstructorArguments[0];
if (key == null) throw new MessagePackGeneratorResolveFailedException("all public members must mark KeyAttribute or IgnoreMemberAttribute." + " type: " + type.Name + " member:" + item.Name);
var intKey = (key.Value.Value is int) ? (int)key.Value.Value : (int?)null;
var stringKey = (key.Value.Value is string) ? (string)key.Value.Value : (string)null;
if (intKey == null && stringKey == null) throw new MessagePackGeneratorResolveFailedException("both IntKey and StringKey are null." + " type: " + type.Name + " member:" + item.Name);
if (searchFirst)
{
searchFirst = false;
isIntKey = intKey != null;
}
else
{
if ((isIntKey && intKey == null) || (!isIntKey && stringKey == null))
{
throw new MessagePackGeneratorResolveFailedException("all members key type must be same." + " type: " + type.Name + " member:" + item.Name);
}
}
if (isIntKey)
{
member.IntKey = (int)intKey;
if (intMemebrs.ContainsKey(member.IntKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name);
intMemebrs.Add(member.IntKey, member);
}
else
{
member.StringKey = (string)stringKey;
if (stringMembers.ContainsKey(member.StringKey)) throw new MessagePackGeneratorResolveFailedException("key is duplicated, all members key must be unique." + " type: " + type.Name + " member:" + item.Name);
member.IntKey = hiddenIntKey++;
stringMembers.Add(member.StringKey, member);
}
CollectCore(item.Type); // recursive collect
}
}
// GetConstructor
IEnumerator<IMethodSymbol> ctorEnumerator = null;
var ctor = type.Constructors.Where(x => x.DeclaredAccessibility == Accessibility.Public).SingleOrDefault(x => x.GetAttributes().Any(y => y.AttributeClass == typeReferences.SerializationConstructorAttribute));
if (ctor == null)
{
ctorEnumerator =
type.Constructors.Where(x => x.DeclaredAccessibility == Accessibility.Public && !x.IsImplicitlyDeclared).OrderBy(x => x.Parameters.Length)
.Concat(type.Constructors.Where(x => x.DeclaredAccessibility == Accessibility.Public).OrderBy(x => x.Parameters.Length).Take(1))
.GetEnumerator();
if (ctorEnumerator.MoveNext())
{
ctor = ctorEnumerator.Current;
}
}
// struct allows null ctor
if (ctor == null && isClass) throw new MessagePackGeneratorResolveFailedException("can't find public constructor. type:" + type.Name);
var constructorParameters = new List<MemberSerializationInfo>();
if (ctor != null)
{
var constructorLookupDictionary = stringMembers.ToLookup(x => x.Key, x => x, StringComparer.OrdinalIgnoreCase);
do
{
constructorParameters.Clear();
var ctorParamIndex = 0;
foreach (var item in ctor.Parameters)
{
MemberSerializationInfo paramMember;
if (isIntKey)
{
if (intMemebrs.TryGetValue(ctorParamIndex, out paramMember))
{
if (item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) == paramMember.Type && paramMember.IsReadable)
{
constructorParameters.Add(paramMember);
}
else
{
if (ctorEnumerator != null)
{
ctor = null;
continue;
}
else
{
throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, parameterType mismatch. type:" + type.Name + " parameterIndex:" + ctorParamIndex + " paramterType:" + item.Type.Name);
}
}
}
else
{
if (ctorEnumerator != null)
{
ctor = null;
continue;
}
else
{
throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, index not found. type:" + type.Name + " parameterIndex:" + ctorParamIndex);
}
}
}
else
{
var hasKey = constructorLookupDictionary[item.Name];
var len = hasKey.Count();
if (len != 0)
{
if (len != 1)
{
if (ctorEnumerator != null)
{
ctor = null;
continue;
}
else
{
throw new MessagePackGeneratorResolveFailedException("duplicate matched constructor parameter name:" + type.Name + " parameterName:" + item.Name + " paramterType:" + item.Type.Name);
}
}
paramMember = hasKey.First().Value;
if (item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat) == paramMember.Type && paramMember.IsReadable)
{
constructorParameters.Add(paramMember);
}
else
{
if (ctorEnumerator != null)
{
ctor = null;
continue;
}
else
{
throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, parameterType mismatch. type:" + type.Name + " parameterName:" + item.Name + " paramterType:" + item.Type.Name);
}
}
}
else
{
if (ctorEnumerator != null)
{
ctor = null;
continue;
}
else
{
throw new MessagePackGeneratorResolveFailedException("can't find matched constructor parameter, index not found. type:" + type.Name + " parameterName:" + item.Name);
}
}
}
ctorParamIndex++;
}
} while (TryGetNextConstructor(ctorEnumerator, ref ctor));
if (ctor == null)
{
throw new MessagePackGeneratorResolveFailedException("can't find matched constructor. type:" + type.Name);
}
}
var hasSerializationConstructor = type.AllInterfaces.Any(x => x == typeReferences.IMessagePackSerializationCallbackReceiver);
var needsCastOnBefore = true;
var needsCastOnAfter = true;
if (hasSerializationConstructor)
{
needsCastOnBefore = !type.GetMembers("OnBeforeSerialize").Any();
needsCastOnAfter = !type.GetMembers("OnAfterDeserialize").Any();
}
var info = new ObjectSerializationInfo
{
IsClass = isClass,
ConstructorParameters = constructorParameters.ToArray(),
IsIntKey = isIntKey,
Members = (isIntKey) ? intMemebrs.Values.ToArray() : stringMembers.Values.ToArray(),
Name = type.ToDisplayString(shortTypeNameFormat).Replace(".", "_"),
FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
Namespace = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString(),
HasIMessagePackSerializationCallbackReceiver = hasSerializationConstructor,
NeedsCastOnAfter = needsCastOnAfter,
NeedsCastOnBefore = needsCastOnBefore
};
collectedObjectInfo.Add(info);
}
static bool TryGetNextConstructor(IEnumerator<IMethodSymbol> ctorEnumerator, ref IMethodSymbol ctor)
{
if (ctorEnumerator == null || ctor != null)
{
return false;
}
if (ctorEnumerator.MoveNext())
{
ctor = ctorEnumerator.Current;
return true;
}
else
{
ctor = null;
return false;
}
}
bool IsAllowAccessibility(ITypeSymbol symbol)
{
do
{
if (symbol.DeclaredAccessibility != Accessibility.Public)
{
if (disallowInternal)
{
return false;
}
if (symbol.DeclaredAccessibility != Accessibility.Internal)
{
return true;
}
}
symbol = symbol.ContainingType;
} while (symbol != null);
return true;
}
}
public class MessagePackGeneratorResolveFailedException : Exception
{
public MessagePackGeneratorResolveFailedException(string message)
: base(message)
{
}
}
}

Просмотреть файл

@ -0,0 +1,391 @@
// ------------------------------------------------------------------------------
// <auto-generated>
// このコードはツールによって生成されました。
// ランタイム バージョン: 15.0.0.0
//
// このファイルへの変更は、正しくない動作の原因になる可能性があり、
// コードが再生成されると失われます。
// </auto-generated>
// ------------------------------------------------------------------------------
namespace MessagePack.CodeGenerator.Generator
{
using System.Linq;
using System.Text;
using System.Collections.Generic;
using System;
/// <summary>
/// Class to produce the template output
/// </summary>
#line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt"
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")]
public partial class EnumTemplate : EnumTemplateBase
{
#line hidden
/// <summary>
/// Create the template output
/// </summary>
public virtual string TransformText()
{
this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" +
" 414\r\n#pragma warning disable 168\r\n\r\nnamespace ");
#line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(Namespace));
#line default
#line hidden
this.Write("\r\n{\r\n using System;\r\n using MessagePack;\r\n\r\n");
#line 16 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt"
foreach(var info in enumSerializationInfos) {
#line default
#line hidden
this.Write(" public sealed class ");
#line 17 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.Name));
#line default
#line hidden
this.Write("Formatter : global::MessagePack.Formatters.IMessagePackFormatter<");
#line 17 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName));
#line default
#line hidden
this.Write(">\r\n {\r\n public int Serialize(ref byte[] bytes, int offset, ");
#line 19 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName));
#line default
#line hidden
this.Write(" value, global::MessagePack.IFormatterResolver formatterResolver)\r\n {\r\n " +
" return MessagePackBinary.Write");
#line 21 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.UnderlyingType));
#line default
#line hidden
this.Write("(ref bytes, offset, (");
#line 21 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.UnderlyingType));
#line default
#line hidden
this.Write(")value);\r\n }\r\n \r\n public ");
#line 24 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName));
#line default
#line hidden
this.Write(" Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver for" +
"matterResolver, out int readSize)\r\n {\r\n return (");
#line 26 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName));
#line default
#line hidden
this.Write(")MessagePackBinary.Read");
#line 26 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.UnderlyingType));
#line default
#line hidden
this.Write("(bytes, offset, out readSize);\r\n }\r\n }\r\n\r\n");
#line 30 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\EnumTemplate.tt"
}
#line default
#line hidden
this.Write("\r\n}\r\n\r\n#pragma warning restore 168\r\n#pragma warning restore 414\r\n#pragma warning " +
"restore 618\r\n#pragma warning restore 612");
return this.GenerationEnvironment.ToString();
}
}
#line default
#line hidden
#region Base class
/// <summary>
/// Base class for this transformation
/// </summary>
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")]
public class EnumTemplateBase
{
#region Fields
private global::System.Text.StringBuilder generationEnvironmentField;
private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField;
private global::System.Collections.Generic.List<int> indentLengthsField;
private string currentIndentField = "";
private bool endsWithNewline;
private global::System.Collections.Generic.IDictionary<string, object> sessionField;
#endregion
#region Properties
/// <summary>
/// The string builder that generation-time code is using to assemble generated output
/// </summary>
protected System.Text.StringBuilder GenerationEnvironment
{
get
{
if ((this.generationEnvironmentField == null))
{
this.generationEnvironmentField = new global::System.Text.StringBuilder();
}
return this.generationEnvironmentField;
}
set
{
this.generationEnvironmentField = value;
}
}
/// <summary>
/// The error collection for the generation process
/// </summary>
public System.CodeDom.Compiler.CompilerErrorCollection Errors
{
get
{
if ((this.errorsField == null))
{
this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection();
}
return this.errorsField;
}
}
/// <summary>
/// A list of the lengths of each indent that was added with PushIndent
/// </summary>
private System.Collections.Generic.List<int> indentLengths
{
get
{
if ((this.indentLengthsField == null))
{
this.indentLengthsField = new global::System.Collections.Generic.List<int>();
}
return this.indentLengthsField;
}
}
/// <summary>
/// Gets the current indent we use when adding lines to the output
/// </summary>
public string CurrentIndent
{
get
{
return this.currentIndentField;
}
}
/// <summary>
/// Current transformation session
/// </summary>
public virtual global::System.Collections.Generic.IDictionary<string, object> Session
{
get
{
return this.sessionField;
}
set
{
this.sessionField = value;
}
}
#endregion
#region Transform-time helpers
/// <summary>
/// Write text directly into the generated output
/// </summary>
public void Write(string textToAppend)
{
if (string.IsNullOrEmpty(textToAppend))
{
return;
}
// If we're starting off, or if the previous text ended with a newline,
// we have to append the current indent first.
if (((this.GenerationEnvironment.Length == 0)
|| this.endsWithNewline))
{
this.GenerationEnvironment.Append(this.currentIndentField);
this.endsWithNewline = false;
}
// Check if the current text ends with a newline
if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture))
{
this.endsWithNewline = true;
}
// This is an optimization. If the current indent is "", then we don't have to do any
// of the more complex stuff further down.
if ((this.currentIndentField.Length == 0))
{
this.GenerationEnvironment.Append(textToAppend);
return;
}
// Everywhere there is a newline in the text, add an indent after it
textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField));
// If the text ends with a newline, then we should strip off the indent added at the very end
// because the appropriate indent will be added when the next time Write() is called
if (this.endsWithNewline)
{
this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length));
}
else
{
this.GenerationEnvironment.Append(textToAppend);
}
}
/// <summary>
/// Write text directly into the generated output
/// </summary>
public void WriteLine(string textToAppend)
{
this.Write(textToAppend);
this.GenerationEnvironment.AppendLine();
this.endsWithNewline = true;
}
/// <summary>
/// Write formatted text directly into the generated output
/// </summary>
public void Write(string format, params object[] args)
{
this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args));
}
/// <summary>
/// Write formatted text directly into the generated output
/// </summary>
public void WriteLine(string format, params object[] args)
{
this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args));
}
/// <summary>
/// Raise an error
/// </summary>
public void Error(string message)
{
System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError();
error.ErrorText = message;
this.Errors.Add(error);
}
/// <summary>
/// Raise a warning
/// </summary>
public void Warning(string message)
{
System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError();
error.ErrorText = message;
error.IsWarning = true;
this.Errors.Add(error);
}
/// <summary>
/// Increase the indent
/// </summary>
public void PushIndent(string indent)
{
if ((indent == null))
{
throw new global::System.ArgumentNullException("indent");
}
this.currentIndentField = (this.currentIndentField + indent);
this.indentLengths.Add(indent.Length);
}
/// <summary>
/// Remove the last indent that was added with PushIndent
/// </summary>
public string PopIndent()
{
string returnValue = "";
if ((this.indentLengths.Count > 0))
{
int indentLength = this.indentLengths[(this.indentLengths.Count - 1)];
this.indentLengths.RemoveAt((this.indentLengths.Count - 1));
if ((indentLength > 0))
{
returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength));
this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength));
}
}
return returnValue;
}
/// <summary>
/// Remove any indentation
/// </summary>
public void ClearIndent()
{
this.indentLengths.Clear();
this.currentIndentField = "";
}
#endregion
#region ToString Helpers
/// <summary>
/// Utility class to produce culture-oriented representation of an object as a string.
/// </summary>
public class ToStringInstanceHelper
{
private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture;
/// <summary>
/// Gets or sets format provider to be used by ToStringWithCulture method.
/// </summary>
public System.IFormatProvider FormatProvider
{
get
{
return this.formatProviderField ;
}
set
{
if ((value != null))
{
this.formatProviderField = value;
}
}
}
/// <summary>
/// This is called from the compile/run appdomain to convert objects within an expression block to a string
/// </summary>
public string ToStringWithCulture(object objectToConvert)
{
if ((objectToConvert == null))
{
throw new global::System.ArgumentNullException("objectToConvert");
}
System.Type t = objectToConvert.GetType();
System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] {
typeof(System.IFormatProvider)});
if ((method == null))
{
return objectToConvert.ToString();
}
else
{
return ((string)(method.Invoke(objectToConvert, new object[] {
this.formatProviderField })));
}
}
}
private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper();
/// <summary>
/// Helper to produce culture-oriented representation of an object as a string
/// </summary>
public ToStringInstanceHelper ToStringHelper
{
get
{
return this.toStringHelperField;
}
}
#endregion
}
#endregion
}

Просмотреть файл

@ -0,0 +1,818 @@
// ------------------------------------------------------------------------------
// <auto-generated>
// このコードはツールによって生成されました。
// ランタイム バージョン: 15.0.0.0
//
// このファイルへの変更は、正しくない動作の原因になる可能性があり、
// コードが再生成されると失われます。
// </auto-generated>
// ------------------------------------------------------------------------------
namespace MessagePack.CodeGenerator.Generator
{
using System.Linq;
using System.Text;
using System.Collections.Generic;
using System;
/// <summary>
/// Class to produce the template output
/// </summary>
#line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")]
public partial class FormatterTemplate : FormatterTemplateBase
{
#line hidden
/// <summary>
/// Create the template output
/// </summary>
public virtual string TransformText()
{
this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" +
" 414\r\n#pragma warning disable 168\r\n\r\nnamespace ");
#line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(Namespace));
#line default
#line hidden
this.Write("\r\n{\r\n using System;\r\n using MessagePack;\r\n\r\n");
#line 16 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
foreach(var objInfo in objectSerializationInfos) {
#line default
#line hidden
this.Write("\r\n public sealed class ");
#line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.Name));
#line default
#line hidden
this.Write("Formatter : global::MessagePack.Formatters.IMessagePackFormatter<");
#line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
#line default
#line hidden
this.Write(">\r\n {\r\n");
#line 20 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
if( objInfo.IsStringKey) {
#line default
#line hidden
this.Write("\r\n readonly global::MessagePack.Internal.AutomataDictionary ____keyMapping" +
";\r\n readonly byte[][] ____stringByteKeys;\r\n\r\n public ");
#line 25 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.Name));
#line default
#line hidden
this.Write("Formatter()\r\n {\r\n this.____keyMapping = new global::MessagePack" +
".Internal.AutomataDictionary()\r\n {\r\n");
#line 29 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
foreach(var x in objInfo.Members) {
#line default
#line hidden
this.Write(" { \"");
#line 30 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(x.StringKey));
#line default
#line hidden
this.Write("\", ");
#line 30 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(x.IntKey));
#line default
#line hidden
this.Write("},\r\n");
#line 31 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
this.Write(" };\r\n\r\n this.____stringByteKeys = new byte[][]\r\n " +
" {\r\n");
#line 36 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
foreach(var x in objInfo.Members.Where(x => x.IsReadable)) {
#line default
#line hidden
this.Write(" global::MessagePack.MessagePackBinary.GetEncodedStringBytes(\"");
#line 37 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(x.StringKey));
#line default
#line hidden
this.Write("\"),\r\n");
#line 38 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
this.Write(" \r\n };\r\n }\r\n\r\n");
#line 42 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
this.Write("\r\n public int Serialize(ref byte[] bytes, int offset, ");
#line 44 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
#line default
#line hidden
this.Write(" value, global::MessagePack.IFormatterResolver formatterResolver)\r\n {\r\n");
#line 46 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
if( objInfo.IsClass) {
#line default
#line hidden
this.Write(" if (value == null)\r\n {\r\n return global::Mes" +
"sagePack.MessagePackBinary.WriteNil(ref bytes, offset);\r\n }\r\n");
#line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
this.Write(" \r\n");
#line 52 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnBefore) {
#line default
#line hidden
this.Write(" ((IMessagePackSerializationCallbackReceiver)value).OnBeforeSerialize(" +
");\r\n");
#line 54 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
} else if(objInfo.HasIMessagePackSerializationCallbackReceiver) {
#line default
#line hidden
this.Write(" value.OnBeforeSerialize();\r\n");
#line 56 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
this.Write(" var startOffset = offset;\r\n");
#line 58 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
if( objInfo.IsIntKey) { if( (objInfo.MaxKey + 1) <= 15) {
#line default
#line hidden
this.Write(" offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeader" +
"Unsafe(ref bytes, offset, ");
#line 59 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.MaxKey + 1));
#line default
#line hidden
this.Write(");\r\n");
#line 60 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
} else {
#line default
#line hidden
this.Write(" offset += global::MessagePack.MessagePackBinary.WriteArrayHeader(ref " +
"bytes, offset, ");
#line 61 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.MaxKey + 1));
#line default
#line hidden
this.Write(");\r\n");
#line 62 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
} } else if( objInfo.WriteCount <= 15) {
#line default
#line hidden
this.Write(" offset += global::MessagePack.MessagePackBinary.WriteFixedMapHeaderUn" +
"safe(ref bytes, offset, ");
#line 63 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.WriteCount));
#line default
#line hidden
this.Write(");\r\n");
#line 64 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
} else {
#line default
#line hidden
this.Write(" offset += global::MessagePack.MessagePackBinary.WriteMapHeader(ref by" +
"tes, offset, ");
#line 65 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.WriteCount));
#line default
#line hidden
this.Write(");\r\n");
#line 66 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
#line 67 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
if(objInfo.IsIntKey) {
#line default
#line hidden
#line 68 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
for(var i =0; i<= objInfo.MaxKey; i++) { var member = objInfo.GetMember(i);
#line default
#line hidden
#line 69 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
if( member == null) {
#line default
#line hidden
this.Write(" offset += global::MessagePack.MessagePackBinary.WriteNil(ref bytes, o" +
"ffset);\r\n");
#line 71 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
} else {
#line default
#line hidden
this.Write(" offset += ");
#line 72 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(member.GetSerializeMethodString()));
#line default
#line hidden
this.Write(";\r\n");
#line 73 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
} } } else {
#line default
#line hidden
#line 74 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
var index = 0; foreach(var x in objInfo.Members) {
#line default
#line hidden
this.Write(" offset += global::MessagePack.MessagePackBinary.WriteRaw(ref bytes, o" +
"ffset, this.____stringByteKeys[");
#line 75 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(index++));
#line default
#line hidden
this.Write("]);\r\n offset += ");
#line 76 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(x.GetSerializeMethodString()));
#line default
#line hidden
this.Write(";\r\n");
#line 77 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
} }
#line default
#line hidden
this.Write(" return offset - startOffset;\r\n }\r\n\r\n public ");
#line 81 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
#line default
#line hidden
this.Write(" Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver for" +
"matterResolver, out int readSize)\r\n {\r\n if (global::MessagePac" +
"k.MessagePackBinary.IsNil(bytes, offset))\r\n {\r\n");
#line 85 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
if( objInfo.IsClass) {
#line default
#line hidden
this.Write(" readSize = 1;\r\n return null;\r\n");
#line 88 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
} else {
#line default
#line hidden
this.Write(" throw new InvalidOperationException(\"typecode is null, struct not" +
" supported\");\r\n");
#line 90 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
this.Write(" }\r\n\r\n var startOffset = offset;\r\n");
#line 94 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
if(objInfo.IsStringKey) {
#line default
#line hidden
this.Write(" var length = global::MessagePack.MessagePackBinary.ReadMapHeader(byte" +
"s, offset, out readSize);\r\n");
#line 96 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
} else {
#line default
#line hidden
this.Write(" var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(by" +
"tes, offset, out readSize);\r\n");
#line 98 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
this.Write(" offset += readSize;\r\n\r\n");
#line 101 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
foreach(var x in objInfo.Members) {
#line default
#line hidden
this.Write(" var __");
#line 102 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(x.Name));
#line default
#line hidden
this.Write("__ = default(");
#line 102 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(x.Type));
#line default
#line hidden
this.Write(");\r\n");
#line 103 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
this.Write("\r\n for (int i = 0; i < length; i++)\r\n {\r\n");
#line 107 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
if(objInfo.IsStringKey) {
#line default
#line hidden
this.Write(@" var stringKey = global::MessagePack.MessagePackBinary.ReadStringSegment(bytes, offset, out readSize);
offset += readSize;
int key;
if (!____keyMapping.TryGetValueSafe(stringKey, out key))
{
readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset);
goto NEXT_LOOP;
}
");
#line 116 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
} else {
#line default
#line hidden
this.Write(" var key = i;\r\n");
#line 118 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
this.Write("\r\n switch (key)\r\n {\r\n");
#line 122 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
foreach(var x in objInfo.Members) {
#line default
#line hidden
this.Write(" case ");
#line 123 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(x.IntKey));
#line default
#line hidden
this.Write(":\r\n __");
#line 124 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(x.Name));
#line default
#line hidden
this.Write("__ = ");
#line 124 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(x.GetDeserializeMethodString()));
#line default
#line hidden
this.Write(";\r\n break;\r\n");
#line 126 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
this.Write(" default:\r\n readSize = global::MessageP" +
"ack.MessagePackBinary.ReadNextBlock(bytes, offset);\r\n bre" +
"ak;\r\n }\r\n");
#line 131 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
if(objInfo.IsStringKey) {
#line default
#line hidden
this.Write(" \r\n NEXT_LOOP:\r\n");
#line 133 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
this.Write(" offset += readSize;\r\n }\r\n\r\n readSize = offs" +
"et - startOffset;\r\n\r\n var ____result = new ");
#line 139 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString()));
#line default
#line hidden
this.Write(";\r\n");
#line 140 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
foreach(var x in objInfo.Members.Where(x => x.IsWritable)) {
#line default
#line hidden
this.Write(" ____result.");
#line 141 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(x.Name));
#line default
#line hidden
this.Write(" = __");
#line 141 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(x.Name));
#line default
#line hidden
this.Write("__;\r\n");
#line 142 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
#line 143 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
if(objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnAfter) {
#line default
#line hidden
this.Write(" ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeseri" +
"alize();\r\n");
#line 145 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
} else if(objInfo.HasIMessagePackSerializationCallbackReceiver) {
#line default
#line hidden
this.Write(" ____result.OnAfterDeserialize();\r\n");
#line 147 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
this.Write(" return ____result;\r\n }\r\n }\r\n\r\n");
#line 152 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\FormatterTemplate.tt"
}
#line default
#line hidden
this.Write("}\r\n\r\n#pragma warning restore 168\r\n#pragma warning restore 414\r\n#pragma warning re" +
"store 618\r\n#pragma warning restore 612");
return this.GenerationEnvironment.ToString();
}
}
#line default
#line hidden
#region Base class
/// <summary>
/// Base class for this transformation
/// </summary>
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")]
public class FormatterTemplateBase
{
#region Fields
private global::System.Text.StringBuilder generationEnvironmentField;
private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField;
private global::System.Collections.Generic.List<int> indentLengthsField;
private string currentIndentField = "";
private bool endsWithNewline;
private global::System.Collections.Generic.IDictionary<string, object> sessionField;
#endregion
#region Properties
/// <summary>
/// The string builder that generation-time code is using to assemble generated output
/// </summary>
protected System.Text.StringBuilder GenerationEnvironment
{
get
{
if ((this.generationEnvironmentField == null))
{
this.generationEnvironmentField = new global::System.Text.StringBuilder();
}
return this.generationEnvironmentField;
}
set
{
this.generationEnvironmentField = value;
}
}
/// <summary>
/// The error collection for the generation process
/// </summary>
public System.CodeDom.Compiler.CompilerErrorCollection Errors
{
get
{
if ((this.errorsField == null))
{
this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection();
}
return this.errorsField;
}
}
/// <summary>
/// A list of the lengths of each indent that was added with PushIndent
/// </summary>
private System.Collections.Generic.List<int> indentLengths
{
get
{
if ((this.indentLengthsField == null))
{
this.indentLengthsField = new global::System.Collections.Generic.List<int>();
}
return this.indentLengthsField;
}
}
/// <summary>
/// Gets the current indent we use when adding lines to the output
/// </summary>
public string CurrentIndent
{
get
{
return this.currentIndentField;
}
}
/// <summary>
/// Current transformation session
/// </summary>
public virtual global::System.Collections.Generic.IDictionary<string, object> Session
{
get
{
return this.sessionField;
}
set
{
this.sessionField = value;
}
}
#endregion
#region Transform-time helpers
/// <summary>
/// Write text directly into the generated output
/// </summary>
public void Write(string textToAppend)
{
if (string.IsNullOrEmpty(textToAppend))
{
return;
}
// If we're starting off, or if the previous text ended with a newline,
// we have to append the current indent first.
if (((this.GenerationEnvironment.Length == 0)
|| this.endsWithNewline))
{
this.GenerationEnvironment.Append(this.currentIndentField);
this.endsWithNewline = false;
}
// Check if the current text ends with a newline
if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture))
{
this.endsWithNewline = true;
}
// This is an optimization. If the current indent is "", then we don't have to do any
// of the more complex stuff further down.
if ((this.currentIndentField.Length == 0))
{
this.GenerationEnvironment.Append(textToAppend);
return;
}
// Everywhere there is a newline in the text, add an indent after it
textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField));
// If the text ends with a newline, then we should strip off the indent added at the very end
// because the appropriate indent will be added when the next time Write() is called
if (this.endsWithNewline)
{
this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length));
}
else
{
this.GenerationEnvironment.Append(textToAppend);
}
}
/// <summary>
/// Write text directly into the generated output
/// </summary>
public void WriteLine(string textToAppend)
{
this.Write(textToAppend);
this.GenerationEnvironment.AppendLine();
this.endsWithNewline = true;
}
/// <summary>
/// Write formatted text directly into the generated output
/// </summary>
public void Write(string format, params object[] args)
{
this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args));
}
/// <summary>
/// Write formatted text directly into the generated output
/// </summary>
public void WriteLine(string format, params object[] args)
{
this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args));
}
/// <summary>
/// Raise an error
/// </summary>
public void Error(string message)
{
System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError();
error.ErrorText = message;
this.Errors.Add(error);
}
/// <summary>
/// Raise a warning
/// </summary>
public void Warning(string message)
{
System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError();
error.ErrorText = message;
error.IsWarning = true;
this.Errors.Add(error);
}
/// <summary>
/// Increase the indent
/// </summary>
public void PushIndent(string indent)
{
if ((indent == null))
{
throw new global::System.ArgumentNullException("indent");
}
this.currentIndentField = (this.currentIndentField + indent);
this.indentLengths.Add(indent.Length);
}
/// <summary>
/// Remove the last indent that was added with PushIndent
/// </summary>
public string PopIndent()
{
string returnValue = "";
if ((this.indentLengths.Count > 0))
{
int indentLength = this.indentLengths[(this.indentLengths.Count - 1)];
this.indentLengths.RemoveAt((this.indentLengths.Count - 1));
if ((indentLength > 0))
{
returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength));
this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength));
}
}
return returnValue;
}
/// <summary>
/// Remove any indentation
/// </summary>
public void ClearIndent()
{
this.indentLengths.Clear();
this.currentIndentField = "";
}
#endregion
#region ToString Helpers
/// <summary>
/// Utility class to produce culture-oriented representation of an object as a string.
/// </summary>
public class ToStringInstanceHelper
{
private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture;
/// <summary>
/// Gets or sets format provider to be used by ToStringWithCulture method.
/// </summary>
public System.IFormatProvider FormatProvider
{
get
{
return this.formatProviderField ;
}
set
{
if ((value != null))
{
this.formatProviderField = value;
}
}
}
/// <summary>
/// This is called from the compile/run appdomain to convert objects within an expression block to a string
/// </summary>
public string ToStringWithCulture(object objectToConvert)
{
if ((objectToConvert == null))
{
throw new global::System.ArgumentNullException("objectToConvert");
}
System.Type t = objectToConvert.GetType();
System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] {
typeof(System.IFormatProvider)});
if ((method == null))
{
return objectToConvert.ToString();
}
else
{
return ((string)(method.Invoke(objectToConvert, new object[] {
this.formatProviderField })));
}
}
}
private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper();
/// <summary>
/// Helper to produce culture-oriented representation of an object as a string
/// </summary>
public ToStringInstanceHelper ToStringHelper
{
get
{
return this.toStringHelperField;
}
}
#endregion
}
#endregion
}

Просмотреть файл

@ -0,0 +1,455 @@
// ------------------------------------------------------------------------------
// <auto-generated>
// このコードはツールによって生成されました。
// ランタイム バージョン: 15.0.0.0
//
// このファイルへの変更は、正しくない動作の原因になる可能性があり、
// コードが再生成されると失われます。
// </auto-generated>
// ------------------------------------------------------------------------------
namespace MessagePack.CodeGenerator.Generator
{
using System.Linq;
using System.Text;
using System.Collections.Generic;
using System;
/// <summary>
/// Class to produce the template output
/// </summary>
#line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")]
public partial class ResolverTemplate : ResolverTemplateBase
{
#line hidden
/// <summary>
/// Create the template output
/// </summary>
public virtual string TransformText()
{
this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" +
" 414\r\n#pragma warning disable 168\r\n\r\nnamespace ");
#line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(Namespace));
#line default
#line hidden
this.Write("\r\n{\r\n using System;\r\n using MessagePack;\r\n\r\n public class ");
#line 16 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName));
#line default
#line hidden
this.Write(" : global::MessagePack.IFormatterResolver\r\n {\r\n public static readonly " +
"global::MessagePack.IFormatterResolver Instance = new ");
#line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName));
#line default
#line hidden
this.Write("();\r\n\r\n ");
#line 20 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName));
#line default
#line hidden
this.Write(@"()
{
}
public global::MessagePack.Formatters.IMessagePackFormatter<T> GetFormatter<T>()
{
return FormatterCache<T>.formatter;
}
static class FormatterCache<T>
{
public static readonly global::MessagePack.Formatters.IMessagePackFormatter<T> formatter;
static FormatterCache()
{
var f = ");
#line 36 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName));
#line default
#line hidden
this.Write(@"GetFormatterHelper.GetFormatter(typeof(T));
if (f != null)
{
formatter = (global::MessagePack.Formatters.IMessagePackFormatter<T>)f;
}
}
}
}
internal static class ");
#line 45 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName));
#line default
#line hidden
this.Write("GetFormatterHelper\r\n {\r\n static readonly global::System.Collections.Gen" +
"eric.Dictionary<Type, int> lookup;\r\n\r\n static ");
#line 49 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(ResolverName));
#line default
#line hidden
this.Write("GetFormatterHelper()\r\n {\r\n lookup = new global::System.Collecti" +
"ons.Generic.Dictionary<Type, int>(");
#line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(registerInfos.Length));
#line default
#line hidden
this.Write(")\r\n {\r\n");
#line 53 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
for(var i = 0; i < registerInfos.Length; i++) { var x = registerInfos[i];
#line default
#line hidden
this.Write(" {typeof(");
#line 54 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(x.FullName));
#line default
#line hidden
this.Write("), ");
#line 54 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(i));
#line default
#line hidden
this.Write(" },\r\n");
#line 55 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
}
#line default
#line hidden
this.Write(" };\r\n }\r\n\r\n internal static object GetFormatter(Type t)\r" +
"\n {\r\n int key;\r\n if (!lookup.TryGetValue(t, out key" +
")) return null;\r\n\r\n switch (key)\r\n {\r\n");
#line 66 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
for(var i = 0; i < registerInfos.Length; i++) { var x = registerInfos[i];
#line default
#line hidden
this.Write(" case ");
#line 67 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(i));
#line default
#line hidden
this.Write(": return new ");
#line 67 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(x.FormatterName.StartsWith("global::") ? x.FormatterName: (!string.IsNullOrEmpty(FormatterNamespace) ? FormatterNamespace + "." : FormatterNamespace) + x.FormatterName));
#line default
#line hidden
this.Write("();\r\n");
#line 68 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\ResolverTemplate.tt"
}
#line default
#line hidden
this.Write(" default: return null;\r\n }\r\n }\r\n }\r\n}\r\n\r\n#pra" +
"gma warning restore 168\r\n#pragma warning restore 414\r\n#pragma warning restore 61" +
"8\r\n#pragma warning restore 612");
return this.GenerationEnvironment.ToString();
}
}
#line default
#line hidden
#region Base class
/// <summary>
/// Base class for this transformation
/// </summary>
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")]
public class ResolverTemplateBase
{
#region Fields
private global::System.Text.StringBuilder generationEnvironmentField;
private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField;
private global::System.Collections.Generic.List<int> indentLengthsField;
private string currentIndentField = "";
private bool endsWithNewline;
private global::System.Collections.Generic.IDictionary<string, object> sessionField;
#endregion
#region Properties
/// <summary>
/// The string builder that generation-time code is using to assemble generated output
/// </summary>
protected System.Text.StringBuilder GenerationEnvironment
{
get
{
if ((this.generationEnvironmentField == null))
{
this.generationEnvironmentField = new global::System.Text.StringBuilder();
}
return this.generationEnvironmentField;
}
set
{
this.generationEnvironmentField = value;
}
}
/// <summary>
/// The error collection for the generation process
/// </summary>
public System.CodeDom.Compiler.CompilerErrorCollection Errors
{
get
{
if ((this.errorsField == null))
{
this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection();
}
return this.errorsField;
}
}
/// <summary>
/// A list of the lengths of each indent that was added with PushIndent
/// </summary>
private System.Collections.Generic.List<int> indentLengths
{
get
{
if ((this.indentLengthsField == null))
{
this.indentLengthsField = new global::System.Collections.Generic.List<int>();
}
return this.indentLengthsField;
}
}
/// <summary>
/// Gets the current indent we use when adding lines to the output
/// </summary>
public string CurrentIndent
{
get
{
return this.currentIndentField;
}
}
/// <summary>
/// Current transformation session
/// </summary>
public virtual global::System.Collections.Generic.IDictionary<string, object> Session
{
get
{
return this.sessionField;
}
set
{
this.sessionField = value;
}
}
#endregion
#region Transform-time helpers
/// <summary>
/// Write text directly into the generated output
/// </summary>
public void Write(string textToAppend)
{
if (string.IsNullOrEmpty(textToAppend))
{
return;
}
// If we're starting off, or if the previous text ended with a newline,
// we have to append the current indent first.
if (((this.GenerationEnvironment.Length == 0)
|| this.endsWithNewline))
{
this.GenerationEnvironment.Append(this.currentIndentField);
this.endsWithNewline = false;
}
// Check if the current text ends with a newline
if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture))
{
this.endsWithNewline = true;
}
// This is an optimization. If the current indent is "", then we don't have to do any
// of the more complex stuff further down.
if ((this.currentIndentField.Length == 0))
{
this.GenerationEnvironment.Append(textToAppend);
return;
}
// Everywhere there is a newline in the text, add an indent after it
textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField));
// If the text ends with a newline, then we should strip off the indent added at the very end
// because the appropriate indent will be added when the next time Write() is called
if (this.endsWithNewline)
{
this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length));
}
else
{
this.GenerationEnvironment.Append(textToAppend);
}
}
/// <summary>
/// Write text directly into the generated output
/// </summary>
public void WriteLine(string textToAppend)
{
this.Write(textToAppend);
this.GenerationEnvironment.AppendLine();
this.endsWithNewline = true;
}
/// <summary>
/// Write formatted text directly into the generated output
/// </summary>
public void Write(string format, params object[] args)
{
this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args));
}
/// <summary>
/// Write formatted text directly into the generated output
/// </summary>
public void WriteLine(string format, params object[] args)
{
this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args));
}
/// <summary>
/// Raise an error
/// </summary>
public void Error(string message)
{
System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError();
error.ErrorText = message;
this.Errors.Add(error);
}
/// <summary>
/// Raise a warning
/// </summary>
public void Warning(string message)
{
System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError();
error.ErrorText = message;
error.IsWarning = true;
this.Errors.Add(error);
}
/// <summary>
/// Increase the indent
/// </summary>
public void PushIndent(string indent)
{
if ((indent == null))
{
throw new global::System.ArgumentNullException("indent");
}
this.currentIndentField = (this.currentIndentField + indent);
this.indentLengths.Add(indent.Length);
}
/// <summary>
/// Remove the last indent that was added with PushIndent
/// </summary>
public string PopIndent()
{
string returnValue = "";
if ((this.indentLengths.Count > 0))
{
int indentLength = this.indentLengths[(this.indentLengths.Count - 1)];
this.indentLengths.RemoveAt((this.indentLengths.Count - 1));
if ((indentLength > 0))
{
returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength));
this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength));
}
}
return returnValue;
}
/// <summary>
/// Remove any indentation
/// </summary>
public void ClearIndent()
{
this.indentLengths.Clear();
this.currentIndentField = "";
}
#endregion
#region ToString Helpers
/// <summary>
/// Utility class to produce culture-oriented representation of an object as a string.
/// </summary>
public class ToStringInstanceHelper
{
private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture;
/// <summary>
/// Gets or sets format provider to be used by ToStringWithCulture method.
/// </summary>
public System.IFormatProvider FormatProvider
{
get
{
return this.formatProviderField ;
}
set
{
if ((value != null))
{
this.formatProviderField = value;
}
}
}
/// <summary>
/// This is called from the compile/run appdomain to convert objects within an expression block to a string
/// </summary>
public string ToStringWithCulture(object objectToConvert)
{
if ((objectToConvert == null))
{
throw new global::System.ArgumentNullException("objectToConvert");
}
System.Type t = objectToConvert.GetType();
System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] {
typeof(System.IFormatProvider)});
if ((method == null))
{
return objectToConvert.ToString();
}
else
{
return ((string)(method.Invoke(objectToConvert, new object[] {
this.formatProviderField })));
}
}
}
private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper();
/// <summary>
/// Helper to produce culture-oriented representation of an object as a string
/// </summary>
public ToStringInstanceHelper ToStringHelper
{
get
{
return this.toStringHelperField;
}
}
#endregion
}
#endregion
}

Просмотреть файл

@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MessagePack.CodeGenerator.Generator
{
public partial class FormatterTemplate
{
public string Namespace;
public ObjectSerializationInfo[] objectSerializationInfos;
}
public partial class ResolverTemplate
{
public string Namespace;
public string FormatterNamespace { get; set; }
public string ResolverName = "GeneratedResolver";
public IResolverRegisterInfo[] registerInfos;
}
public partial class EnumTemplate
{
public string Namespace;
public EnumSerializationInfo[] enumSerializationInfos;
}
public partial class UnionTemplate
{
public string Namespace;
public UnionSerializationInfo[] unionSerializationInfos;
}
}

Просмотреть файл

@ -0,0 +1,584 @@
// ------------------------------------------------------------------------------
// <auto-generated>
// このコードはツールによって生成されました。
// ランタイム バージョン: 15.0.0.0
//
// このファイルへの変更は、正しくない動作の原因になる可能性があり、
// コードが再生成されると失われます。
// </auto-generated>
// ------------------------------------------------------------------------------
namespace MessagePack.CodeGenerator.Generator
{
using System.Linq;
using System.Text;
using System.Collections.Generic;
using System;
/// <summary>
/// Class to produce the template output
/// </summary>
#line 1 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")]
public partial class UnionTemplate : UnionTemplateBase
{
#line hidden
/// <summary>
/// Create the template output
/// </summary>
public virtual string TransformText()
{
this.Write("#pragma warning disable 618\r\n#pragma warning disable 612\r\n#pragma warning disable" +
" 414\r\n#pragma warning disable 168\r\n\r\nnamespace ");
#line 11 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(Namespace));
#line default
#line hidden
this.Write("\r\n{\r\n using System;\r\n using System.Collections.Generic;\r\n using MessageP" +
"ack;\r\n\r\n");
#line 17 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
foreach(var info in unionSerializationInfos) {
#line default
#line hidden
this.Write(" public sealed class ");
#line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.Name));
#line default
#line hidden
this.Write("Formatter : global::MessagePack.Formatters.IMessagePackFormatter<");
#line 18 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName));
#line default
#line hidden
this.Write(">\r\n {\r\n readonly Dictionary<RuntimeTypeHandle, KeyValuePair<int, int>> " +
"typeToKeyAndJumpMap;\r\n readonly Dictionary<int, int> keyToJumpMap;\r\n\r\n " +
" public ");
#line 23 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.Name));
#line default
#line hidden
this.Write("Formatter()\r\n {\r\n this.typeToKeyAndJumpMap = new Dictionary<Run" +
"timeTypeHandle, KeyValuePair<int, int>>(");
#line 25 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.SubTypes.Length));
#line default
#line hidden
this.Write(", global::MessagePack.Internal.RuntimeTypeHandleEqualityComparer.Default)\r\n " +
" {\r\n");
#line 27 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i];
#line default
#line hidden
this.Write(" { typeof(");
#line 28 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(item.Type));
#line default
#line hidden
this.Write(").TypeHandle, new KeyValuePair<int, int>(");
#line 28 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(item.Key));
#line default
#line hidden
this.Write(", ");
#line 28 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(i));
#line default
#line hidden
this.Write(") },\r\n");
#line 29 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
}
#line default
#line hidden
this.Write(" };\r\n this.keyToJumpMap = new Dictionary<int, int>(");
#line 31 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.SubTypes.Length));
#line default
#line hidden
this.Write(")\r\n {\r\n");
#line 33 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i];
#line default
#line hidden
this.Write(" { ");
#line 34 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(item.Key));
#line default
#line hidden
this.Write(", ");
#line 34 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(i));
#line default
#line hidden
this.Write(" },\r\n");
#line 35 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
}
#line default
#line hidden
this.Write(" };\r\n }\r\n\r\n public int Serialize(ref byte[] bytes, int o" +
"ffset, ");
#line 39 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName));
#line default
#line hidden
this.Write(@" value, global::MessagePack.IFormatterResolver formatterResolver)
{
KeyValuePair<int, int> keyValuePair;
if (value != null && this.typeToKeyAndJumpMap.TryGetValue(value.GetType().TypeHandle, out keyValuePair))
{
var startOffset = offset;
offset += MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2);
offset += MessagePackBinary.WriteInt32(ref bytes, offset, keyValuePair.Key);
switch (keyValuePair.Value)
{
");
#line 49 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i];
#line default
#line hidden
this.Write(" case ");
#line 50 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(i));
#line default
#line hidden
this.Write(":\r\n offset += formatterResolver.GetFormatterWithVerify<");
#line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(item.Type));
#line default
#line hidden
this.Write(">().Serialize(ref bytes, offset, (");
#line 51 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(item.Type));
#line default
#line hidden
this.Write(")value, formatterResolver);\r\n break;\r\n");
#line 53 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
}
#line default
#line hidden
this.Write(" default:\r\n break;\r\n }\r\n" +
"\r\n return offset - startOffset;\r\n }\r\n\r\n ret" +
"urn MessagePackBinary.WriteNil(ref bytes, offset);\r\n }\r\n \r\n " +
" public ");
#line 64 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName));
#line default
#line hidden
this.Write(@" Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize)
{
if (MessagePackBinary.IsNil(bytes, offset))
{
readSize = 1;
return null;
}
var startOffset = offset;
if (MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize) != 2)
{
throw new InvalidOperationException(""Invalid Union data was detected. Type:");
#line 76 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName));
#line default
#line hidden
this.Write(@""");
}
offset += readSize;
var key = MessagePackBinary.ReadInt32(bytes, offset, out readSize);
offset += readSize;
if (!this.keyToJumpMap.TryGetValue(key, out key))
{
key = -1;
}
");
#line 88 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName));
#line default
#line hidden
this.Write(" result = null;\r\n switch (key)\r\n {\r\n");
#line 91 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
for(var i = 0; i < info.SubTypes.Length; i++) { var item = info.SubTypes[i];
#line default
#line hidden
this.Write(" case ");
#line 92 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(i));
#line default
#line hidden
this.Write(":\r\n result = (");
#line 93 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(info.FullName));
#line default
#line hidden
this.Write(")formatterResolver.GetFormatterWithVerify<");
#line 93 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(item.Type));
#line default
#line hidden
this.Write(">().Deserialize(bytes, offset, formatterResolver, out readSize);\r\n " +
" offset += readSize;\r\n break;\r\n");
#line 96 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
}
#line default
#line hidden
this.Write(@" default:
offset += MessagePackBinary.ReadNextBlock(bytes, offset);
break;
}
readSize = offset - startOffset;
return result;
}
}
");
#line 108 "C:\Users\y.kawai\Documents\neuecc\MessagePack-CSharp\src\MessagePack.CodeGenerator\Generator\UnionTemplate.tt"
}
#line default
#line hidden
this.Write("\r\n}\r\n\r\n#pragma warning restore 168\r\n#pragma warning restore 414\r\n#pragma warning " +
"restore 618\r\n#pragma warning restore 612");
return this.GenerationEnvironment.ToString();
}
}
#line default
#line hidden
#region Base class
/// <summary>
/// Base class for this transformation
/// </summary>
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")]
public class UnionTemplateBase
{
#region Fields
private global::System.Text.StringBuilder generationEnvironmentField;
private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField;
private global::System.Collections.Generic.List<int> indentLengthsField;
private string currentIndentField = "";
private bool endsWithNewline;
private global::System.Collections.Generic.IDictionary<string, object> sessionField;
#endregion
#region Properties
/// <summary>
/// The string builder that generation-time code is using to assemble generated output
/// </summary>
protected System.Text.StringBuilder GenerationEnvironment
{
get
{
if ((this.generationEnvironmentField == null))
{
this.generationEnvironmentField = new global::System.Text.StringBuilder();
}
return this.generationEnvironmentField;
}
set
{
this.generationEnvironmentField = value;
}
}
/// <summary>
/// The error collection for the generation process
/// </summary>
public System.CodeDom.Compiler.CompilerErrorCollection Errors
{
get
{
if ((this.errorsField == null))
{
this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection();
}
return this.errorsField;
}
}
/// <summary>
/// A list of the lengths of each indent that was added with PushIndent
/// </summary>
private System.Collections.Generic.List<int> indentLengths
{
get
{
if ((this.indentLengthsField == null))
{
this.indentLengthsField = new global::System.Collections.Generic.List<int>();
}
return this.indentLengthsField;
}
}
/// <summary>
/// Gets the current indent we use when adding lines to the output
/// </summary>
public string CurrentIndent
{
get
{
return this.currentIndentField;
}
}
/// <summary>
/// Current transformation session
/// </summary>
public virtual global::System.Collections.Generic.IDictionary<string, object> Session
{
get
{
return this.sessionField;
}
set
{
this.sessionField = value;
}
}
#endregion
#region Transform-time helpers
/// <summary>
/// Write text directly into the generated output
/// </summary>
public void Write(string textToAppend)
{
if (string.IsNullOrEmpty(textToAppend))
{
return;
}
// If we're starting off, or if the previous text ended with a newline,
// we have to append the current indent first.
if (((this.GenerationEnvironment.Length == 0)
|| this.endsWithNewline))
{
this.GenerationEnvironment.Append(this.currentIndentField);
this.endsWithNewline = false;
}
// Check if the current text ends with a newline
if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture))
{
this.endsWithNewline = true;
}
// This is an optimization. If the current indent is "", then we don't have to do any
// of the more complex stuff further down.
if ((this.currentIndentField.Length == 0))
{
this.GenerationEnvironment.Append(textToAppend);
return;
}
// Everywhere there is a newline in the text, add an indent after it
textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField));
// If the text ends with a newline, then we should strip off the indent added at the very end
// because the appropriate indent will be added when the next time Write() is called
if (this.endsWithNewline)
{
this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length));
}
else
{
this.GenerationEnvironment.Append(textToAppend);
}
}
/// <summary>
/// Write text directly into the generated output
/// </summary>
public void WriteLine(string textToAppend)
{
this.Write(textToAppend);
this.GenerationEnvironment.AppendLine();
this.endsWithNewline = true;
}
/// <summary>
/// Write formatted text directly into the generated output
/// </summary>
public void Write(string format, params object[] args)
{
this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args));
}
/// <summary>
/// Write formatted text directly into the generated output
/// </summary>
public void WriteLine(string format, params object[] args)
{
this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args));
}
/// <summary>
/// Raise an error
/// </summary>
public void Error(string message)
{
System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError();
error.ErrorText = message;
this.Errors.Add(error);
}
/// <summary>
/// Raise a warning
/// </summary>
public void Warning(string message)
{
System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError();
error.ErrorText = message;
error.IsWarning = true;
this.Errors.Add(error);
}
/// <summary>
/// Increase the indent
/// </summary>
public void PushIndent(string indent)
{
if ((indent == null))
{
throw new global::System.ArgumentNullException("indent");
}
this.currentIndentField = (this.currentIndentField + indent);
this.indentLengths.Add(indent.Length);
}
/// <summary>
/// Remove the last indent that was added with PushIndent
/// </summary>
public string PopIndent()
{
string returnValue = "";
if ((this.indentLengths.Count > 0))
{
int indentLength = this.indentLengths[(this.indentLengths.Count - 1)];
this.indentLengths.RemoveAt((this.indentLengths.Count - 1));
if ((indentLength > 0))
{
returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength));
this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength));
}
}
return returnValue;
}
/// <summary>
/// Remove any indentation
/// </summary>
public void ClearIndent()
{
this.indentLengths.Clear();
this.currentIndentField = "";
}
#endregion
#region ToString Helpers
/// <summary>
/// Utility class to produce culture-oriented representation of an object as a string.
/// </summary>
public class ToStringInstanceHelper
{
private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture;
/// <summary>
/// Gets or sets format provider to be used by ToStringWithCulture method.
/// </summary>
public System.IFormatProvider FormatProvider
{
get
{
return this.formatProviderField ;
}
set
{
if ((value != null))
{
this.formatProviderField = value;
}
}
}
/// <summary>
/// This is called from the compile/run appdomain to convert objects within an expression block to a string
/// </summary>
public string ToStringWithCulture(object objectToConvert)
{
if ((objectToConvert == null))
{
throw new global::System.ArgumentNullException("objectToConvert");
}
System.Type t = objectToConvert.GetType();
System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] {
typeof(System.IFormatProvider)});
if ((method == null))
{
return objectToConvert.ToString();
}
else
{
return ((string)(method.Invoke(objectToConvert, new object[] {
this.formatProviderField })));
}
}
}
private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper();
/// <summary>
/// Helper to produce culture-oriented representation of an object as a string
/// </summary>
public ToStringInstanceHelper ToStringHelper
{
get
{
return this.toStringHelperField;
}
}
#endregion
}
#endregion
}

Просмотреть файл

@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Buildalyzer.Workspaces" Version="2.2.0" />
</ItemGroup>
</Project>

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -0,0 +1,179 @@
using MessagePack.CodeGenerator.Generator;
using Mono.Options;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MessagePack.CodeGenerator
{
class CommandlineArguments
{
public string InputPath { get; private set; }
public string OutputPath { get; private set; }
public List<string> ConditionalSymbols { get; private set; }
public string ResolverName { get; private set; }
public string NamespaceRoot { get; private set; }
public bool IsUseMap { get; private set; }
public bool IsParsed { get; set; }
public CommandlineArguments(string[] args)
{
ConditionalSymbols = new List<string>();
NamespaceRoot = "MessagePack";
ResolverName = "GeneratedResolver";
IsUseMap = false;
var option = new OptionSet()
{
{ "i|input=", "[required]Input path of analyze csproj", x => { InputPath = x; } },
{ "o|output=", "[required]Output file path", x => { OutputPath = x; } },
{ "c|conditionalsymbol=", "[optional, default=empty]conditional compiler symbol", x => { ConditionalSymbols.AddRange(x.Split(',')); } },
{ "r|resolvername=", "[optional, default=GeneratedResolver]Set resolver name", x => { ResolverName = x; } },
{ "n|namespace=", "[optional, default=MessagePack]Set namespace root name", x => { NamespaceRoot = x; } },
{ "m|usemapmode", "[optional, default=false]Force use map mode serialization", x => { IsUseMap = true; } },
};
if (args.Length == 0)
{
goto SHOW_HELP;
}
else
{
option.Parse(args);
if (InputPath == null || OutputPath == null)
{
Console.WriteLine("Invalid Argument:" + string.Join(" ", args));
Console.WriteLine();
goto SHOW_HELP;
}
IsParsed = true;
return;
}
SHOW_HELP:
Console.WriteLine("mpc arguments help:");
option.WriteOptionDescriptions(Console.Out);
IsParsed = false;
}
public string GetNamespaceDot()
{
return string.IsNullOrWhiteSpace(NamespaceRoot) ? "" : NamespaceRoot + ".";
}
}
class Program
{
static void Main(string[] args)
{
var cmdArgs = new CommandlineArguments(args);
if (!cmdArgs.IsParsed)
{
return;
}
// Generator Start...
var sw = Stopwatch.StartNew();
Console.WriteLine("Project Compilation Start:" + cmdArgs.InputPath);
var collector = new TypeCollector(cmdArgs.InputPath, cmdArgs.ConditionalSymbols, true, cmdArgs.IsUseMap);
Console.WriteLine("Project Compilation Complete:" + sw.Elapsed.ToString());
Console.WriteLine();
sw.Restart();
Console.WriteLine("Method Collect Start");
var (objectInfo, enumInfo, genericInfo, unionInfo) = collector.Collect();
Console.WriteLine("Method Collect Complete:" + sw.Elapsed.ToString());
Console.WriteLine("Output Generation Start");
sw.Restart();
var objectFormatterTemplates = objectInfo
.GroupBy(x => x.Namespace)
.Select(x => new FormatterTemplate()
{
Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key),
objectSerializationInfos = x.ToArray(),
})
.ToArray();
var enumFormatterTemplates = enumInfo
.GroupBy(x => x.Namespace)
.Select(x => new EnumTemplate()
{
Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key),
enumSerializationInfos = x.ToArray()
})
.ToArray();
var unionFormatterTemplates = unionInfo
.GroupBy(x => x.Namespace)
.Select(x => new UnionTemplate()
{
Namespace = cmdArgs.GetNamespaceDot() + "Formatters" + ((x.Key == null) ? "" : "." + x.Key),
unionSerializationInfos = x.ToArray()
})
.ToArray();
var resolverTemplate = new ResolverTemplate()
{
Namespace = cmdArgs.GetNamespaceDot() + "Resolvers",
FormatterNamespace = cmdArgs.GetNamespaceDot() + "Formatters",
ResolverName = cmdArgs.ResolverName,
registerInfos = genericInfo.Cast<IResolverRegisterInfo>().Concat(enumInfo).Concat(unionInfo).Concat(objectInfo).ToArray()
};
var sb = new StringBuilder();
sb.AppendLine(resolverTemplate.TransformText());
sb.AppendLine();
foreach (var item in enumFormatterTemplates)
{
var text = item.TransformText();
sb.AppendLine(text);
}
sb.AppendLine();
foreach (var item in unionFormatterTemplates)
{
var text = item.TransformText();
sb.AppendLine(text);
}
sb.AppendLine();
foreach (var item in objectFormatterTemplates)
{
var text = item.TransformText();
sb.AppendLine(text);
}
Output(cmdArgs.OutputPath, sb.ToString());
Console.WriteLine("String Generation Complete:" + sw.Elapsed.ToString());
}
static void Output(string path, string text)
{
path = path.Replace("global::", "");
const string prefix = "[Out]";
Console.WriteLine(prefix + path);
var fi = new FileInfo(path);
if (!fi.Directory.Exists)
{
fi.Directory.Create();
}
System.IO.File.WriteAllText(path, text, Encoding.UTF8);
}
}
}

Просмотреть файл

@ -0,0 +1,214 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Buildalyzer;
using Buildalyzer.Workspaces;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Buildalyzer.Environment;
namespace MessagePack.CodeGenerator
{
// Utility and Extension methods for Roslyn
internal static class RoslynExtensions
{
public static async Task<Compilation> GetCompilationFromProject(string csprojPath, params string[] preprocessorSymbols)
{
var analyzerOptions = new AnalyzerManagerOptions();
// analyzerOptions.LogWriter = Console.Out;
var manager = new AnalyzerManager();
var projectAnalyzer = manager.GetProject(csprojPath); // addproj
// projectAnalyzer.AddBuildLogger(new Microsoft.Build.Logging.ConsoleLogger(Microsoft.Build.Framework.LoggerVerbosity.Minimal));
var workspace = manager.GetWorkspaceWithPreventBuildEvent();
workspace.WorkspaceFailed += WorkSpaceFailed;
var project = workspace.CurrentSolution.Projects.First();
project = project
.WithParseOptions((project.ParseOptions as CSharpParseOptions).WithPreprocessorSymbols(preprocessorSymbols))
.WithCompilationOptions((project.CompilationOptions as CSharpCompilationOptions).WithAllowUnsafe(true));
var compilation = await project.GetCompilationAsync().ConfigureAwait(false);
return compilation;
}
private static void WorkSpaceFailed(object sender, WorkspaceDiagnosticEventArgs e)
{
Console.WriteLine(e);
}
public static AdhocWorkspace GetWorkspaceWithPreventBuildEvent(this AnalyzerManager manager)
{
// info article: https://qiita.com/skitoy4321/items/9edfb094549f5167a57f
var projPath = manager.Projects.First().Value.ProjectFile.Path;
var tempPath = Path.Combine(new FileInfo(projPath).Directory.FullName, "__buildtemp") + System.IO.Path.DirectorySeparatorChar;
var envopts = new EnvironmentOptions();
// "Clean" and "Build" is listed in default
// Modify to designtime system https://github.com/dotnet/project-system/blob/master/docs/design-time-builds.md#targets-that-run-during-design-time-builds
// that prevent Pre/PostBuildEvent
envopts.TargetsToBuild.Clear();
// Clean should not use(if use pre/post build, dll was deleted).
// envopts.TargetsToBuild.Add("Clean");
envopts.TargetsToBuild.Add("ResolveAssemblyReferencesDesignTime");
envopts.TargetsToBuild.Add("ResolveProjectReferencesDesignTime");
envopts.TargetsToBuild.Add("ResolveComReferencesDesignTime");
envopts.TargetsToBuild.Add("Compile");
envopts.GlobalProperties["IntermediateOutputPath"] = tempPath;
try
{
return GetWorkspace(manager, envopts);
}
finally
{
if (Directory.Exists(tempPath))
{
Directory.Delete(tempPath, true);
}
}
}
public static AdhocWorkspace GetWorkspace(this AnalyzerManager manager, EnvironmentOptions envOptions)
{
// Run builds in parallel
List<AnalyzerResult> results = manager.Projects.Values
.AsParallel()
.Select(p => p.Build(envOptions).FirstOrDefault()) // with envoption
.Where(x => x != null)
.ToList();
// Add each result to a new workspace
AdhocWorkspace workspace = new AdhocWorkspace();
foreach (AnalyzerResult result in results)
{
result.AddToWorkspace(workspace);
}
return workspace;
}
public static IEnumerable<INamedTypeSymbol> GetNamedTypeSymbols(this Compilation compilation)
{
foreach (var syntaxTree in compilation.SyntaxTrees)
{
var semModel = compilation.GetSemanticModel(syntaxTree);
foreach (var item in syntaxTree.GetRoot()
.DescendantNodes()
.Select(x => semModel.GetDeclaredSymbol(x))
.Where(x => x != null))
{
var namedType = item as INamedTypeSymbol;
if (namedType != null)
{
yield return namedType;
}
}
}
}
public static IEnumerable<INamedTypeSymbol> EnumerateBaseType(this ITypeSymbol symbol)
{
var t = symbol.BaseType;
while (t != null)
{
yield return t;
t = t.BaseType;
}
}
public static AttributeData FindAttribute(this IEnumerable<AttributeData> attributeDataList, string typeName)
{
return attributeDataList
.Where(x => x.AttributeClass.ToDisplayString() == typeName)
.FirstOrDefault();
}
public static AttributeData FindAttributeShortName(this IEnumerable<AttributeData> attributeDataList,
string typeName)
{
return attributeDataList
.Where(x => x.AttributeClass.Name == typeName)
.FirstOrDefault();
}
public static AttributeData FindAttributeIncludeBasePropertyShortName(this IPropertySymbol property,
string typeName)
{
do
{
var data = FindAttributeShortName(property.GetAttributes(), typeName);
if (data != null) return data;
property = property.OverriddenProperty;
} while (property != null);
return null;
}
public static AttributeSyntax FindAttribute(this BaseTypeDeclarationSyntax typeDeclaration, SemanticModel model,
string typeName)
{
return typeDeclaration.AttributeLists
.SelectMany(x => x.Attributes)
.Where(x => model.GetTypeInfo(x).Type?.ToDisplayString() == typeName)
.FirstOrDefault();
}
public static INamedTypeSymbol FindBaseTargetType(this ITypeSymbol symbol, string typeName)
{
return symbol.EnumerateBaseType()
.Where(x => x.OriginalDefinition?.ToDisplayString() == typeName)
.FirstOrDefault();
}
public static object GetSingleNamedArgumentValue(this AttributeData attribute, string key)
{
foreach (var item in attribute.NamedArguments)
{
if (item.Key == key)
{
return item.Value.Value;
}
}
return null;
}
public static bool IsNullable(this INamedTypeSymbol symbol)
{
if (symbol.IsGenericType)
{
if (symbol.ConstructUnboundGenericType().ToDisplayString() == "T?")
{
return true;
}
}
return false;
}
public static IEnumerable<ISymbol> GetAllMembers(this ITypeSymbol symbol)
{
var t = symbol;
while (t != null)
{
foreach (var item in t.GetMembers())
{
yield return item;
}
t = t.BaseType;
}
}
public static IEnumerable<ISymbol> GetAllInterfaceMembers(this ITypeSymbol symbol)
{
return symbol.GetMembers()
.Concat(symbol.AllInterfaces.SelectMany(x => x.GetMembers()));
}
}
}

Просмотреть файл

@ -0,0 +1,3 @@
dotnet publish MessagePack.UniversalCodeGenerator.csproj -c Release --self-contained -r win-x64 -o ./bin/MessagePackUniversalCodeGenerator/win-x64
dotnet publish MessagePack.UniversalCodeGenerator.csproj -c Release --self-contained -r linux-x64 -o ./bin/MessagePackUniversalCodeGenerator/linux-x64
dotnet publish MessagePack.UniversalCodeGenerator.csproj -c Release --self-contained -r osx-x64 -o ./bin/MessagePackUniversalCodeGenerator/osx-x64