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; }
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 { } }