b94ab0ac177b3e5f1ea82874b854b8f860e6cd43
[platform/upstream/dotnet/runtime.git] /
1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4
5 using System.Collections.Generic;
6 using System.Diagnostics;
7
8 namespace System.Reflection.TypeLoading
9 {
10     /// <summary>
11     /// Class for all RoMethod objects created by a MetadataLoadContext for which IsConstructedGenericMethod returns true.
12     /// </summary>
13     internal sealed partial class RoConstructedGenericMethod : RoMethod
14     {
15         private readonly RoDefinitionMethod _genericMethodDefinition;
16         private readonly RoType[] _genericMethodArguments;
17
18         internal RoConstructedGenericMethod(RoDefinitionMethod genericMethodDefinition, RoType[] genericMethodArguments)
19             : base(genericMethodDefinition.ReflectedType)
20         {
21             Debug.Assert(genericMethodDefinition != null);
22             Debug.Assert(genericMethodArguments != null);
23
24             _genericMethodDefinition = genericMethodDefinition;
25             _genericMethodArguments = genericMethodArguments;
26         }
27
28         internal sealed override RoType GetRoDeclaringType() => _genericMethodDefinition.GetRoDeclaringType();
29         internal sealed override RoModule GetRoModule() => _genericMethodDefinition.GetRoModule();
30
31         protected sealed override string ComputeName() => _genericMethodDefinition.Name;
32         public sealed override int MetadataToken => _genericMethodDefinition.MetadataToken;
33         public sealed override IEnumerable<CustomAttributeData> CustomAttributes => _genericMethodDefinition.CustomAttributes;
34         public sealed override bool IsConstructedGenericMethod => true;
35         public sealed override bool IsGenericMethodDefinition => false;
36         protected sealed override MethodAttributes ComputeAttributes() => _genericMethodDefinition.Attributes;
37         protected sealed override CallingConventions ComputeCallingConvention() => _genericMethodDefinition.CallingConvention;
38         protected sealed override MethodImplAttributes ComputeMethodImplementationFlags() => _genericMethodDefinition.MethodImplementationFlags;
39
40         protected sealed override MethodSig<RoParameter> ComputeMethodSig() => _genericMethodDefinition.SpecializeMethodSig(this);
41         protected sealed override MethodSig<RoType> ComputeCustomModifiers() => _genericMethodDefinition.SpecializeCustomModifiers(TypeContext);
42
43         public sealed override MethodBody GetMethodBody() => _genericMethodDefinition.SpecializeMethodBody(this);
44
45         protected sealed override RoType[] ComputeGenericArgumentsOrParameters() => _genericMethodArguments;
46
47         internal sealed override RoType[] GetGenericTypeArgumentsNoCopy() => _genericMethodArguments;
48         internal sealed override RoType[] GetGenericTypeParametersNoCopy() => Array.Empty<RoType>();
49
50         public sealed override MethodInfo GetGenericMethodDefinition() => _genericMethodDefinition;
51
52         public sealed override MethodInfo MakeGenericMethod(params Type[] typeArguments) => throw new InvalidOperationException(SR.Format(SR.Arg_NotGenericMethodDefinition, this));
53
54         public sealed override bool Equals(object obj)
55         {
56             if (!(obj is RoConstructedGenericMethod other))
57                 return false;
58
59             if (!(_genericMethodDefinition == other._genericMethodDefinition))
60                 return false;
61
62             if (_genericMethodArguments.Length != other._genericMethodArguments.Length)
63                 return false;
64
65             for (int i = 0; i < _genericMethodArguments.Length; i++)
66             {
67                 if (_genericMethodArguments[i] != other._genericMethodArguments[i])
68                     return false;
69             }
70
71             return true;
72         }
73
74         public sealed override int GetHashCode()
75         {
76             int hashCode = _genericMethodDefinition.GetHashCode();
77             foreach (Type genericMethodArgument in _genericMethodArguments)
78             {
79                 hashCode ^= genericMethodArgument.GetHashCode();
80             }
81             return hashCode;
82         }
83
84         protected sealed override MethodSig<string> ComputeMethodSigStrings() => _genericMethodDefinition.SpecializeMethodSigStrings(TypeContext);
85
86         public sealed override TypeContext TypeContext => new TypeContext(_genericMethodDefinition.TypeContext.GenericTypeArguments, _genericMethodArguments);
87     }
88 }