static bool AreEqual(GenericParameter a, GenericParameter b, TypeComparisonMode comparisonMode = TypeComparisonMode.Exact)
        {
            if (ReferenceEquals(a, b))
            {
                return(true);
            }

            if (a.Position != b.Position)
            {
                return(false);
            }

            if (a.Type != b.Type)
            {
                return(false);
            }

            var aOwnerType = a.Owner as TypeReference;

            if (aOwnerType != null && AreEqual(aOwnerType, b.Owner as TypeReference, comparisonMode))
            {
                return(true);
            }

            var aOwnerMethod = a.Owner as MethodReference;

            if (aOwnerMethod != null && comparisonMode != TypeComparisonMode.SignatureOnlyLoose && MethodReferenceComparer.AreEqual(aOwnerMethod, b.Owner as MethodReference))
            {
                return(true);
            }

            return(comparisonMode == TypeComparisonMode.SignatureOnly || comparisonMode == TypeComparisonMode.SignatureOnlyLoose);
        }
        static bool AreEqual(GenericInstanceType a, GenericInstanceType b, TypeComparisonMode comparisonMode = TypeComparisonMode.Exact)
        {
            if (ReferenceEquals(a, b))
            {
                return(true);
            }

            var aGenericArgumentsCount = a.GenericArguments.Count;

            if (aGenericArgumentsCount != b.GenericArguments.Count)
            {
                return(false);
            }

            if (!AreEqual(a.ElementType, b.ElementType, comparisonMode))
            {
                return(false);
            }

            for (int i = 0; i < aGenericArgumentsCount; i++)
            {
                if (!AreEqual(a.GenericArguments[i], b.GenericArguments[i], comparisonMode))
                {
                    return(false);
                }
            }

            return(true);
        }
Beispiel #3
0
        public static bool AreSignaturesEqual(MethodReference x, MethodReference y, TypeComparisonMode comparisonMode = TypeComparisonMode.Exact)
        {
            if (x.HasThis != y.HasThis)
            {
                return(false);
            }

            if (x.Parameters.Count != y.Parameters.Count)
            {
                return(false);
            }

            if (x.GenericParameters.Count != y.GenericParameters.Count)
            {
                return(false);
            }

            for (var i = 0; i < x.Parameters.Count; i++)
            {
                if (!TypeReferenceEqualityComparer.AreEqual(x.Parameters[i].ParameterType, y.Parameters[i].ParameterType, comparisonMode))
                {
                    return(false);
                }
            }

            if (!TypeReferenceEqualityComparer.AreEqual(x.ReturnType, y.ReturnType, comparisonMode))
            {
                return(false);
            }

            return(true);
        }
Beispiel #4
0
 private static bool AreEqual(GenericInstanceType a, GenericInstanceType b, TypeComparisonMode comparisonMode = 0)
 {
     if (!object.ReferenceEquals(a, b))
     {
         int count = a.GenericArguments.Count;
         if (count != b.GenericArguments.Count)
         {
             return(false);
         }
         if (!AreEqual(a.ElementType, b.ElementType, comparisonMode))
         {
             return(false);
         }
         for (int i = 0; i < count; i++)
         {
             if (!AreEqual(a.GenericArguments[i], b.GenericArguments[i], comparisonMode))
             {
                 return(false);
             }
         }
     }
     return(true);
 }
Beispiel #5
0
        private static bool AreEqual(GenericParameter a, GenericParameter b, TypeComparisonMode comparisonMode = 0)
        {
            if (object.ReferenceEquals(a, b))
            {
                return(true);
            }
            if (a.Position != b.Position)
            {
                return(false);
            }
            if (a.Type != b.Type)
            {
                return(false);
            }
            TypeReference owner = a.Owner as TypeReference;

            if ((owner != null) && AreEqual(owner, b.Owner as TypeReference, comparisonMode))
            {
                return(true);
            }
            MethodReference x = a.Owner as MethodReference;

            return(((x != null) && Unity.IL2CPP.Common.MethodReferenceComparer.AreEqual(x, b.Owner as MethodReference)) || (comparisonMode == TypeComparisonMode.SignatureOnly));
        }
        public static bool AreEqual(TypeReference a, TypeReference b, TypeComparisonMode comparisonMode = TypeComparisonMode.Exact)
        {
            if (ReferenceEquals(a, b))
            {
                return(true);
            }

            if (a == null || b == null)
            {
                return(false);
            }

            var aMetadataType = a.MetadataType;
            var bMetadataType = b.MetadataType;

            if (aMetadataType == MetadataType.GenericInstance || bMetadataType == MetadataType.GenericInstance)
            {
                if (aMetadataType != bMetadataType)
                {
                    return(false);
                }

                return(AreEqual((GenericInstanceType)a, (GenericInstanceType)b, comparisonMode));
            }

            if (aMetadataType == MetadataType.Array || bMetadataType == MetadataType.Array)
            {
                if (aMetadataType != bMetadataType)
                {
                    return(false);
                }

                var a1 = (ArrayType)a;
                var b1 = (ArrayType)b;
                if (a1.Rank != b1.Rank)
                {
                    return(false);
                }

                return(AreEqual(a1.ElementType, b1.ElementType, comparisonMode));
            }

            if (aMetadataType == MetadataType.Var || bMetadataType == MetadataType.Var)
            {
                if (aMetadataType != bMetadataType)
                {
                    return(false);
                }

                return(AreEqual((GenericParameter)a, (GenericParameter)b, comparisonMode));
            }

            if (aMetadataType == MetadataType.MVar || bMetadataType == MetadataType.MVar)
            {
                if (aMetadataType != bMetadataType)
                {
                    return(false);
                }

                return(AreEqual((GenericParameter)a, (GenericParameter)b, comparisonMode));
            }

            if (aMetadataType == MetadataType.ByReference || bMetadataType == MetadataType.ByReference)
            {
                if (aMetadataType != bMetadataType)
                {
                    return(false);
                }

                return(AreEqual(((ByReferenceType)a).ElementType, ((ByReferenceType)b).ElementType, comparisonMode));
            }

            if (aMetadataType == MetadataType.Pointer || bMetadataType == MetadataType.Pointer)
            {
                if (aMetadataType != bMetadataType)
                {
                    return(false);
                }

                return(AreEqual(((PointerType)a).ElementType, ((PointerType)b).ElementType, comparisonMode));
            }

            if (aMetadataType == MetadataType.RequiredModifier || bMetadataType == MetadataType.RequiredModifier)
            {
                if (aMetadataType != bMetadataType)
                {
                    return(false);
                }

                var a1 = (RequiredModifierType)a;
                var b1 = (RequiredModifierType)b;

                return(AreEqual(a1.ModifierType, b1.ModifierType, comparisonMode) && AreEqual(a1.ElementType, b1.ElementType, comparisonMode));
            }

            if (aMetadataType == MetadataType.OptionalModifier || bMetadataType == MetadataType.OptionalModifier)
            {
                if (aMetadataType != bMetadataType)
                {
                    return(false);
                }

                var a1 = (OptionalModifierType)a;
                var b1 = (OptionalModifierType)b;

                return(AreEqual(a1.ModifierType, b1.ModifierType, comparisonMode) && AreEqual(a1.ElementType, b1.ElementType, comparisonMode));
            }

            if (aMetadataType == MetadataType.Pinned || bMetadataType == MetadataType.Pinned)
            {
                if (aMetadataType != bMetadataType)
                {
                    return(false);
                }

                return(AreEqual(((PinnedType)a).ElementType, ((PinnedType)b).ElementType, comparisonMode));
            }

            if (aMetadataType == MetadataType.Sentinel || bMetadataType == MetadataType.Sentinel)
            {
                if (aMetadataType != bMetadataType)
                {
                    return(false);
                }

                return(AreEqual(((SentinelType)a).ElementType, ((SentinelType)b).ElementType, comparisonMode));
            }

            if (!a.Name.Equals(b.Name) || !a.Namespace.Equals(b.Namespace))
            {
                return(false);
            }

            var xDefinition = a.Resolve();
            var yDefinition = b.Resolve();

            // For loose signature the types could be in different assemblies, as long as the type names match we will consider them equal
            if (comparisonMode == TypeComparisonMode.SignatureOnlyLoose)
            {
                if (xDefinition.Module.Name != yDefinition.Module.Name)
                {
                    return(false);
                }

                if (xDefinition.Module.Assembly.Name.Name != yDefinition.Module.Assembly.Name.Name)
                {
                    return(false);
                }

                return(xDefinition.FullName == yDefinition.FullName);
            }

            return(xDefinition == yDefinition);
        }
Beispiel #7
0
        public static bool AreEqual(TypeReference a, TypeReference b, TypeComparisonMode comparisonMode = 0)
        {
            if (object.ReferenceEquals(a, b))
            {
                return(true);
            }
            if ((a == null) || (b == null))
            {
                return(false);
            }
            MetadataType metadataType = a.MetadataType;
            MetadataType type2        = b.MetadataType;

            if ((metadataType == MetadataType.GenericInstance) || (type2 == MetadataType.GenericInstance))
            {
                if (metadataType != type2)
                {
                    return(false);
                }
                return(AreEqual((GenericInstanceType)a, (GenericInstanceType)b, comparisonMode));
            }
            if ((metadataType == MetadataType.Array) || (type2 == MetadataType.Array))
            {
                if (metadataType != type2)
                {
                    return(false);
                }
                ArrayType type3 = (ArrayType)a;
                ArrayType type4 = (ArrayType)b;
                if (type3.Rank != type4.Rank)
                {
                    return(false);
                }
                return(AreEqual(type3.ElementType, type4.ElementType, comparisonMode));
            }
            if ((metadataType == MetadataType.Var) || (type2 == MetadataType.Var))
            {
                if (metadataType != type2)
                {
                    return(false);
                }
                return(AreEqual((GenericParameter)a, (GenericParameter)b, TypeComparisonMode.Exact));
            }
            if ((metadataType == MetadataType.MVar) || (type2 == MetadataType.MVar))
            {
                if (metadataType != type2)
                {
                    return(false);
                }
                return(AreEqual((GenericParameter)a, (GenericParameter)b, comparisonMode));
            }
            if ((metadataType == MetadataType.ByReference) || (type2 == MetadataType.ByReference))
            {
                if (metadataType != type2)
                {
                    return(false);
                }
                return(AreEqual(((ByReferenceType)a).ElementType, ((ByReferenceType)b).ElementType, comparisonMode));
            }
            if ((metadataType == MetadataType.Pointer) || (type2 == MetadataType.Pointer))
            {
                if (metadataType != type2)
                {
                    return(false);
                }
                return(AreEqual(((PointerType)a).ElementType, ((PointerType)b).ElementType, comparisonMode));
            }
            if ((metadataType == MetadataType.RequiredModifier) || (type2 == MetadataType.RequiredModifier))
            {
                if (metadataType != type2)
                {
                    return(false);
                }
                RequiredModifierType type5 = (RequiredModifierType)a;
                RequiredModifierType type6 = (RequiredModifierType)b;
                return(AreEqual(type5.ModifierType, type6.ModifierType, TypeComparisonMode.Exact) && AreEqual(type5.ElementType, type6.ElementType, comparisonMode));
            }
            if ((metadataType == MetadataType.OptionalModifier) || (type2 == MetadataType.OptionalModifier))
            {
                if (metadataType != type2)
                {
                    return(false);
                }
                OptionalModifierType type7 = (OptionalModifierType)a;
                OptionalModifierType type8 = (OptionalModifierType)b;
                return(AreEqual(type7.ModifierType, type8.ModifierType, TypeComparisonMode.Exact) && AreEqual(type7.ElementType, type8.ElementType, comparisonMode));
            }
            if ((metadataType == MetadataType.Pinned) || (type2 == MetadataType.Pinned))
            {
                if (metadataType != type2)
                {
                    return(false);
                }
                return(AreEqual(((PinnedType)a).ElementType, ((PinnedType)b).ElementType, comparisonMode));
            }
            if ((metadataType == MetadataType.Sentinel) || (type2 == MetadataType.Sentinel))
            {
                if (metadataType != type2)
                {
                    return(false);
                }
                return(AreEqual(((SentinelType)a).ElementType, ((SentinelType)b).ElementType, TypeComparisonMode.Exact));
            }
            if (!a.Name.Equals(b.Name) || !a.Namespace.Equals(b.Namespace))
            {
                return(false);
            }
            TypeDefinition definition  = a.Resolve();
            TypeDefinition definition2 = b.Resolve();

            return(definition == definition2);
        }