/// <summary>
        /// Parses and returns an indexer.
        /// </summary>
        /// <param name="parent">
        /// The parent of the element.
        /// </param>
        /// <param name="elementReference">
        /// A reference to the element being created.
        /// </param>
        /// <param name="unsafeCode">
        /// Indicates whether the code is marked as unsafe.
        /// </param>
        /// <param name="generated">
        /// Indicates whether the code is marked as generated code.
        /// </param>
        /// <param name="xmlHeader">
        /// The element's documentation header.
        /// </param>
        /// <param name="attributes">
        /// The attributes on the element.
        /// </param>
        /// <returns>
        /// Returns the element.
        /// </returns>
        private Indexer ParseIndexer(
            CsElement parent, Reference<ICodePart> elementReference, bool unsafeCode, bool generated, XmlHeader xmlHeader, ICollection<Attribute> attributes)
        {
            Param.AssertNotNull(parent, "parent");
            Param.AssertNotNull(elementReference, "elementReference");
            Param.Ignore(unsafeCode);
            Param.Ignore(generated);
            Param.Ignore(xmlHeader);
            Param.Ignore(attributes);

            Node<CsToken> previousTokenNode = this.tokens.Last;

            // Get the modifiers and access.
            AccessModifierType accessModifier = AccessModifierType.Private;

            // Indexers within interfaces always have the access of the parent interface.
            Interface parentInterface = parent as Interface;
            if (parentInterface != null)
            {
                accessModifier = parentInterface.AccessModifier;
            }

            // Get declared modifiers.
            Dictionary<CsTokenType, CsToken> modifiers = this.GetElementModifiers(elementReference, ref accessModifier, IndexerModifiers);

            unsafeCode |= modifiers.ContainsKey(CsTokenType.Unsafe);

            // Get the return type.
            TypeToken returnType = this.GetTypeToken(elementReference, unsafeCode, true);
            this.tokens.Add(returnType);

            // Get the name of the indexer.
            CsToken name = this.GetElementNameToken(elementReference, unsafeCode);
            this.tokens.Add(name);

            // Get the parameter list.
            IList<Parameter> parameters = this.ParseParameterList(elementReference, unsafeCode, SymbolType.OpenSquareBracket);

            // Create the declaration.
            Node<CsToken> firstTokenNode = previousTokenNode == null ? this.tokens.First : previousTokenNode.Next;
            CsTokenList declarationTokens = new CsTokenList(this.tokens, firstTokenNode, this.tokens.Last);
            Declaration declaration = new Declaration(declarationTokens, name.Text, ElementType.Indexer, accessModifier, modifiers);

            Indexer indexer = new Indexer(this.document, parent, xmlHeader, attributes, declaration, returnType, parameters, unsafeCode, generated);
            elementReference.Target = indexer;

            // Parse the body of the indexer.
            this.ParseElementContainer(indexer, elementReference, null, unsafeCode);

            return indexer;
        }
        /// <summary>
        /// The save.
        /// </summary>
        /// <param name="indexer">
        /// The indexer.
        /// </param>
        private void Save(Indexer @indexer)
        {
            var @propertyName = @indexer.Declaration.Name;
            this.headerWriter.Write(
                string.Format(
                    "__declspec(property({0}{2}{1})) ",
                    (@indexer.GetAccessor != null)
                        ? string.Concat("get = ", this.GetFunctionPrefix(@indexer.GetAccessor), "this")
                        : string.Empty,
                    (@indexer.SetAccessor != null)
                        ? string.Concat("put = ", this.GetFunctionPrefix(@indexer.SetAccessor), "this")
                        : string.Empty,
                    (@indexer.GetAccessor != null && @indexer.SetAccessor != null) ? ", " : string.Empty));

            if (@indexer.ReturnType != null)
            {
                // 1 to destHeader
                this.Save(@indexer.ReturnType);
            }

            // 1 to destHeader
            this.headerWriter.Write(" ");

            // this.destHeader.Write(@indexer.Declaration.Name);
            this.headerWriter.Write("Default");
            this.headerWriter.WriteLine("[];");

            if (@indexer.GetAccessor != null)
            {
                this.Save(@indexer.GetAccessor);
            }

            if (@indexer.SetAccessor != null)
            {
                this.Save(@indexer.SetAccessor);
            }
        }