/// <summary>
        /// The save.
        /// </summary>
        /// <param name="memberAccessExpression">
        /// The member access expression.
        /// </param>
        private void Save(MemberAccessExpression memberAccessExpression)
        {
            // todo: investigate why it returns multiple result with the same methods
            var expressionReturnTypeResolver = new ExpressionReturnTypeResolver(this);
            var resolvedCodeElements = expressionReturnTypeResolver.Resolve(memberAccessExpression.LeftHandSide);
            var members = resolvedCodeElements.ToList();

            var resolvedTypeReference = new TypeResolver(memberAccessExpression.LeftHandSide.Text, this);

            if (resolvedTypeReference.IsClassName || resolvedTypeReference.IsEnum)
            {
                bool isFullyQualified = memberAccessExpression.LeftHandSide.Text.StartsWith(resolvedTypeReference.Namespace);
                this.cppWriter.Write(
                    isFullyQualified
                        ? resolvedTypeReference.GetCXFullyQualifiedName(SavingOptions.None)
                        : resolvedTypeReference.GetCxName(SavingOptions.None));
            }
            else
            {
                @switch(memberAccessExpression.LeftHandSide);
            }

            this.Save(this.GetActualMemberAccess(memberAccessExpression, resolvedTypeReference, members, expressionReturnTypeResolver.IsMemberFound));

            @switch(memberAccessExpression.RightHandSide);
        }
        private void Save(Attribute attribute, IndentedTextWriter writer)
        {
            writer.Write("[");

            var first = true;
            foreach (var attributeExpression in attribute.AttributeExpressions)
            {
                if (!first)
                {
                    writer.Write(", ");
                }
                else
                {
                    first = false;
                }

                var methodInvocationExpression = attributeExpression.Initialization as MethodInvocationExpression;
                if (methodInvocationExpression != null)
                {
                    var resolvedType = new TypeResolver(methodInvocationExpression.Name.Text, this);
                    writer.Write(
                        resolvedType.IsResolved
                            ? resolvedType.GetCXFullyQualifiedName(SavingOptions.UseFullyQualifiedNames)
                            : methodInvocationExpression.Name.Text.Replace(".", "::"));

                    writer.Write('(');

                    this.SwitchStreams();
                    this.Save(methodInvocationExpression.Arguments);
                    this.SwitchStreams();

                    writer.Write(')');

                    continue;
                }

                var memberAccessExpression = attributeExpression.Initialization as MemberAccessExpression;
                if (memberAccessExpression != null)
                {
                    var resolvedType = new TypeResolver(memberAccessExpression.Text, this);
                    writer.Write(
                        resolvedType.IsResolved
                            ? resolvedType.GetCXFullyQualifiedName(SavingOptions.UseFullyQualifiedNames)
                            : memberAccessExpression.Text.Replace(".", "::"));
                }
            }

            writer.WriteLine("]");
        }