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); }
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(); }
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(")"); }
/// <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); }
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"); } } } }
/// <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); }
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(); } } }
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); } } }
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(); } }
// Visibility private void WriteProcedureVisibility(XPathNavigator reflection, SyntaxWriter writer) { string typeSubgroup = (string)reflection.Evaluate(apiContainingTypeSubgroupExpression); if (typeSubgroup != "interface") { WriteVisibility(reflection, writer); writer.WriteString(":"); writer.WriteLine(); } }
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(); }
// 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(); } }
/// <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(");"); }
/// <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("');"); } }
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(); } }
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(")"); }