// Builds a method parameter. private Parameter BuildParameter(EnvDTE80.CodeParameter2 codeParameter) { Parameter parameter = new Parameter() { Name = codeParameter.Name, Type = BuildMType(codeParameter.Type.CodeType), IsOptional = (codeParameter.ParameterKind == EnvDTE80.vsCMParameterKind.vsCMParameterKindOptional) }; return(parameter); }
private static void AppendParameterTypeName(StringBuilder b, EnvDTE80.CodeParameter2 parameter, string[] genericTypeParameters, string[] genericMethodParameters) { EnvDTE80.CodeTypeRef2 parameterTypeRef = (EnvDTE80.CodeTypeRef2)parameter.Type; string parameterTypeString = parameterTypeRef.AsFullName; int substringStart = 0; for (int i = 0; i < parameterTypeString.Length; ++i) { char ch = parameterTypeString[i]; switch (ch) { case '<': AppendParameterTypeSubstring(b, parameterTypeString, substringStart, i, genericTypeParameters, genericMethodParameters); substringStart = i + 1; b.Append('{'); break; case '>': AppendParameterTypeSubstring(b, parameterTypeString, substringStart, i, genericTypeParameters, genericMethodParameters); substringStart = i + 1; b.Append('}'); break; case '[': case ']': case ',': AppendParameterTypeSubstring(b, parameterTypeString, substringStart, i, genericTypeParameters, genericMethodParameters); substringStart = i + 1; // Skip space after comma if present. if ((substringStart < parameterTypeString.Length) && (parameterTypeString[substringStart] == ' ')) { ++substringStart; } b.Append(ch); break; } } AppendParameterTypeSubstring(b, parameterTypeString, substringStart, parameterTypeString.Length, genericTypeParameters, genericMethodParameters); // Append ref / out indicator if needed. if ((parameter.ParameterKind == EnvDTE80.vsCMParameterKind.vsCMParameterKindRef) || (parameter.ParameterKind == EnvDTE80.vsCMParameterKind.vsCMParameterKindOut)) { b.Append('@'); } // Note there is no need to append a '*' for pointers, as this is included in the full name of the type. // Multi-dimensional and nested arrays are also captured in the full name of the type. }
private static void AppendParameterTypeName(StringBuilder b, EnvDTE80.CodeParameter2 parameter, string[] genericTypeParameters, string[] genericMethodParameters) { EnvDTE80.CodeTypeRef2 parameterTypeRef = (EnvDTE80.CodeTypeRef2)parameter.Type; string parameterTypeString = parameterTypeRef.AsFullName; int substringStart = 0; for (int i = 0; i < parameterTypeString.Length; ++i) { char ch = parameterTypeString[i]; switch (ch) { case '<': AppendParameterTypeSubstring(b, parameterTypeString, substringStart, i, genericTypeParameters, genericMethodParameters); substringStart = i + 1; b.Append('{'); break; case '>': AppendParameterTypeSubstring(b, parameterTypeString, substringStart, i, genericTypeParameters, genericMethodParameters); substringStart = i + 1; b.Append('}'); break; case '[': AppendParameterTypeSubstring(b, parameterTypeString, substringStart, i, genericTypeParameters, genericMethodParameters); b.Append('['); // Skip ahead to the closing bracket, counting commas to determine array rank. int rank = 1; do { ++i; ch = parameterTypeString[i]; if (ch == ',') { ++rank; } }while (ch != ']'); substringStart = i + 1; // For multi-dimensional arrays, add "0:" default array bounds. Note that non-standard bounds are not possible via C# declaration. if (rank > 1) { for (int r = 0; r < rank; ++r) { if (r != 0) { b.Append(','); } b.Append("0:"); } } b.Append(']'); break; case ',': AppendParameterTypeSubstring(b, parameterTypeString, substringStart, i, genericTypeParameters, genericMethodParameters); substringStart = i + 1; // Skip space after comma if present. (e.g. System.Collections.Generic.KeyValuePair`2{System.String,System.String}.) if (parameterTypeString[substringStart] == ' ') { ++substringStart; } b.Append(','); break; } } AppendParameterTypeSubstring(b, parameterTypeString, substringStart, parameterTypeString.Length, genericTypeParameters, genericMethodParameters); // Append ref / out indicator if needed. if ((parameter.ParameterKind == EnvDTE80.vsCMParameterKind.vsCMParameterKindRef) || (parameter.ParameterKind == EnvDTE80.vsCMParameterKind.vsCMParameterKindOut)) { b.Append('@'); } // Note there is no need to append a '*' for pointers, as this is included in the full name of the type. // Multi-dimensional and jagged arrays are handled above during string parsing. }