protected IMethod ResolveDeclaringMethod(IMethodSignature methodSig, IModule context, ICodeNode genericContext, bool polymorphic)
        {
            var ownerType = ResolveType(methodSig.Owner, context, genericContext);

            if (ownerType == null)
            {
                return(null);
            }

            var comparer = new ResolveSignatureComparer(context, ownerType.Module);

            // Find
            foreach (var method in ownerType.Methods)
            {
                if (comparer.Equals(methodSig, method.DeclaringMethod))
                {
                    return(method);
                }
            }

            // Find polymorphic
            if (polymorphic)
            {
                ownerType = ownerType.BaseType;

                while (ownerType != null)
                {
                    foreach (var method in ownerType.Methods)
                    {
                        if (comparer.Equals(methodSig, method, method))
                        {
                            return(method);
                        }
                    }

                    ownerType = ownerType.BaseType;
                }
            }

            return(null);
        }
        protected IProperty ResolveProperty(IPropertySignature propertySig, IModule context, ICodeNode genericContext)
        {
            var ownerType = ResolveType(propertySig.Owner, context, genericContext);

            if (ownerType == null)
            {
                return(null);
            }

            var comparer = new ResolveSignatureComparer(context, ownerType.Module);

            // Find
            foreach (var property in ownerType.Properties)
            {
                if (comparer.Equals(propertySig, property.DeclaringProperty))
                {
                    return(property);
                }
            }

            return(null);
        }
        protected IField ResolveField(IFieldSignature fieldSig, IModule context, ICodeNode genericContext)
        {
            var ownerType = ResolveType(fieldSig.Owner, context, genericContext);

            if (ownerType == null)
            {
                return(null);
            }

            var comparer = new ResolveSignatureComparer(context, ownerType.Module);

            // Find
            foreach (var field in ownerType.Fields)
            {
                if (comparer.Equals(fieldSig, field.DeclaringField))
                {
                    return(field);
                }
            }

            return(null);
        }
        protected IEvent ResolveEvent(IEventSignature eventSig, IModule context, ICodeNode genericContext)
        {
            var ownerType = ResolveType(eventSig.Owner, context, genericContext);

            if (ownerType == null)
            {
                return(null);
            }

            var comparer = new ResolveSignatureComparer(context, ownerType.Module);

            // Find
            foreach (var e in ownerType.Events)
            {
                if (comparer.Equals(eventSig, e.DeclaringEvent))
                {
                    return(e);
                }
            }

            return(null);
        }