Ejemplo n.º 1
0
        /// <summary>
        /// Writes the type parameters.
        /// </summary>
        /// <param name="genericElement">The generic element.</param>
        private void WriteTypeParameters(IGenericElement genericElement)
        {
            if (genericElement.TypeParameters.Count > 0)
            {
                Writer.Write(VBSymbol.BeginParameterList);

                Writer.Write(VBKeyword.Of);
                Writer.Write(' ');

                for (int parameterIndex = 0; parameterIndex < genericElement.TypeParameters.Count; parameterIndex++)
                {
                    TypeParameter typeParameter = genericElement.TypeParameters[parameterIndex];
                    Writer.Write(typeParameter.Name);

                    WriteTypeParameterConstraints(typeParameter);

                    if (parameterIndex < genericElement.TypeParameters.Count - 1)
                    {
                        Writer.Write(VBSymbol.AliasSeparator);
                        Writer.Write(' ');
                    }
                }

                Writer.Write(VBSymbol.EndParameterList);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Writes the list of type parameters for a generic code element.
        /// </summary>
        /// <param name="genericElement">Generic code element.</param>
        private void WriteTypeParameters(IGenericElement genericElement)
        {
            if (genericElement.TypeParameters.Count > 0)
            {
                Writer.Write(CSharpSymbol.BeginGeneric);

                for (int parameterIndex = 0; parameterIndex < genericElement.TypeParameters.Count; parameterIndex++)
                {
                    TypeParameter typeParameter = genericElement.TypeParameters[parameterIndex];
                    if (typeParameter.IsIn)
                    {
                        Writer.Write("in ");
                    }
                    else if (typeParameter.IsOut)
                    {
                        Writer.Write("out ");
                    }
                    Writer.Write(typeParameter.Name);
                    if (parameterIndex < genericElement.TypeParameters.Count - 1)
                    {
                        Writer.Write(CSharpSymbol.AliasSeparator);
                        Writer.Write(' ');
                    }
                }

                Writer.Write(CSharpSymbol.EndGeneric);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Returns a list of generic parameters to the specified IGenericElement implementer.
        /// </summary>
        private static string GetGenericParameterList(IGenericElement generic)
        {
            string genericParamList = string.Empty;
            for (int i = 0; i < generic.TypeParameters.Count; i++)
            {
                ITypeParameter p = generic.TypeParameters[i];
                genericParamList += p.Name + ",";
            }

            genericParamList = genericParamList.TrimEnd(',');
            return genericParamList;
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Writes the type parameter constraints for a generic code element.
        /// </summary>
        /// <param name="genericElement">Generic code element.</param>
        private void WriteTypeParameterConstraints(IGenericElement genericElement)
        {
            if (genericElement.TypeParameters.Count > 0)
            {
                foreach (TypeParameter typeParameter in genericElement.TypeParameters)
                {
                    if (typeParameter.Constraints.Count > 0)
                    {
                        Writer.WriteLine();
                        if (Configuration.Formatting.Tabs.TabStyle == TabStyle.Tabs)
                        {
                            WriteIndented("\t");
                        }
                        else
                        {
                            WriteIndented(new string(' ', Configuration.Formatting.Tabs.SpacesPerTab));
                        }

                        Writer.Write(CSharpKeyword.Where);
                        Writer.Write(' ');
                        Writer.Write(typeParameter.Name);
                        Writer.Write(' ');
                        Writer.Write(CSharpSymbol.TypeImplements);
                        Writer.Write(' ');
                        for (int constraintIndex = 0;
                             constraintIndex < typeParameter.Constraints.Count;
                             constraintIndex++)
                        {
                            string constraint = typeParameter.Constraints[constraintIndex];
                            Writer.Write(constraint);

                            if (constraintIndex < typeParameter.Constraints.Count - 1)
                            {
                                Writer.Write(CSharpSymbol.AliasSeparator);
                                Writer.Write(' ');
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Parses type parameters.
        /// </summary>
        /// <param name="genericElement">The generic element.</param>
        private void ParseTypeParameters(IGenericElement genericElement)
        {
            EatWhiteSpace();

            if (NextChar == VBSymbol.EndParameterList ||
                NextChar == EmptyChar)
            {
                this.OnParseError("Expected type parameter");
            }

            while (NextChar != VBSymbol.EndParameterList &&
                NextChar != EmptyChar)
            {
                if (genericElement.TypeParameters.Count > 0 && NextChar == VBSymbol.AliasSeparator)
                {
                    TryReadChar();
                }

                string typeParameterName = CaptureWord();

                EatWhiteSpace();

                if (NextChar == EmptyChar)
                {
                    break;
                }

                TypeParameter typeParameter = new TypeParameter();
                typeParameter.Name = typeParameterName;

                if (NextChar != VBSymbol.AliasSeparator &&
                    NextChar != VBSymbol.EndParameterList)
                {
                    if (char.ToLower(NextChar) == char.ToLower(VBKeyword.As[0]))
                    {
                        TryReadChar();

                        if (char.ToLower(NextChar) == char.ToLower(VBKeyword.As[1]))
                        {
                            TryReadChar();

                            EatWhiteSpace();

                            if (NextChar == VBSymbol.EndParameterList)
                            {
                                this.OnParseError("Expected type parameter constraint");
                            }

                            if (NextChar == VBSymbol.BeginTypeConstraintList)
                            {
                                TryReadChar();

                                while (NextChar != VBSymbol.EndTypeConstraintList &&
                                    NextChar != EmptyChar)
                                {
                                    string typeParameterConstraint;
                                    typeParameterConstraint = ParseTypeParameterConstraint();
                                    typeParameter.AddConstraint(typeParameterConstraint);
                                }

                                EatChar(VBSymbol.EndTypeConstraintList);
                            }
                            else
                            {
                                while (NextChar != VBSymbol.EndParameterList &&
                                    NextChar != EmptyChar)
                                {
                                    string typeParameterConstraint;
                                    typeParameterConstraint = ParseTypeParameterConstraint();
                                    typeParameter.AddConstraint(typeParameterConstraint);
                                }
                            }
                        }
                    }
                }

                genericElement.AddTypeParameter(typeParameter);
            }

            EatChar(VBSymbol.EndParameterList);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Writes the type parameters.
        /// </summary>
        /// <param name="genericElement">The generic element.</param>
        private void WriteTypeParameters(IGenericElement genericElement)
        {
            if (genericElement.TypeParameters.Count > 0)
            {
                Writer.Write(VBSymbol.BeginParameterList);

                Writer.Write(VBKeyword.Of);
                Writer.Write(' ');

                for (int parameterIndex = 0; parameterIndex < genericElement.TypeParameters.Count; parameterIndex++)
                {
                    TypeParameter typeParameter = genericElement.TypeParameters[parameterIndex];
                    Writer.Write(typeParameter.Name);

                    WriteTypeParameterConstraints(typeParameter);

                    if (parameterIndex < genericElement.TypeParameters.Count - 1)
                    {
                        Writer.Write(VBSymbol.AliasSeparator);
                        Writer.Write(' ');
                    }
                }

                Writer.Write(VBSymbol.EndParameterList);
            }
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Writes the list of type parameters for a generic code element.
        /// </summary>
        /// <param name="genericElement">Generic code element.</param>
        private void WriteTypeParameters(IGenericElement genericElement)
        {
            if (genericElement.TypeParameters.Count > 0)
            {
                Writer.Write(CSharpSymbol.BeginGeneric);

                for (int parameterIndex = 0; parameterIndex < genericElement.TypeParameters.Count; parameterIndex++)
                {
                    TypeParameter typeParameter = genericElement.TypeParameters[parameterIndex];
                    Writer.Write(typeParameter.Name);
                    if (parameterIndex < genericElement.TypeParameters.Count - 1)
                    {
                        Writer.Write(CSharpSymbol.AliasSeparator);
                        Writer.Write(' ');
                    }
                }

                Writer.Write(CSharpSymbol.EndGeneric);
            }
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Writes the type parameter constraints for a generic code element.
        /// </summary>
        /// <param name="genericElement">Generic code element.</param>
        private void WriteTypeParameterConstraints(IGenericElement genericElement)
        {
            if (genericElement.TypeParameters.Count > 0)
            {
                foreach (TypeParameter typeParameter in genericElement.TypeParameters)
                {
                    if (typeParameter.Constraints.Count > 0)
                    {
                        Writer.WriteLine();
                        if (Configuration.Formatting.Tabs.TabStyle == TabStyle.Tabs)
                        {
                            WriteIndented("\t");
                        }
                        else
                        {
                            WriteIndented(new string(' ', Configuration.Formatting.Tabs.SpacesPerTab));
                        }

                        Writer.Write(CSharpKeyword.Where);
                        Writer.Write(' ');
                        Writer.Write(typeParameter.Name);
                        Writer.Write(' ');
                        Writer.Write(CSharpSymbol.TypeImplements);
                        Writer.Write(' ');
                        for (int constraintIndex = 0; constraintIndex < typeParameter.Constraints.Count;
                            constraintIndex++)
                        {
                            string constraint = typeParameter.Constraints[constraintIndex];
                            Writer.Write(constraint);

                            if (constraintIndex < typeParameter.Constraints.Count - 1)
                            {
                                Writer.Write(CSharpSymbol.AliasSeparator);
                                Writer.Write(' ');
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Parses type parameter constraints and adds them to the
        /// generic element.
        /// </summary>
        /// <param name="genericElement">The generic element.</param>
        private void ParseTypeParameterConstraints(IGenericElement genericElement)
        {
            EatWhiteSpace();

            if (NextChar == CSharpKeyword.Where[0])
            {
                List<ICommentElement> extraComments = new List<ICommentElement>();

                while (genericElement.TypeParameters.Count > 0 &&
                    NextChar != CSharpSymbol.BeginBlock &&
                    NextChar != CSharpSymbol.EndOfStatement)
                {
                    //
                    // Parse type parameter constraints
                    //
                    string keyWord = CaptureWord();
                    if (keyWord == CSharpKeyword.Where)
                    {
                        extraComments.AddRange(ParseComments());

                        string parameterName = CaptureWord();

                        TypeParameter parameter = null;
                        foreach (TypeParameter typeParameter in genericElement.TypeParameters)
                        {
                            if (typeParameter.Name == parameterName)
                            {
                                parameter = typeParameter;
                                break;
                            }
                        }

                        if (parameter == null)
                        {
                            this.OnParseError("Unknown type parameter '" + parameterName + "'");
                        }

                        extraComments.AddRange(ParseComments());

                        bool separatorFound = TryReadChar(CSharpSymbol.TypeImplements);
                        if (!separatorFound)
                        {
                            this.OnParseError("Expected " + CSharpSymbol.TypeImplements);
                        }

                        string[] typeList = ParseAliasList();
                        foreach (string type in typeList)
                        {
                            parameter.AddConstraint(type);
                        }

                        int newIndex = parameter.Constraints.IndexOf(
                            CSharpKeyword.NewConstraint);
                        if (newIndex >= 0 && newIndex + 1 != parameter.Constraints.Count)
                        {
                            this.OnParseError("The " + CSharpKeyword.NewConstraint +
                                " must be the last declared type parameter constraint");
                        }
                    }
                    else
                    {
                        this.OnParseError("Expected type parameter constraint");
                    }

                    extraComments.AddRange(ParseComments());
                }

                CommentedElement commentedElement = genericElement as CommentedElement;
                if (commentedElement != null)
                {
                    foreach (ICommentElement comment in extraComments)
                    {
                        commentedElement.AddHeaderComment(comment);
                    }
                }
            }
        }