Example #1
0
        // 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);
        }
Example #2
0
        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.
        }