public override void WriteDelegateSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            string name           = (string)reflection.Evaluate(apiNameExpression);
            bool   isSerializable = (bool)reflection.Evaluate(apiIsSerializableTypeExpression);

            if (isSerializable)
            {
                WriteAttribute("T:System.SerializableAttribute", writer);
            }

            WriteAttributes(reflection, writer);

            writer.WriteKeyword("type");
            writer.WriteString(" ");
            writer.WriteIdentifier(name);
            writer.WriteString(" = ");
            writer.WriteLine();
            writer.WriteString("    ");
            writer.WriteKeyword("delegate");
            writer.WriteString(" ");
            writer.WriteKeyword("of");
            writer.WriteString(" ");

            WriteParameters(reflection, writer);

            writer.WriteKeyword("->");
            writer.WriteString(" ");
            WriteReturnValue(reflection, writer);
        }
Beispiel #2
0
        private void WriteImplementedInterfaces(string keyword, XPathNavigator reflection, SyntaxWriter writer)
        {
            XPathNodeIterator implements = reflection.Select(apiImplementedInterfacesExpression);

            if (implements.Count == 0)
            {
                return;
            }

            writer.WriteString(" ");
            writer.WriteKeyword(keyword);
            writer.WriteString(" ");

            while (implements.MoveNext())
            {
                XPathNavigator implement = implements.Current;
                WriteTypeReference(implement, writer);
                if (implements.CurrentPosition < implements.Count)
                {
                    writer.WriteString(", ");
                    if (writer.Position > maxPosition)
                    {
                        writer.WriteLine();
                        writer.WriteString("\t");
                    }
                }
            }
        }
        // Attributes

        private void WriteAttribute(string reference, SyntaxWriter writer)
        {
            writer.WriteString("[");
            writer.WriteReferenceLink(reference);
            writer.WriteString("]");
            writer.WriteLine();
        }
Beispiel #4
0
        private void WriteExtensionMethodSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            string            name       = (string)reflection.Evaluate(apiNameExpression);
            XPathNavigator    returnType = reflection.SelectSingleNode(apiReturnTypeExpression);
            XPathNodeIterator parameters = reflection.Select(apiParametersExpression);

            // extract the first parameter as the extension type
            parameters.MoveNext();
            XPathNavigator extendedType     = parameters.Current.SelectSingleNode(parameterTypeExpression);
            string         extendedTypeName = (string)parameters.Current.Evaluate(parameterNameExpression);

            // write the declarations
            ParameterDeclaration(extendedTypeName, extendedType, writer);
            WriteParameterDeclarations(parameters.Clone(), writer);
            if (returnType != null)
            {
                ParameterDeclaration("returnValue", returnType, writer);
            }
            writer.WriteLine();

            // write the method invocation
            if (returnType != null)
            {
                writer.WriteParameter("returnValue");
                writer.WriteString(" = ");
            }
            writer.WriteParameter(extendedTypeName);
            writer.WriteString(".");
            writer.WriteIdentifier(name);
            writer.WriteString("(");
            WriteParameters(parameters.Clone(), writer);
            writer.WriteString(")");
        }
Beispiel #5
0
        /// <inheritdoc />
        public override void WriteConstructorSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            if (IsUnsupportedUnsafe(reflection, writer))
            {
                return;
            }

            XPathNavigator declaringType = reflection.SelectSingleNode(apiContainingTypeExpression);

            // if static, no usage

            WriteParameterDeclarations(reflection, writer);
            writer.WriteLine();
            writer.WriteKeyword("Dim");
            writer.WriteString(" ");
            writer.WriteParameter("instance");
            writer.WriteString(" ");
            writer.WriteKeyword("As New");
            writer.WriteString(" ");

            string typeName = (string)declaringType.Evaluate(apiNameExpression);

            if (reservedWords.Contains(typeName))
            {
                writer.WriteString("[");
                WriteTypeReference(declaringType, writer);
                writer.WriteString("]");
            }
            else
            {
                WriteTypeReference(declaringType, writer);
            }

            WriteMethodParameters(reflection, writer);
        }
Beispiel #6
0
        private void WriteParameters(XPathNodeIterator parameters, SyntaxWriter writer)
        {
            while (parameters.MoveNext())
            {
                XPathNavigator parameter = parameters.Current;
                string         name      = (string)parameter.Evaluate(parameterNameExpression);
                writer.WriteParameter(name);

                if (parameters.CurrentPosition < parameters.Count)
                {
                    writer.WriteString(", ");

                    if (writer.Position > MaxPosition)
                    {
                        if (includeLineContinuation)
                        {
                            writer.WriteString("_");
                        }

                        writer.WriteLine();
                        writer.WriteString("\t");
                    }
                }
            }
        }
Beispiel #7
0
        /// <inheritdoc />
        public override void WriteCastSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            XPathNavigator parameter = reflection.SelectSingleNode(apiParametersExpression);

            if (parameter == null)
            {
                return;
            }
            XPathNavigator inputType  = parameter.SelectSingleNode(typeExpression);
            XPathNavigator outputType = reflection.SelectSingleNode(apiReturnTypeExpression);

            if ((inputType == null) || (outputType == null))
            {
                return;
            }

            ParameterDeclaration("input", inputType, writer);
            ParameterDeclaration("output", outputType, writer);
            writer.WriteLine();
            writer.WriteParameter("output");
            writer.WriteString(" = ");
            writer.WriteKeyword("CType");
            writer.WriteString("(");
            writer.WriteParameter("input");
            writer.WriteString(", ");
            WriteTypeReference(outputType, writer);
            writer.WriteString(")");
        }
        private void WriteExplicitImplementations(XPathNavigator reflection, SyntaxWriter writer)
        {
            bool isExplicit = (bool)reflection.Evaluate(apiIsExplicitImplementationExpression);

            if (isExplicit)
            {
                if (writer.Position > maxPosition)
                {
                    writer.WriteLine();
                    writer.WriteString("\t");
                }
                else
                {
                    writer.WriteString(" ");
                }
                writer.WriteKeyword("Implements");
                writer.WriteString(" ");
                XPathNodeIterator implementations = reflection.Select(apiImplementedMembersExpression);
                while (implementations.MoveNext())
                {
                    XPathNavigator implementation = implementations.Current;
                    XPathNavigator contract       = implementation.SelectSingleNode(memberDeclaringTypeExpression);
                    //string id = implementation.GetAttribute("api", String.Empty);
                    if (implementations.CurrentPosition > 1)
                    {
                        writer.WriteString(", ");
                    }
                    WriteTypeReference(contract, writer);
                    writer.WriteString(".");
                    WriteMemberReference(implementation, writer);
                    //writer.WriteReferenceLink(id);
                }
            }
        }
        /// <inheritdoc />
        public override void WriteDelegateSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            if (IsUnsupportedUnsafe(reflection, writer))
            {
                return;
            }
            if (IsUnsupportedGeneric(reflection, writer))
            {
                return;
            }

            string name           = (string)reflection.Evaluate(apiNameExpression);
            bool   isSerializable = (bool)reflection.Evaluate(apiIsSerializableTypeExpression);

            writer.WriteString("/** @delegate */");
            writer.WriteLine();

            if (isSerializable)
            {
                WriteAttribute("T:System.SerializableAttribute", writer);
            }
            WriteAttributes(reflection, writer);
            WriteVisibility(reflection, writer);
            writer.WriteString(" ");
            writer.WriteKeyword("delegate");
            writer.WriteString(" ");
            WriteReturnValue(reflection, writer);
            writer.WriteString(" ");
            writer.WriteIdentifier(name);
            WriteMethodParameters(reflection, writer);
        }
        /// <summary>
        /// Write out event syntax
        /// </summary>
        /// <param name="reflection">The reflection information</param>
        /// <param name="writer">The syntax writer to which it is written</param>
        public override void WriteEventSyntax(XPathNavigator reflection,
                                              SyntaxWriter writer)
        {
            if (!this.IsUnsupported(reflection, writer))
            {
                if (reflection.Select(
                        SyntaxGeneratorTemplate.apiParametersExpression).Count > 0)
                {
                    writer.WriteMessage("UnsupportedIndex_" + this.Language);
                }
                else
                {
                    string identifier = ReadMemberName(reflection);

                    writer.WriteKeyword("function");
                    writer.WriteString(" add_");
                    writer.WriteIdentifier(identifier);
                    writer.WriteString("(");
                    writer.WriteParameter("value");
                    writer.WriteString(");");
                    writer.WriteLine();
                    writer.WriteKeyword("function");
                    writer.WriteString(" remove_");
                    writer.WriteIdentifier(identifier);
                    writer.WriteString("(");
                    writer.WriteParameter("value");
                    writer.WriteString(");");
                }
            }
        }
        public override void WriteDelegateSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {

            string name = (string)reflection.Evaluate(apiNameExpression);
            bool isSerializable = (bool)reflection.Evaluate(apiIsSerializableTypeExpression);

            if (isSerializable) WriteAttribute("T:System.SerializableAttribute", writer);

            WriteAttributes(reflection, writer);

            writer.WriteKeyword("type");
            writer.WriteString(" ");
            writer.WriteIdentifier(name);
            writer.WriteString(" = ");
            writer.WriteLine();
            writer.WriteString("    ");
            writer.WriteKeyword("delegate");
            writer.WriteString(" ");
            writer.WriteKeyword("of");
            writer.WriteString(" ");

            WriteParameters(reflection, writer);

            writer.WriteKeyword("->");
            writer.WriteString(" ");
            WriteReturnValue(reflection, writer);

        }
Beispiel #12
0
        public override void WriteEventSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            if (IsUnsupported(reflection, writer))
            {
                return;
            }

            if (reflection.Select(apiParametersExpression).Count > 0)
            {
                writer.WriteMessage("UnsupportedIndex_" + Language);
                return;
            }

            string memberName = ReadMemberName(reflection);

            writer.WriteKeyword("function");
            writer.WriteString(" add_");
            writer.WriteIdentifier(memberName);
            writer.WriteString("(");
            writer.WriteParameter("value");
            writer.WriteString(");");

            writer.WriteLine();

            writer.WriteKeyword("function");
            writer.WriteString(" remove_");
            writer.WriteIdentifier(memberName);
            writer.WriteString("(");
            writer.WriteParameter("value");
            writer.WriteString(");");
        }
        public override void WriteNormalMethodSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            if (IsUnsupportedVarargs(reflection, writer))
            {
                return;
            }

            string name       = (string)reflection.Evaluate(apiNameExpression);
            bool   isOverride = (bool)reflection.Evaluate(apiIsOverrideExpression);
            bool   isStatic   = (bool)reflection.Evaluate(apiIsStaticExpression);
            bool   isVirtual  = (bool)reflection.Evaluate(apiIsVirtualExpression) && !(bool)reflection.Evaluate(apiIsAbstractProcedureExpression);
            int    iterations = isVirtual ? 2 : 1;

            for (int i = 0; i < iterations; i++)
            {
                WriteAttributes(reflection, writer);

                WriteVisibility(reflection, writer);

                if (isStatic)
                {
                    writer.WriteKeyword("static");
                    writer.WriteString(" ");
                }

                if (isVirtual)
                {
                    if (i == 0)
                    {
                        writer.WriteKeyword("abstract");
                        writer.WriteString(" ");
                    }
                    else
                    {
                        writer.WriteKeyword("override");
                        writer.WriteString(" ");
                    }
                }
                else
                {
                    WriteMemberKeyword(reflection, writer);
                }

                writer.WriteIdentifier(name);
                writer.WriteString(" : ");
                WriteParameters(reflection, writer);
                writer.WriteKeyword("->");
                writer.WriteString(" ");
                WriteReturnValue(reflection, writer);
                writer.WriteString(" ");
                WriteGenericTemplateConstraints(reflection, writer);

                if (i == 0)
                {
                    writer.WriteLine();
                }
            }
        }
Beispiel #14
0
        public override void WriteEventSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            string         name    = (string)reflection.Evaluate(apiNameExpression);
            XPathNavigator handler = reflection.SelectSingleNode(apiHandlerOfEventExpression);

            WriteAttributes(reflection, writer);
            WriteProcedureVisibility(reflection, writer);
            WritePrefixProcedureModifiers(reflection, writer);
            writer.WriteString(" ");
            writer.WriteKeyword("event");
            writer.WriteString(" ");
            WriteTypeReference(handler, writer);
            writer.WriteString(" ");
            writer.WriteIdentifier(name);
            writer.WriteString(" {");
            writer.WriteLine();

            writer.WriteString("\t");
            writer.WriteKeyword("void");
            writer.WriteString(" ");
            writer.WriteKeyword("add");
            writer.WriteString(" (");
            WriteTypeReference(handler, writer);
            writer.WriteString(" ");
            writer.WriteParameter("value");
            writer.WriteString(")");
            writer.WriteString(";");
            writer.WriteLine();

            writer.WriteString("\t");
            writer.WriteKeyword("void");
            writer.WriteString(" ");
            writer.WriteKeyword("remove");
            writer.WriteString(" (");
            WriteTypeReference(handler, writer);
            writer.WriteString(" ");
            writer.WriteParameter("value");
            writer.WriteString(")");
            writer.WriteString(";");
            writer.WriteLine();


            writer.WriteString("}");
        }
        public override void WriteNormalMethodSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            string         name       = (string)reflection.Evaluate(apiNameExpression);
            XPathNavigator type       = reflection.SelectSingleNode(apiReturnTypeExpression);
            bool           isExplicit = (bool)reflection.Evaluate(apiIsExplicitImplementationExpression);

            WriteAttributes(reflection, writer);
            WriteProcedureModifiers(reflection, writer);
            if (type == null)
            {
                writer.WriteKeyword("Sub");
            }
            else
            {
                writer.WriteKeyword("Function");
            }
            writer.WriteString(" ");
            writer.WriteIdentifier(name);
            WriteGenericTemplates(reflection, writer);
            WriteParameters(reflection, writer);
            if (type != null)
            {
                writer.WriteString(" ");
                writer.WriteKeyword("As");
                writer.WriteString(" ");
                WriteTypeReference(type, writer);
            }
            if (isExplicit)
            {
                if (writer.Position > maxPosition)
                {
                    writer.WriteLine();
                    writer.WriteString("\t");
                }
                else
                {
                    writer.WriteString(" ");
                }
                writer.WriteKeyword("Implements");
                writer.WriteString(" ");
                XPathNodeIterator implementations = reflection.Select(apiImplementedMembersExpression);
                while (implementations.MoveNext())
                {
                    XPathNavigator implementation = implementations.Current;
                    XPathNavigator contract       = implementation.SelectSingleNode(attributeTypeExpression);
                    // string id = implementation.GetAttribute("api", String.Empty);
                    if (implementations.CurrentPosition > 1)
                    {
                        writer.WriteString(", ");
                    }
                    WriteTypeReference(contract, writer);
                    writer.WriteString(".");
                    WriteMemberReference(implementation, writer);
                }
            }
        }
Beispiel #16
0
        private void WriteBaseClassAndImplementedInterfaces(XPathNavigator reflection, SyntaxWriter writer)
        {
            XPathNavigator    baseClass  = reflection.SelectSingleNode(apiBaseClassExpression);
            XPathNodeIterator implements = reflection.Select(apiImplementedInterfacesExpression);

            bool hasBaseClass             = (baseClass != null) && !((bool)baseClass.Evaluate(typeIsObjectExpression));
            bool hasImplementedInterfaces = (implements.Count > 0);

            if (hasBaseClass || hasImplementedInterfaces)
            {
                writer.WriteString(" : ");
                if (hasBaseClass)
                {
                    writer.WriteKeyword("public");
                    writer.WriteString(" ");
                    WriteTypeReference(baseClass, false, writer);
                    if (hasImplementedInterfaces)
                    {
                        writer.WriteString(", ");
                        if (writer.Position > maxPosition)
                        {
                            writer.WriteLine();
                            writer.WriteString("\t");
                        }
                    }
                }

                while (implements.MoveNext())
                {
                    XPathNavigator implement = implements.Current;
                    WriteTypeReference(implement, false, writer);
                    if (implements.CurrentPosition < implements.Count)
                    {
                        writer.WriteString(", ");
                        if (writer.Position > maxPosition)
                        {
                            writer.WriteLine();
                            writer.WriteString("\t");
                        }
                    }
                }
            }
        }
 private void WriteAttribute(string reference, SyntaxWriter writer, bool newline)
 {
     writer.WriteString("/** @attribute ");
     writer.WriteReferenceLink(reference);
     writer.WriteString(" */ ");
     if (newline)
     {
         writer.WriteLine();
     }
 }
 private void WriteAttribute(string reference, bool newLine, SyntaxWriter writer)
 {
     writer.WriteString("<");
     writer.WriteReferenceLink(reference);
     writer.WriteString(">");
     if (newLine)
     {
         writer.WriteString(" _");
         writer.WriteLine();
     }
 }
        private void WriteParameters(XPathNodeIterator parameters, XPathNavigator reflection, SyntaxWriter writer)
        {
            bool isExtension = (bool)reflection.Evaluate(apiIsExtensionMethod);


            while (parameters.MoveNext())
            {
                XPathNavigator parameter = parameters.Current;

                string         name         = (string)parameter.Evaluate(parameterNameExpression);
                XPathNavigator type         = parameter.SelectSingleNode(parameterTypeExpression);
                bool           isIn         = (bool)parameter.Evaluate(parameterIsInExpression);
                bool           isOut        = (bool)parameter.Evaluate(parameterIsOutExpression);
                bool           isRef        = (bool)parameter.Evaluate(parameterIsRefExpression);
                bool           isParamArray = (bool)parameter.Evaluate(parameterIsParamArrayExpression);

                writer.WriteString("\t");

                if (isExtension && parameters.CurrentPosition == 1)
                {
                    writer.WriteKeyword("this");
                    writer.WriteString(" ");
                }

                if (isRef)
                {
                    if (isOut)
                    {
                        writer.WriteKeyword("out");
                    }
                    else
                    {
                        writer.WriteKeyword("ref");
                    }
                    writer.WriteString(" ");
                }

                if (isParamArray)
                {
                    writer.WriteKeyword("params");
                    writer.WriteString(" ");
                }

                WriteTypeReference(type, writer);
                writer.WriteString(" ");
                writer.WriteParameter(name);

                if (parameters.CurrentPosition < parameters.Count)
                {
                    writer.WriteString(",");
                }
                writer.WriteLine();
            }
        }
Beispiel #20
0
        // Visibility

        private void WriteProcedureVisibility(XPathNavigator reflection, SyntaxWriter writer)
        {
            string typeSubgroup = (string)reflection.Evaluate(apiContainingTypeSubgroupExpression);

            if (typeSubgroup != "interface")
            {
                WriteVisibility(reflection, writer);
                writer.WriteString(":");
                writer.WriteLine();
            }
        }
Beispiel #21
0
        private void WriteMethodParameters(XPathNavigator reflection, SyntaxWriter writer)
        {
            XPathNodeIterator parameters = reflection.Select(apiParametersExpression);

            writer.WriteString("(");
            if (parameters.Count > 0)
            {
                writer.WriteLine();
                WriteParameters(parameters, true, writer);
            }
            writer.WriteString(")");
        }
        public override void WriteEventSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            if (IsUnsupportedUnsafe(reflection, writer))
            {
                return;
            }

            string         name    = (string)reflection.Evaluate(apiNameExpression);
            XPathNavigator handler = reflection.SelectSingleNode(apiHandlerOfEventExpression);

            writer.WriteString("/** @event */");
            writer.WriteLine();
            // add_ method declaration
            WriteAttributes(reflection, writer);
            WriteProcedureModifiers(reflection, writer);
            WriteReturnValue(reflection, writer);
            writer.WriteString(" ");
            writer.WriteIdentifier("add_" + name);
            writer.WriteString(" (");
            WriteTypeReference(handler, writer);
            writer.WriteString(" ");
            writer.WriteParameter("value");
            writer.WriteString(")");
            writer.WriteLine();

            writer.WriteString("/** @event */");
            writer.WriteLine();
            // remove_ method declaration
            WriteAttributes(reflection, writer);
            WriteProcedureModifiers(reflection, writer);
            WriteReturnValue(reflection, writer);
            writer.WriteString(" ");
            writer.WriteIdentifier("remove_" + name);
            writer.WriteString(" (");
            WriteTypeReference(handler, writer);
            writer.WriteString(" ");
            writer.WriteParameter("value");
            writer.WriteString(")");
            writer.WriteLine();
        }
Beispiel #23
0
        // A grandiose Property Element Usage block
        // syntax looks like:
        //   <object>
        //     <object.PropertyName>
        //       <linkToType .../>
        //     </object.PropertyName>
        //   </object>
        private void PropertyElementUsageGrande(XPathNavigator propertyReflection, SyntaxWriter writer)
        {
            string         xamlBlockId  = System.Enum.GetName(typeof(XamlHeadingID), XamlHeadingID.xamlPropertyElementUsageHeading);
            string         propertyName = (string)propertyReflection.Evaluate(apiNameExpression);
            XPathNavigator returnType   = propertyReflection.SelectSingleNode(apiReturnTypeExpression);

            // start the syntax block
            writer.WriteStartSubBlock(xamlBlockId);

            //   <object>
            writer.WriteString("<");
            writer.WriteParameter("object");
            writer.WriteString(">");
            writer.WriteLine();
            //     <object.PropertyName>
            writer.WriteString("  <");
            writer.WriteParameter("object");
            writer.WriteString(".");
            writer.WriteIdentifier(propertyName);
            writer.WriteString(">");
            writer.WriteLine();
            //       <linkToType .../>
            writer.WriteString("    <");
            WriteTypeReference(returnType, writer);
            writer.WriteString(" .../>");
            writer.WriteLine();
            //     </object.PropertyName>
            writer.WriteString("  </");
            writer.WriteParameter("object");
            writer.WriteString(".");
            writer.WriteIdentifier(propertyName);
            writer.WriteString(">");
            writer.WriteLine();
            //   </object>
            writer.WriteString("</");
            writer.WriteParameter("object");
            writer.WriteString(">");

            writer.WriteEndSubBlock();
        }
        private void WriteImplementedInterfaces(XPathNavigator reflection, SyntaxWriter writer)
        {
            XPathNodeIterator implements = reflection.Select(apiImplementedInterfacesExpression);

            if (implements.Count == 0)
            {
                return;
            }

            writer.WriteString(" _");
            writer.WriteLine();
            writer.WriteString("\t");
            string subgroup = (string)reflection.Evaluate(apiSubgroupExpression);

            if (subgroup == "interface")
            {
                writer.WriteKeyword("Inherits");
            }
            else
            {
                writer.WriteKeyword("Implements");
            }
            writer.WriteString(" ");
            while (implements.MoveNext())
            {
                XPathNavigator implement = implements.Current;
                if (implements.CurrentPosition > 1)
                {
                    writer.WriteString(", ");
                    if (writer.Position > maxPosition)
                    {
                        writer.WriteString(" _");
                        writer.WriteLine();
                        writer.WriteString("\t");
                    }
                }
                WriteTypeReference(implement, writer);
            }
        }
        public override void WriteEventSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            bool           isStatic      = (bool)reflection.Evaluate(apiIsStaticExpression);
            bool           isFamily      = (bool)reflection.Evaluate(apiIsFamilyMemberExpression);
            XPathNavigator declaringType = reflection.SelectSingleNode(apiContainingTypeExpression);
            XPathNavigator handler       = reflection.SelectSingleNode(apiHandlerOfEventExpression);

            if (!(isStatic | isFamily))
            {
                ParameterDeclaration("instance", declaringType, writer);
            }
            ParameterDeclaration("handler", handler, writer);

            // adder
            writer.WriteLine();
            writer.WriteKeyword("AddHandler");
            writer.WriteString(" ");
            WriteMemberName(reflection, writer);
            writer.WriteString(", ");
            writer.WriteParameter("handler");
            writer.WriteLine();
        }
        // Interfaces

        private void WriteBaseClass(XPathNavigator reflection, SyntaxWriter writer)
        {
            XPathNavigator baseClass = reflection.SelectSingleNode(apiBaseClassExpression);

            if ((baseClass != null) && !((bool)baseClass.Evaluate(typeIsObjectExpression)))
            {
                writer.WriteString(" _");
                writer.WriteLine();
                writer.WriteString("\t");
                writer.WriteKeyword("Inherits");
                writer.WriteString(" ");
                WriteTypeReference(baseClass, writer);
            }
        }
        private void WritePropertyParameters(XPathNavigator reflection, SyntaxWriter writer)
        {
            XPathNodeIterator parameters = reflection.Select(apiParametersExpression);

            if (parameters.Count == 0)
            {
                return;
            }

            writer.WriteString("[");
            writer.WriteLine();
            WriteParameters(parameters, reflection, writer);
            writer.WriteString("]");
        }
        private void WriteAttributes(XPathNavigator reflection, SyntaxWriter writer)
        {
            XPathNodeIterator attributes = (XPathNodeIterator)reflection.Evaluate(apiAttributesExpression);

            foreach (XPathNavigator attribute in attributes)
            {
                XPathNavigator type = attribute.SelectSingleNode(attributeTypeExpression);

                writer.WriteString("/** @attribute ");
                WriteTypeReference(type, writer);

                XPathNodeIterator arguments   = (XPathNodeIterator)attribute.Select(attributeArgumentsExpression);
                XPathNodeIterator assignments = (XPathNodeIterator)attribute.Select(attributeAssignmentsExpression);

                if ((arguments.Count > 0) || (assignments.Count > 0))
                {
                    writer.WriteString("(");
                    while (arguments.MoveNext())
                    {
                        XPathNavigator argument = arguments.Current;
                        if (arguments.CurrentPosition > 1)
                        {
                            writer.WriteString(", ");
                        }
                        WriteValue(argument, writer);
                    }
                    if ((arguments.Count > 0) && (assignments.Count > 0))
                    {
                        writer.WriteString(", ");
                    }
                    while (assignments.MoveNext())
                    {
                        XPathNavigator assignment = assignments.Current;
                        if (assignments.CurrentPosition > 1)
                        {
                            writer.WriteString(", ");
                        }
                        writer.WriteString((string)assignment.Evaluate(assignmentNameExpression));
                        writer.WriteString(" = ");
                        WriteValue(assignment, writer);
                    }
                    writer.WriteString(")");
                }

                writer.WriteString(" */");
                writer.WriteLine();
            }
        }
Beispiel #29
0
        /// <summary>
        /// Write out enumeration syntax
        /// </summary>
        /// <param name="reflection">The reflection information</param>
        /// <param name="writer">The syntax writer to which it is written</param>
        public override void WriteEnumerationSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            string identifier = ReadFullTypeName(reflection);

            writer.WriteIdentifier(identifier);
            writer.WriteString(" = ");
            writer.WriteKeyword("function");
            writer.WriteString("();");
            writer.WriteLine();
            writer.WriteIdentifier(identifier);
            writer.WriteString(".createEnum('");
            writer.WriteIdentifier(identifier);
            writer.WriteString("', ");
            writer.WriteString(HasAttribute(reflection, "System.FlagsAttribute") ? "true" : "false");
            writer.WriteString(");");
        }
Beispiel #30
0
        /// <summary>
        /// Write out interface syntax
        /// </summary>
        /// <param name="reflection">The reflection information</param>
        /// <param name="writer">The syntax writer to which it is written</param>
        public override void WriteInterfaceSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            if (!this.IsUnsupported(reflection, writer))
            {
                string identifier = ReadFullTypeName(reflection);

                writer.WriteIdentifier(identifier);
                writer.WriteString(" = ");
                writer.WriteKeyword("function");
                writer.WriteString("();");
                writer.WriteLine();
                writer.WriteIdentifier(identifier);
                writer.WriteString(".createInterface('");
                writer.WriteIdentifier(identifier);
                writer.WriteString("');");
            }
        }
Beispiel #31
0
        private void WriteParameters(XPathNodeIterator parameters, bool multiline, SyntaxWriter writer)
        {
            while (parameters.MoveNext())
            {
                XPathNavigator parameter = parameters.Current;

                XPathNavigator type         = parameter.SelectSingleNode(parameterTypeExpression);
                string         name         = (string)parameter.Evaluate(parameterNameExpression);
                bool           isIn         = (bool)parameter.Evaluate(parameterIsInExpression);
                bool           isOut        = (bool)parameter.Evaluate(parameterIsOutExpression);
                bool           isParamArray = (bool)parameter.Evaluate(parameterIsParamArrayExpression);

                if (multiline)
                {
                    writer.WriteString("\t");
                }
                if (isIn)
                {
                    WriteAttribute("T:System.Runtime.InteropServices.InAttribute", false, writer);
                    writer.WriteString(" ");
                }
                if (isOut)
                {
                    WriteAttribute("T:System.Runtime.InteropServices.OutAttribute", false, writer);
                    writer.WriteString(" ");
                }
                if (isParamArray)
                {
                    writer.WriteString("... ");
                }
                WriteTypeReference(type, writer);
                writer.WriteString(" ");
                writer.WriteParameter(name);

                if (parameters.CurrentPosition < parameters.Count)
                {
                    writer.WriteString(", ");
                }
                if (multiline)
                {
                    writer.WriteLine();
                }
            }
        }
		private void WriteAttribute (string reference, bool newLine, SyntaxWriter writer) {
			writer.WriteString("<");
			writer.WriteReferenceLink(reference);
			writer.WriteString(">");
			if (newLine) {
				writer.WriteString(" _");
				writer.WriteLine();
			}
		}
		private void WriteParameters (XPathNodeIterator parameters, XPathNavigator reflection, SyntaxWriter writer) {

			while (parameters.MoveNext()) {
				XPathNavigator parameter = parameters.Current;

				string name = (string) parameter.Evaluate(parameterNameExpression);
				XPathNavigator type = parameter.SelectSingleNode(parameterTypeExpression);
				bool isIn = (bool) parameter.Evaluate(parameterIsInExpression);
				bool isOut = (bool) parameter.Evaluate(parameterIsOutExpression);
				bool isRef = (bool) parameter.Evaluate(parameterIsRefExpression);
				// bool isParamArray = (bool) parameter.Evaluate(parameterIsParamArrayExpression);

				writer.WriteString("\t");

				if (isIn) WriteAttribute("T:System.Runtime.InteropServices.InAttribute", writer, false);
				if (isOut) WriteAttribute("T:System.Runtime.InteropServices.OutAttribute", writer, false);
				if (isRef) {
					writer.WriteString("/** @ref */");
				}

				WriteTypeReference(type, writer);
				writer.WriteString(" ");
				writer.WriteParameter(name);

				if (parameters.CurrentPosition < parameters.Count) writer.WriteString(",");
				writer.WriteLine();
			}

		}
		// Interfaces

		private void WriteBaseClass (XPathNavigator reflection, SyntaxWriter writer) {

			XPathNavigator baseClass = reflection.SelectSingleNode(apiBaseClassExpression);

			if ((baseClass != null) && !((bool) baseClass.Evaluate(typeIsObjectExpression))) {
				writer.WriteString(" _");
				writer.WriteLine();
				writer.WriteString("\t");
				writer.WriteKeyword("Inherits");
				writer.WriteString(" ");
				WriteTypeReference(baseClass, writer);
			}

		}
		private void WriteImplementedInterfaces (XPathNavigator reflection, SyntaxWriter writer) {

			XPathNodeIterator implements = reflection.Select(apiImplementedInterfacesExpression);

			if (implements.Count == 0) return;

			writer.WriteString(" _");
			writer.WriteLine();
			writer.WriteString("\t");
            string subgroup = (string)reflection.Evaluate(apiSubgroupExpression);
            if (subgroup == "interface")
                writer.WriteKeyword("Inherits");
            else
                writer.WriteKeyword("Implements");
            writer.WriteString(" ");
			while (implements.MoveNext()) {
				XPathNavigator implement = implements.Current;
                if (implements.CurrentPosition > 1) {
                    writer.WriteString(", ");
                    if (writer.Position > maxPosition) {
                        writer.WriteString(" _");
                        writer.WriteLine();
                        writer.WriteString("\t");
                    }
                }
				WriteTypeReference(implement, writer);
			}

		}
		// Parameters

		private void WriteParameters (XPathNavigator reflection, SyntaxWriter writer) {

			XPathNodeIterator parameters = reflection.Select(apiParametersExpression);
			if (parameters.Count == 0) return;

			writer.WriteString(" ( _");
			writer.WriteLine();
			while (parameters.MoveNext()) {
				XPathNavigator parameter = parameters.Current;
				XPathNavigator type = parameter.SelectSingleNode(parameterTypeExpression);
				string name = (string) parameter.Evaluate(parameterNameExpression);
				bool isIn = (bool) parameter.Evaluate(parameterIsInExpression);
				bool isOut = (bool) parameter.Evaluate(parameterIsOutExpression);
				bool isParamArray = (bool) parameter.Evaluate(parameterIsParamArrayExpression);
				bool isByRef = (bool) parameter.Evaluate(parameterIsRefExpression);

				writer.WriteString("\t");
				if (isOut) {
					WriteAttribute("T:System.Runtime.InteropServices.OutAttribute", false, writer);
					writer.WriteString(" ");
				}
				if (isParamArray) {
					writer.WriteKeyword("ParamArray");
					writer.WriteString(" ");
				}
				if (isByRef) {
					writer.WriteKeyword("ByRef");
					writer.WriteString(" ");
				}
				writer.WriteParameter(name);
				writer.WriteString(" ");
				writer.WriteKeyword("As");
				writer.WriteString(" ");
				WriteTypeReference(type, writer);
				if (parameters.CurrentPosition < parameters.Count) writer.WriteString(",");
				writer.WriteString(" _");
				writer.WriteLine();
			}
			writer.WriteString(")");

		}
 private void WriteExplicitImplementations (XPathNavigator reflection, SyntaxWriter writer) {
     bool isExplicit = (bool)reflection.Evaluate(apiIsExplicitImplementationExpression);
     if (isExplicit) {
         if (writer.Position > maxPosition) {
             writer.WriteLine();
             writer.WriteString("\t");
         } else {
             writer.WriteString(" ");
         }
         writer.WriteKeyword("Implements");
         writer.WriteString(" ");
         XPathNodeIterator implementations = reflection.Select(apiImplementedMembersExpression);
         while (implementations.MoveNext()) {
             XPathNavigator implementation = implementations.Current;
             XPathNavigator contract = implementation.SelectSingleNode(memberDeclaringTypeExpression);
             //string id = implementation.GetAttribute("api", String.Empty);
             if (implementations.CurrentPosition > 1) writer.WriteString(", ");
             WriteTypeReference(contract, writer);
             writer.WriteString(".");
             WriteMemberReference(implementation, writer);
             //writer.WriteReferenceLink(id);	
         }
     }
 }
		// Generics

		private void WriteGenericTemplates (XPathNavigator reflection, SyntaxWriter writer) {

			XPathNodeIterator templateNodes = (XPathNodeIterator) reflection.Evaluate(apiTemplatesExpression);
			if (templateNodes.Count == 0) return;
			XPathNavigator[] templates = ConvertIteratorToArray(templateNodes);
			if (templates.Length == 0) return;

			// generic declaration
			writer.WriteKeyword("generic");
			writer.WriteString("<");
			for (int i=0; i<templates.Length; i++) {
				XPathNavigator template = templates[i];
				string name = (string) template.Evaluate(templateNameExpression);
				if (i> 0) writer.WriteString(", ");
				writer.WriteKeyword("typename");
				writer.WriteString(" ");
				writer.WriteString(name);
			}
			writer.WriteString(">");
			writer.WriteLine();

			// generic constraints
			foreach (XPathNavigator template in templates) {
				bool constrained = (bool) template.Evaluate(templateIsConstrainedExpression);
				if (!constrained) continue;

				string name = (string) template.Evaluate(templateNameExpression);

				writer.WriteKeyword("where");
				writer.WriteString(" ");
				writer.WriteString(name);
				writer.WriteString(" : ");

				bool value = (bool) template.Evaluate(templateIsValueTypeExpression);
				bool reference = (bool) template.Evaluate(templateIsReferenceTypeExpression);
				bool constructor = (bool) template.Evaluate(templateIsConstructableExpression);
				XPathNodeIterator constraints = template.Select(templateConstraintsExpression);

				// keep track of whether there is a previous constraint, so we know whether to put a comma
				bool previous = false;

				if (value) {
					if (previous) writer.WriteString(", ");
					writer.WriteKeyword("value class");
					previous = true;
				}
				
				if (reference) {
					if (previous) writer.WriteString(", ");
					writer.WriteKeyword("ref class");
					previous = true;
				}

				if (constructor) {
					if (previous) writer.WriteString(", ");
					writer.WriteKeyword("gcnew");
					writer.WriteString("()");
					previous = true;
				}

				foreach (XPathNavigator constraint in constraints) {
					if (previous) writer.WriteString(", ");
					WriteTypeReference(constraint, false, writer);
					previous = true;
				}

				writer.WriteLine();

			}

		}
		public override void WriteEventSyntax (XPathNavigator reflection, SyntaxWriter writer) {

			if (IsUnsupportedUnsafe(reflection, writer)) return;

			string name = (string) reflection.Evaluate(apiNameExpression);
			XPathNavigator handler = reflection.SelectSingleNode(apiHandlerOfEventExpression);

			writer.WriteString("/** @event */");
			writer.WriteLine();
			// add_ method declaration
            WriteAttributes(reflection, writer);
            WriteProcedureModifiers(reflection, writer);
            WriteReturnValue(reflection, writer);
            writer.WriteString(" ");
            writer.WriteIdentifier("add_" + name);
            writer.WriteString(" (");
            WriteTypeReference(handler, writer);
            writer.WriteString(" ");
            writer.WriteParameter("value");
            writer.WriteString(")");
			writer.WriteLine();

			writer.WriteString("/** @event */");
			writer.WriteLine();
			// remove_ method declaration
            WriteAttributes(reflection, writer);
            WriteProcedureModifiers(reflection, writer);
            WriteReturnValue(reflection, writer);
            writer.WriteString(" ");
            writer.WriteIdentifier("remove_" + name);
            writer.WriteString(" (");
            WriteTypeReference(handler, writer);
            writer.WriteString(" ");
            writer.WriteParameter("value");
            writer.WriteString(")");
			writer.WriteLine();

		}
		public override void WriteDelegateSyntax (XPathNavigator reflection, SyntaxWriter writer) {

			if (IsUnsupportedUnsafe(reflection, writer)) return;
			if (IsUnsupportedGeneric(reflection, writer)) return;

			string name = (string) reflection.Evaluate(apiNameExpression);
			bool isSerializable = (bool) reflection.Evaluate(apiIsSerializableTypeExpression);

			writer.WriteString("/** @delegate */");
			writer.WriteLine();

			if (isSerializable) WriteAttribute("T:System.SerializableAttribute", writer);
			WriteAttributes(reflection, writer);
			WriteVisibility(reflection, writer);
			writer.WriteString(" ");
			writer.WriteKeyword("delegate");
			writer.WriteString(" ");
			WriteReturnValue(reflection, writer);
			writer.WriteString(" ");
			writer.WriteIdentifier(name);
			WriteMethodParameters(reflection, writer);
			
		}
		public override void WritePropertySyntax (XPathNavigator reflection, SyntaxWriter writer) {

			if (IsUnsupportedUnsafe(reflection, writer)) return;

			string name = (string) reflection.Evaluate(apiNameExpression);
			bool getter = (bool) reflection.Evaluate(apiIsReadPropertyExpression);
			bool setter = (bool) reflection.Evaluate(apiIsWritePropertyExpression);
            bool isDefault = (bool)reflection.Evaluate(apiIsDefaultMemberExpression);
            bool isExplicit = (bool)reflection.Evaluate(apiIsExplicitImplementationExpression);
			XPathNavigator type = reflection.SelectSingleNode(apiReturnTypeExpression);

			WriteAttributes(reflection, writer);
			WriteProcedureModifiers(reflection, writer);
			if (getter && !setter) {
				writer.WriteKeyword("ReadOnly");
				writer.WriteString(" ");
			} else if (setter && !getter) {
				writer.WriteKeyword("WriteOnly");
				writer.WriteString(" ");
			}
            if (isDefault) {
                writer.WriteKeyword("Default");
                writer.WriteString(" ");
            }
			writer.WriteKeyword("Property");
			writer.WriteString(" ");
			writer.WriteIdentifier(name);
			WriteParameters(reflection, writer);
			writer.WriteString(" ");
			writer.WriteKeyword("As");
			writer.WriteString(" ");
			WriteTypeReference(type, writer);

			if (isExplicit) {
                if (writer.Position > maxPosition) {
                    writer.WriteLine();
                    writer.WriteString("\t");
                } else {
                    writer.WriteString(" ");
                }
                writer.WriteKeyword("Implements");
				writer.WriteString(" ");
				XPathNodeIterator implementations = reflection.Select(apiImplementedMembersExpression);
				while (implementations.MoveNext()) {
					XPathNavigator implementation = implementations.Current;
					XPathNavigator contract = implementation.SelectSingleNode(memberDeclaringTypeExpression);
					//string id = implementation.GetAttribute("api", String.Empty);
					if (implementations.CurrentPosition > 1) writer.WriteString(", ");
					WriteTypeReference(contract, writer);
					writer.WriteString(".");
                    WriteMemberReference(implementation, writer);
					//writer.WriteReferenceLink(id);	
				}
			}

            if (getter)
            {
                writer.WriteLine();
                writer.WriteString("\t");
                string getVisibility = (string)reflection.Evaluate(apiGetVisibilityExpression);
                if (!String.IsNullOrEmpty(getVisibility))
                {
                    WriteVisibility(getVisibility, writer);
                    writer.WriteString(" ");
                }
                writer.WriteKeyword("Get");
            }
            if (setter)
            {
                writer.WriteLine();
                writer.WriteString("\t");
                string setVisibility = (string)reflection.Evaluate(apiSetVisibilityExpression);
                if (!String.IsNullOrEmpty(setVisibility))
                {
                    WriteVisibility(setVisibility, writer);
                    writer.WriteString(" ");
                }
                writer.WriteKeyword("Set");
            }
		}
        private void ObjectElementUsageForClassStruct(XPathNavigator reflection, SyntaxWriter writer)
        {
            string typeName = (string)reflection.Evaluate(apiNameExpression);
            bool isGeneric = (bool)reflection.Evaluate(apiIsGenericExpression);
            string xamlBlockId = System.Enum.GetName(typeof(XamlHeadingID), XamlHeadingID.xamlObjectElementUsageHeading);

            string contentPropertyId = (string)reflection.Evaluate(contentPropertyIdExpression);
            if (contentPropertyId == "")
                contentPropertyId = (string)reflection.Evaluate(ancestorContentPropertyIdExpression);

            // start the syntax block
            writer.WriteStartSubBlock(xamlBlockId);

            writer.WriteString("<");
            if (isGeneric)
            {
                writer.WriteIdentifier(typeName);

                // for generic types show the type arguments
                XPathNodeIterator templates = (XPathNodeIterator)reflection.Evaluate(apiTemplatesExpression);
                if (templates.Count > 0)
                {
                    writer.WriteString(" x:TypeArguments=\"");
                    while (templates.MoveNext())
                    {
                        XPathNavigator template = templates.Current;
                        string name = template.GetAttribute("name", String.Empty);
                        writer.WriteString(name);
                        if (templates.CurrentPosition < templates.Count)
                            writer.WriteString(",");
                    }
                    writer.WriteString("\"");
                }
            }
            else
            {
                // for non-generic types just show the name
                writer.WriteIdentifier(typeName);
            }
            if (contentPropertyId == string.Empty)
            {
                writer.WriteString(" .../>");
            }
            else
            {
                // close the start tag
                writer.WriteString(">");

                // the inner xml of the Object Element syntax for a type with a content property
                // is a link to the content property
                writer.WriteLine();
                writer.WriteString("  ");
                writer.WriteReferenceLink(contentPropertyId);
                writer.WriteLine();

                // write the end tag
                writer.WriteString("</");
                writer.WriteIdentifier(typeName);
                writer.WriteString(">");
            }

            // end the sub block
            writer.WriteEndSubBlock();
        }
		private void WriteAttributes (XPathNavigator reflection, SyntaxWriter writer) {

			XPathNodeIterator attributes = (XPathNodeIterator) reflection.Evaluate(apiAttributesExpression);

			foreach (XPathNavigator attribute in attributes) {

				XPathNavigator type = attribute.SelectSingleNode(attributeTypeExpression);

				writer.WriteString("/** @attribute ");
				WriteTypeReference(type, writer);

				XPathNodeIterator arguments = (XPathNodeIterator) attribute.Select(attributeArgumentsExpression);
				XPathNodeIterator assignments = (XPathNodeIterator) attribute.Select(attributeAssignmentsExpression);

				if ((arguments.Count > 0) || (assignments.Count > 0)) {
					writer.WriteString("(");
					while (arguments.MoveNext()) {
						XPathNavigator argument = arguments.Current;
						if (arguments.CurrentPosition > 1) writer.WriteString(", ");
						WriteValue(argument, writer);
					}
					if ((arguments.Count > 0) && (assignments.Count > 0)) writer.WriteString(", ");
					while (assignments.MoveNext()) {
						XPathNavigator assignment = assignments.Current;
						if (assignments.CurrentPosition > 1) writer.WriteString(", ");
						writer.WriteString((string) assignment.Evaluate(assignmentNameExpression));
						writer.WriteString(" = ");
						WriteValue(assignment, writer);
					}
					writer.WriteString(")");
				}

				writer.WriteString(" */");
				writer.WriteLine();
			}

		}
        public override void WriteEventSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {
            string name = (string)reflection.Evaluate(apiNameExpression);
            XPathNavigator handler = reflection.SelectSingleNode(apiHandlerOfEventExpression);
            XPathNavigator args = reflection.SelectSingleNode(apiEventArgsExpression);
            bool isVirtual = (bool)reflection.Evaluate(apiIsVirtualExpression) && !(bool)reflection.Evaluate(apiIsAbstractProcedureExpression);
            int iterations = isVirtual ? 2 : 1;

            for (int i = 0; i < iterations; i++)
            {
                WriteAttributes(reflection, writer);
                WriteVisibility(reflection, writer);
                if (isVirtual)
                    if (i == 0)
                    {
                        writer.WriteKeyword("abstract");
                        writer.WriteString(" ");
                    }
                    else
                    {
                        writer.WriteKeyword("override");
                        writer.WriteString(" ");
                    }
                else
                {
                    WriteMemberKeyword(reflection, writer);
                }
                writer.WriteIdentifier(name);
                writer.WriteString(" : ");
                writer.WriteReferenceLink("T:Microsoft.FSharp.Control.IEvent");

                writer.WriteString("<");
                WriteTypeReference(handler, writer);
                writer.WriteString(",");
                writer.WriteLine();
                writer.WriteString("    ");
                if (args == null)
                {
                    writer.WriteReferenceLink("T:System.EventArgs");
                }
                else
                {
                    WriteTypeReference(args, writer);
                }
                writer.WriteString(">");
                if (i == 0)
                    writer.WriteLine();
            }
        }
		private void WriteAttribute (string reference, SyntaxWriter writer, bool newline) {
			writer.WriteString("/** @attribute ");
			writer.WriteReferenceLink(reference);
			writer.WriteString(" */ ");
			if (newline) writer.WriteLine();
		}
        public override void WriteNormalMethodSyntax(XPathNavigator reflection, SyntaxWriter writer)
        {

            string name = (string)reflection.Evaluate(apiNameExpression);
            bool isOverride = (bool)reflection.Evaluate(apiIsOverrideExpression);
            bool isStatic = (bool)reflection.Evaluate(apiIsStaticExpression);
            bool isVirtual = (bool)reflection.Evaluate(apiIsVirtualExpression) && !(bool)reflection.Evaluate(apiIsAbstractProcedureExpression);
            int iterations = isVirtual ? 2 : 1;

            for (int i = 0; i < iterations; i++)
            {

                WriteAttributes(reflection, writer);

                WriteVisibility(reflection, writer);

                if (isStatic)
                {
                    writer.WriteKeyword("static");
                    writer.WriteString(" ");
                }

                if (isVirtual)
                    if (i == 0)
                    {
                        writer.WriteKeyword("abstract");
                        writer.WriteString(" ");
                    }
                    else
                    {
                        writer.WriteKeyword("override");
                        writer.WriteString(" ");
                    }
                else
                {
                    WriteMemberKeyword(reflection, writer);
                }
 
                writer.WriteIdentifier(name);
                writer.WriteString(" : ");
                WriteParameters(reflection, writer);
                writer.WriteKeyword("->");
                writer.WriteString(" ");
                WriteReturnValue(reflection, writer);
                writer.WriteString(" ");
                WriteGenericTemplateConstraints(reflection, writer);

                if (i == 0)
                    writer.WriteLine();
            }
        }
        public override void WritePropertySyntax (XPathNavigator reflection, SyntaxWriter writer) {

			if (IsUnsupportedUnsafe(reflection, writer)) return;
			if (IsUnsupportedExplicit(reflection, writer)) return;

			string name = (string) reflection.Evaluate(apiNameExpression);
			bool isGettable = (bool) reflection.Evaluate(apiIsReadPropertyExpression);
			bool isSettable = (bool) reflection.Evaluate(apiIsWritePropertyExpression);

			if (isGettable) {
				writer.WriteString("/** @property */");
				writer.WriteLine();
				// write getter method
                WriteAttributes(reflection, writer);
                WriteProcedureModifiers(reflection, writer);
                WriteReturnValue(reflection, writer);
                writer.WriteString(" ");
                writer.WriteIdentifier("get_" + name);
                WriteMethodParameters(reflection, writer);
                writer.WriteLine();
			}

			if (isSettable) {
				writer.WriteString("/** @property */");
				writer.WriteLine();
				// write setter method
                WriteAttributes(reflection, writer);
                WriteProcedureModifiers(reflection, writer);
                writer.WriteString(" ");
                writer.WriteKeyword("void");
                writer.WriteString(" ");
                writer.WriteIdentifier("set_" + name);
                // parameters
                writer.WriteString("(");
                WriteReturnValue(reflection, writer);
                writer.WriteString(" ");
                writer.WriteParameter("value");
                writer.WriteString(")");
                // end parameters
                writer.WriteLine();
			}

		}
        // Initial version
        private void WriteAttributes(XPathNavigator reflection, SyntaxWriter writer)
        {

            XPathNodeIterator attributes = (XPathNodeIterator)reflection.Evaluate(apiAttributesExpression);

            foreach (XPathNavigator attribute in attributes)
            {

                XPathNavigator type = attribute.SelectSingleNode(attributeTypeExpression);
                if (type.GetAttribute("api", String.Empty) == "T:System.Runtime.CompilerServices.ExtensionAttribute") continue;

                writer.WriteString("[<");
                WriteTypeReference(type, writer);

                XPathNodeIterator arguments = (XPathNodeIterator)attribute.Select(attributeArgumentsExpression);
                XPathNodeIterator assignments = (XPathNodeIterator)attribute.Select(attributeAssignmentsExpression);

                if ((arguments.Count > 0) || (assignments.Count > 0))
                {
                    writer.WriteString("(");
                    while (arguments.MoveNext())
                    {
                        XPathNavigator argument = arguments.Current;
                        if (arguments.CurrentPosition > 1)
                        {
                            writer.WriteString(", ");
                            if (writer.Position > maxPosition)
                            {
                                writer.WriteLine();
                                writer.WriteString("    ");
                            }
                        }
                        WriteValue(argument, writer);
                    }
                    if ((arguments.Count > 0) && (assignments.Count > 0)) writer.WriteString(", ");
                    while (assignments.MoveNext())
                    {
                        XPathNavigator assignment = assignments.Current;
                        if (assignments.CurrentPosition > 1)
                        {
                            writer.WriteString(", ");
                            if (writer.Position > maxPosition)
                            {
                                writer.WriteLine();
                                writer.WriteString("    ");
                            }
                        }
                        writer.WriteString((string)assignment.Evaluate(assignmentNameExpression));
                        writer.WriteString(" = ");
                        WriteValue(assignment, writer);

                    }
                    writer.WriteString(")");
                }

                writer.WriteString(">]");
                writer.WriteLine();
            }

        }
		private void WritePropertyParameters (XPathNavigator reflection, SyntaxWriter writer) {

			XPathNodeIterator parameters = reflection.Select(apiParametersExpression);

			if (parameters.Count == 0) return;

			writer.WriteString("[");
			writer.WriteLine();
			WriteParameters(parameters, reflection, writer);
			writer.WriteString("]");

		}
		private void WriteParameters (XPathNodeIterator parameters, XPathNavigator reflection, SyntaxWriter writer) {

            bool isExtension = (bool) reflection.Evaluate(apiIsExtensionMethod);


			while (parameters.MoveNext()) {
				XPathNavigator parameter = parameters.Current;

				string name = (string) parameter.Evaluate(parameterNameExpression);
				XPathNavigator type = parameter.SelectSingleNode(parameterTypeExpression);
				bool isIn = (bool) parameter.Evaluate(parameterIsInExpression);
				bool isOut = (bool) parameter.Evaluate(parameterIsOutExpression);
				bool isRef = (bool) parameter.Evaluate(parameterIsRefExpression);
				bool isParamArray = (bool) parameter.Evaluate(parameterIsParamArrayExpression);

				writer.WriteString("\t");

                if (isExtension && parameters.CurrentPosition == 1) {
                    writer.WriteKeyword("this");
                    writer.WriteString(" ");
                }

				if (isRef) {
					if (isOut) {
						writer.WriteKeyword("out");
					} else {
						writer.WriteKeyword("ref");
					}
					writer.WriteString(" ");
				}

				if (isParamArray) {
					writer.WriteKeyword("params");
					writer.WriteString(" ");
				}

				WriteTypeReference(type, writer);
				writer.WriteString(" ");
				writer.WriteParameter(name);

				if (parameters.CurrentPosition < parameters.Count) writer.WriteString(",");
				writer.WriteLine();
			}

		}
        // A grandiose Property Element Usage block
        // syntax looks like: 
        //   <object>
        //     <object.PropertyName>
        //       <linkToType .../>
        //     </object.PropertyName>
        //   </object>
        private void PropertyElementUsageGrande(XPathNavigator propertyReflection, SyntaxWriter writer)
        {
            string xamlBlockId = System.Enum.GetName(typeof(XamlHeadingID), XamlHeadingID.xamlPropertyElementUsageHeading);
            string propertyName = (string)propertyReflection.Evaluate(apiNameExpression);
            XPathNavigator returnType = propertyReflection.SelectSingleNode(apiReturnTypeExpression);

            // start the syntax block
            writer.WriteStartSubBlock(xamlBlockId);

            //   <object>
            writer.WriteString("<");
            writer.WriteParameter("object");
            writer.WriteString(">");
            writer.WriteLine();
            //     <object.PropertyName>
            writer.WriteString("  <");
            writer.WriteParameter("object");
            writer.WriteString(".");
            writer.WriteIdentifier(propertyName);
            writer.WriteString(">");
            writer.WriteLine();
            //       <linkToType .../>
            writer.WriteString("    <");
            WriteTypeReference(returnType, writer);
            writer.WriteString(" .../>");
            writer.WriteLine();
            //     </object.PropertyName>
            writer.WriteString("  </");
            writer.WriteParameter("object");
            writer.WriteString(".");
            writer.WriteIdentifier(propertyName);
            writer.WriteString(">");
            writer.WriteLine();
            //   </object>
            writer.WriteString("</");
            writer.WriteParameter("object");
            writer.WriteString(">");

            writer.WriteEndSubBlock();
        }
		public override void WriteNormalMethodSyntax (XPathNavigator reflection, SyntaxWriter writer) {
            if (IsUnsupportedVarargs(reflection, writer)) return;

			string name = (string) reflection.Evaluate(apiNameExpression);
			XPathNavigator type = reflection.SelectSingleNode(apiReturnTypeExpression);
			bool isExplicit = (bool) reflection.Evaluate(apiIsExplicitImplementationExpression);

			WriteAttributes(reflection, writer);
			WriteProcedureModifiers(reflection, writer);
			if (type == null) {
				writer.WriteKeyword("Sub");
			} else {
				writer.WriteKeyword("Function");
			}
			writer.WriteString(" ");
			writer.WriteIdentifier(name);
			WriteGenericTemplates(reflection, writer);
			WriteParameters(reflection, writer);
			if (type != null) {
				writer.WriteString(" ");
				writer.WriteKeyword("As");
				writer.WriteString(" ");
				WriteTypeReference(type, writer);
			}
			if (isExplicit) {
                if (writer.Position > maxPosition) {
                    writer.WriteLine();
                    writer.WriteString("\t");
                } else {
                    writer.WriteString(" ");
                }
                writer.WriteKeyword("Implements");
				writer.WriteString(" ");
				XPathNodeIterator implementations = reflection.Select(apiImplementedMembersExpression);
				while (implementations.MoveNext()) {
					XPathNavigator implementation = implementations.Current;
					XPathNavigator contract = implementation.SelectSingleNode(attributeTypeExpression);
					// string id = implementation.GetAttribute("api", String.Empty);
					if (implementations.CurrentPosition > 1) writer.WriteString(", ");
					WriteTypeReference(contract, writer);
					writer.WriteString(".");
                    WriteMemberReference(implementation, writer);
				}
			}

		}
        // DONE
        public override void WritePropertySyntax(XPathNavigator reflection, SyntaxWriter writer)
        {

            string name = (string)reflection.Evaluate(apiNameExpression);
            bool isGettable = (bool)reflection.Evaluate(apiIsReadPropertyExpression);
            bool isSettable = (bool)reflection.Evaluate(apiIsWritePropertyExpression);
            
            bool isStatic = (bool)reflection.Evaluate(apiIsStaticExpression);
            bool isVirtual = (bool)reflection.Evaluate(apiIsVirtualExpression) && !(bool)reflection.Evaluate(apiIsAbstractProcedureExpression);
            int iterations = isVirtual ? 2 : 1;

            for (int i = 0; i < iterations; i++)
            {
                WriteAttributes(reflection, writer);
                WriteVisibility(reflection, writer);

                if (isStatic)
                {
                    writer.WriteKeyword("static");
                    writer.WriteString(" ");
                }

                if (isVirtual)
                    if (i == 0)
                    {
                        writer.WriteKeyword("abstract");
                        writer.WriteString(" ");
                    }
                    else
                    {
                        writer.WriteKeyword("override");
                        writer.WriteString(" ");
                    }
                else
                {
                    WriteMemberKeyword(reflection, writer);
                }

                writer.WriteIdentifier(name);
                writer.WriteString(" : ");
                WriteReturnValue(reflection, writer);

                if (isSettable)
                {
                    writer.WriteString(" ");
                    writer.WriteKeyword("with");
                    writer.WriteString(" ");

                    string getVisibility = (string)reflection.Evaluate(apiGetVisibilityExpression);
                    if (!String.IsNullOrEmpty(getVisibility))
                    {
                        WriteVisibility(getVisibility, writer);
                    }

                    writer.WriteKeyword("get");
                    writer.WriteString(", ");

                    string setVisibility = (string)reflection.Evaluate(apiSetVisibilityExpression);
                    if (!String.IsNullOrEmpty(setVisibility))
                    {
                        WriteVisibility(setVisibility, writer);
                    }

                    writer.WriteKeyword("set");
                }
                if (i == 0)
                    writer.WriteLine();
            }
        }
		// Interfaces

		private void WriteImplementedInterfaces (XPathNavigator reflection, SyntaxWriter writer) {

			XPathNodeIterator implements = reflection.Select(apiImplementedInterfacesExpression);

			if (implements.Count == 0) return;
			writer.WriteString(" : ");
			while (implements.MoveNext()) {
				XPathNavigator implement = implements.Current;
				WriteTypeReference(implement, writer);
                if (implements.CurrentPosition < implements.Count) {
                    writer.WriteString(", ");
                    if (writer.Position > maxPosition) {
                        writer.WriteLine();
                        writer.WriteString("\t");
                    }
                }
			}

		}
        private void WriteDotNetObject(XPathNavigator reflection, SyntaxWriter writer,
            string kind)
        {
            string name = reflection.Evaluate(apiNameExpression).ToString();
            bool isSerializable = (bool)reflection.Evaluate(apiIsSerializableTypeExpression);
            XPathNodeIterator implements = reflection.Select(apiImplementedInterfacesExpression);
            XPathNavigator baseClass = reflection.SelectSingleNode(apiBaseClassExpression);
            bool hasBaseClass = (baseClass != null) && !((bool)baseClass.Evaluate(typeIsObjectExpression));

            // CLR considers interfaces abstract.
            bool isAbstract = (bool)reflection.Evaluate(apiIsAbstractTypeExpression) && kind != "interface";
            bool isSealed = (bool)reflection.Evaluate(apiIsSealedTypeExpression);

            if (isAbstract)
                WriteAttribute("T:Microsoft.FSharp.Core.AbstractClassAttribute", writer);
            if (isSealed)
                WriteAttribute("T:Microsoft.FSharp.Core.SealedAttribute", writer);

            if (isSerializable) WriteAttribute("T:System.SerializableAttribute", writer);
            WriteAttributes(reflection, writer);

            writer.WriteKeyword("type");
            writer.WriteString(" ");
            writer.WriteIdentifier(name);
            WriteGenericTemplates(reflection, writer);
            writer.WriteString(" =  ");

            if (hasBaseClass || implements.Count != 0)
            {
                writer.WriteLine();
                writer.WriteString("    ");
            }
            writer.WriteKeyword(kind);

            if (hasBaseClass || implements.Count != 0)
            {
                writer.WriteLine();
            }

            if (hasBaseClass)
            {
                writer.WriteString("        ");
                writer.WriteKeyword("inherit");
                writer.WriteString(" ");
                WriteTypeReference(baseClass, writer);
                writer.WriteLine();
            }


            while (implements.MoveNext())
            {
                XPathNavigator implement = implements.Current;
                writer.WriteString("        ");
                writer.WriteKeyword("interface");
                writer.WriteString(" ");
                WriteTypeReference(implement, writer);
                writer.WriteLine();
            }

            if (hasBaseClass || implements.Count != 0)
            {
                writer.WriteString("    ");
            }
            else
            {
                writer.WriteString(" ");
            }

            writer.WriteKeyword("end");

        }
		private void WriteBaseClassAndImplementedInterfaces (XPathNavigator reflection, SyntaxWriter writer) {

			XPathNavigator baseClass = reflection.SelectSingleNode(apiBaseClassExpression);
			XPathNodeIterator implements = reflection.Select(apiImplementedInterfacesExpression);

			bool hasBaseClass = (baseClass != null) && !((bool) baseClass.Evaluate(typeIsObjectExpression));
			bool hasImplementedInterfaces = (implements.Count > 0);

			if (hasBaseClass || hasImplementedInterfaces) {

				writer.WriteString(" : ");
				if (hasBaseClass) {
					WriteTypeReference(baseClass, writer);
					if (hasImplementedInterfaces)
                    {
                        writer.WriteString(", ");
                        if (writer.Position > maxPosition)
                        {
                            writer.WriteLine();
                            writer.WriteString("\t");
                        }
                    }
				}

				while (implements.MoveNext()) {
					XPathNavigator implement = implements.Current;
					WriteTypeReference(implement, writer);
                    if (implements.CurrentPosition < implements.Count) {
                        writer.WriteString(", ");
                        if (writer.Position > maxPosition) {
                            writer.WriteLine();
                            writer.WriteString("\t");
                        }
                    }
				}

			}

		}
        // Attributes

        private void WriteAttribute(string reference, SyntaxWriter writer)
        {
            writer.WriteString("[<");
            writer.WriteReferenceLink(reference);
            writer.WriteString(">]");
            writer.WriteLine();
        }
		private void WriteGenericTemplateConstraints (XPathNavigator reflection, SyntaxWriter writer) {

			XPathNodeIterator templates = reflection.Select(apiTemplatesExpression);

            if (templates.Count == 0) return;

            writer.WriteLine();
			foreach (XPathNavigator template in templates) {

				bool constrained = (bool) template.Evaluate(templateIsConstrainedExpression);
				if (constrained) {
					string name = (string) template.Evaluate(templateNameExpression);
                                        
					writer.WriteKeyword("where");
                    writer.WriteString(" ");
					writer.WriteString(name);
					writer.WriteString(" : ");
				} else {
					continue;
				}

				bool value = (bool) template.Evaluate(templateIsValueTypeExpression);
				bool reference = (bool) template.Evaluate(templateIsReferenceTypeExpression);
				bool constructor = (bool) template.Evaluate(templateIsConstructableExpression);
				XPathNodeIterator constraints = template.Select(templateConstraintsExpression);

				// keep track of whether there is a previous constraint, so we know whether to put a comma
				bool previous = false;

				if (value) {
					if (previous) writer.WriteString(", ");
					writer.WriteKeyword("struct");
					previous = true;
				}
				
				if (reference) {
					if (previous) writer.WriteString(", ");
					writer.WriteKeyword("class");
					previous = true;
				}

				if (constructor) {
					if (previous) writer.WriteString(", ");
					writer.WriteKeyword("new");
					writer.WriteString("()");
					previous = true;
				}

				foreach (XPathNavigator constraint in constraints) {
					if (previous) writer.WriteString(", ");
					WriteTypeReference(constraint, writer);
					previous = true;
				}
                writer.WriteLine();
			}

		}
        private void WriteParameters(XPathNodeIterator parameters, XPathNavigator reflection, SyntaxWriter writer)
        {

            bool isExtension = (bool)reflection.Evaluate(apiIsExtensionMethod);
            writer.WriteLine();


            while (parameters.MoveNext())
            {
                XPathNavigator parameter = parameters.Current;

                string name = (string)parameter.Evaluate(parameterNameExpression);
                bool isOut = (bool)parameter.Evaluate(parameterIsOutExpression);
                bool isRef = (bool)parameter.Evaluate(parameterIsRefExpression);
                XPathNavigator type = parameter.SelectSingleNode(parameterTypeExpression);
                writer.WriteString("        ");
                writer.WriteParameter(name);
                writer.WriteString(":");
                WriteTypeReference(type, writer);
                if (isOut || isRef)
                {
                    writer.WriteString(" ");
                    writer.WriteKeyword("byref");
                }
                if (parameters.CurrentPosition != parameters.Count)
                {
                    writer.WriteString(" * ");
                    writer.WriteLine();
                }
                else
                {
                    writer.WriteString(" ");
                }
            }

        }
		// Parameters

		private void WriteMethodParameters (XPathNavigator reflection, SyntaxWriter writer) {

			XPathNodeIterator parameters = reflection.Select(apiParametersExpression);

			writer.WriteString("(");
			if (parameters.Count > 0) {
				writer.WriteLine();
				WriteParameters(parameters, reflection, writer);
			}
			writer.WriteString(")");

		}