Beispiel #1
0
        public static MethodDefinition FindMethodDefinitionInGroup(IEmitter emitter, IEnumerable <ParameterDeclaration> parameters, IEnumerable <TypeParameterDeclaration> typeParameters, IEnumerable <MethodDefinition> group, AstType returnType, TypeDefinition typeDef)
        {
            var args = new List <ParameterDeclaration>(parameters);
            var typeParametersCount = typeParameters != null?typeParameters.Count() : 0;

            foreach (var method in group)
            {
                if (args.Count == method.Parameters.Count && method.GenericParameters.Count == typeParametersCount)
                {
                    bool match = true;

                    if (typeDef != null && method.DeclaringType != typeDef)
                    {
                        match = false;
                        continue;
                    }

                    if (returnType != null)
                    {
                        if (!(returnType.IsNull && method.ReturnType.MetadataType == MetadataType.Void))
                        {
                            var resolveResult = emitter.Resolver.ResolveNode(returnType, emitter);
                            if (!Helpers.TypeIsMatch(emitter, resolveResult, returnType, method.ReturnType))
                            {
                                match = false;
                                continue;
                            }
                        }
                    }

                    for (int i = 0; i < method.Parameters.Count; i++)
                    {
                        var type          = args[i].Type;
                        var resolveResult = emitter.Resolver.ResolveNode(type, emitter);
                        var typeRef       = method.Parameters[i].ParameterType;

                        if (!Helpers.TypeIsMatch(emitter, resolveResult, type, typeRef))
                        {
                            match = false;
                            break;
                        }
                    }

                    if (match)
                    {
                        return(method);
                    }
                }
            }

            return(null);
        }
Beispiel #2
0
        public static MethodDefinition FindMethodDefinitionInGroup(IEmitter emitter, IList <IParameter> parameters, IList <IType> typeParameters, List <MethodDefinition> group, IType returnType, TypeDefinition typeDef, IMember member)
        {
            var typeParametersCount = typeParameters != null?typeParameters.Count() : 0;

            foreach (var method in group)
            {
                if (parameters.Count == method.Parameters.Count && method.GenericParameters.Count == typeParametersCount)
                {
                    bool match = method.Parameters.Count == 0;

                    if (typeDef != null && method.DeclaringType != typeDef)
                    {
                        match = false;
                        continue;
                    }

                    if (returnType != null)
                    {
                        if (!Helpers.TypeIsMatch(emitter, returnType, method.ReturnType, member, -1))
                        {
                            match = false;
                            continue;
                        }
                    }

                    for (int i = 0; i < method.Parameters.Count; i++)
                    {
                        var type    = parameters[i].Type;
                        var typeRef = method.Parameters[i].ParameterType;

                        if (Helpers.TypeIsMatch(emitter, type, typeRef, member, i))
                        {
                            match = true;
                            break;
                        }
                    }

                    if (match)
                    {
                        return(method);
                    }
                }
            }

            return(null);
        }