public override EnvDTE80.vsCMParameterKind UpdateParameterKind(EnvDTE80.vsCMParameterKind parameterKind, PARAMETER_PASSING_MODE passingMode)
        {
            var updatedParameterKind = parameterKind;

            switch (passingMode)
            {
                case PARAMETER_PASSING_MODE.cmParameterTypeIn:
                    updatedParameterKind |= EnvDTE80.vsCMParameterKind.vsCMParameterKindNone;
                    updatedParameterKind &= ~EnvDTE80.vsCMParameterKind.vsCMParameterKindRef;
                    updatedParameterKind &= ~EnvDTE80.vsCMParameterKind.vsCMParameterKindOut;
                    break;

                case PARAMETER_PASSING_MODE.cmParameterTypeInOut:
                    updatedParameterKind &= ~EnvDTE80.vsCMParameterKind.vsCMParameterKindNone;
                    updatedParameterKind |= EnvDTE80.vsCMParameterKind.vsCMParameterKindRef;
                    updatedParameterKind &= ~EnvDTE80.vsCMParameterKind.vsCMParameterKindOut;
                    break;

                case PARAMETER_PASSING_MODE.cmParameterTypeOut:
                    updatedParameterKind &= ~EnvDTE80.vsCMParameterKind.vsCMParameterKindNone;
                    updatedParameterKind &= ~EnvDTE80.vsCMParameterKind.vsCMParameterKindRef;
                    updatedParameterKind |= EnvDTE80.vsCMParameterKind.vsCMParameterKindOut;
                    break;
            }

            return updatedParameterKind;
        }
Beispiel #2
0
 void IParameterKind.SetParameterPassingMode(PARAMETER_PASSING_MODE passingMode)
 {
     this.ParameterKind = this.CodeModelService.UpdateParameterKind(ParameterKind, passingMode);
 }
        /// <include file='doc\VsCodeDomParser.uex' path='docs/doc[@for="VsCodeDomParser.OnMethodPopulateParameters"]/*' />
        /// <devdoc>
        ///     Populate the parameter list from a function.
        /// </devdoc>
        private void OnMethodPopulateParameters(object sender, EventArgs e)
        {
            CodeMemberMethod codeMethod = (CodeMemberMethod)sender;
            CodeFunction     vsFunction = (CodeFunction)GetVsElementFromCodeObject(codeMethod);

            try {
                ITypeResolutionService typeService = provider.TypeLoader;
                foreach (CodeElement codeElement in vsFunction.Parameters)
                {
                    if (codeElement.Kind == vsCMElement.vsCMElementParameter)
                    {
                        CodeParameter  codeParam   = (CodeParameter)codeElement;
                        FieldDirection fieldDir    = FieldDirection.In;
                        StringBuilder  type        = new StringBuilder(GetUrtTypeFromVsType(codeParam.Type));
                        Type           paramType   = typeService.GetType(type.ToString());
                        bool           typeChanged = false;

                        if (codeParam is IParameterKind)
                        {
                            IParameterKind         paramKind = (IParameterKind)codeParam;
                            PARAMETER_PASSING_MODE passMode  = (PARAMETER_PASSING_MODE)paramKind.GetParameterPassingMode();
                            switch (passMode)
                            {
                            case PARAMETER_PASSING_MODE.cmParameterTypeOut:
                                fieldDir = FieldDirection.Out;
                                break;

                            case PARAMETER_PASSING_MODE.cmParameterTypeInOut:
                                fieldDir = FieldDirection.Ref;
                                break;
                            }

                            if (paramType != null)
                            {
                                // we have to walk these backwards...
                                //
                                for (int i = paramKind.GetParameterArrayCount() - 1; i >= 0; i--)
                                {
                                    typeChanged = true;
                                    type.Append("[");
                                    for (int d = 1; d < paramKind.GetParameterArrayDimensions(i); d++)
                                    {
                                        type.Append(",");
                                    }
                                    type.Append("]");
                                }
                            }
                        }

                        if (paramType != null && typeChanged)
                        {
                            paramType = paramType.Assembly.GetType(type.ToString());
                        }

                        CodeParameterDeclarationExpression parameterDecl = new CodeParameterDeclarationExpression(new CodeTypeReference(paramType), codeParam.Name);
                        parameterDecl.Direction = fieldDir;

                        codeMethod.Parameters.Add(parameterDecl);
                    }
                }
            }
            catch {
            }
        }