/// <inheritdoc />
        protected override string GetParameterName(StaticParameterWrapper parameter)
        {
            if (parameter.Handle is CodeTypeRef)
            {
                return(null);
            }

            CodeParameter2 parameterHandle = (CodeParameter2)parameter.Handle;

            return(parameterHandle.Name);
        }
        /// <inheritdoc />
        protected override ParameterAttributes GetParameterAttributes(StaticParameterWrapper parameter)
        {
            if (parameter.Handle is CodeTypeRef)
            {
                return(ParameterAttributes.None);
            }

            CodeParameter2 parameterHandle = (CodeParameter2)parameter.Handle;

            vsCMParameterKind   kind  = parameterHandle.ParameterKind;
            ParameterAttributes flags = 0;

            ReflectorFlagsUtils.AddFlagIfTrue(ref flags, ParameterAttributes.HasDefault, parameterHandle.DefaultValue != null);
            ReflectorFlagsUtils.AddFlagIfTrue(ref flags, ParameterAttributes.In, (kind & vsCMParameterKind.vsCMParameterKindIn) != 0);
            ReflectorFlagsUtils.AddFlagIfTrue(ref flags, ParameterAttributes.Out, (kind & vsCMParameterKind.vsCMParameterKindOut) != 0);
            ReflectorFlagsUtils.AddFlagIfTrue(ref flags, ParameterAttributes.Optional, (kind & vsCMParameterKind.vsCMParameterKindOptional) != 0);
            return(flags);
        }
        /// <inheritdoc />
        protected override StaticTypeWrapper GetParameterType(StaticParameterWrapper parameter)
        {
            CodeTypeRef returnTypeHandle = parameter.Handle as CodeTypeRef;

            if (returnTypeHandle != null)
            {
                return(MakeType(returnTypeHandle));
            }

            CodeParameter2    parameterHandle = (CodeParameter2)parameter.Handle;
            StaticTypeWrapper parameterType   = MakeType(parameterHandle.Type);

            if ((parameterHandle.ParameterKind & (vsCMParameterKind.vsCMParameterKindRef | vsCMParameterKind.vsCMParameterKindOut)) != 0)
            {
                parameterType = parameterType.MakeByRefType();
            }

            return(parameterType);
        }
        /// <inheritdoc />
        protected override int GetParameterPosition(StaticParameterWrapper parameter)
        {
            if (parameter.Handle is CodeTypeRef)
            {
                return(-1);
            }

            CodeParameter2 parameterHandle = (CodeParameter2)parameter.Handle;

            CodeElements codeElements = parameterHandle.Collection;

            for (int i = 0; i < codeElements.Count; i++)
            {
                if (codeElements.Item(i) == parameterHandle)
                {
                    return(i);
                }
            }

            throw new InvalidOperationException("Could not obtain position of parameter.");
        }
        /// <inheritdoc />
        protected override IEnumerable <StaticAttributeWrapper> GetParameterCustomAttributes(StaticParameterWrapper parameter)
        {
            if (parameter.Handle is CodeTypeRef)
            {
                return(EmptyArray <StaticAttributeWrapper> .Instance);
            }

            CodeParameter2 parameterHandle = (CodeParameter2)parameter.Handle;

            return(WrapAttributes(parameterHandle.Attributes));
        }