summaryrefslogtreecommitdiffstats
path: root/tools/Sandcastle/Source/BuildAssembler/SyntaxComponents/SyntaxGenerators.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tools/Sandcastle/Source/BuildAssembler/SyntaxComponents/SyntaxGenerators.cs')
-rw-r--r--tools/Sandcastle/Source/BuildAssembler/SyntaxComponents/SyntaxGenerators.cs426
1 files changed, 426 insertions, 0 deletions
diff --git a/tools/Sandcastle/Source/BuildAssembler/SyntaxComponents/SyntaxGenerators.cs b/tools/Sandcastle/Source/BuildAssembler/SyntaxComponents/SyntaxGenerators.cs
new file mode 100644
index 0000000..dca7514
--- /dev/null
+++ b/tools/Sandcastle/Source/BuildAssembler/SyntaxComponents/SyntaxGenerators.cs
@@ -0,0 +1,426 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+using System;
+using System.Collections.Generic;
+using System.Xml.XPath;
+
+namespace Microsoft.Ddue.Tools {
+
+ public abstract class SyntaxGeneratorTemplate : SyntaxGenerator {
+
+ protected SyntaxGeneratorTemplate (XPathNavigator configuration) : base(configuration) {
+
+ string nameValue = configuration.GetAttribute("name", String.Empty);
+ language = nameValue;
+
+ }
+
+ // A maximum width setting
+
+ protected static int maxPosition = 60;
+
+ // The language itentifier
+
+
+ protected string language;
+
+ public virtual string Language {
+ get {
+ return (language);
+ }
+ }
+
+ // Where data is stored
+
+ // api data
+ protected static XPathExpression apiNameExpression = XPathExpression.Compile("string(apidata/@name)");
+ protected static XPathExpression apiGroupExpression = XPathExpression.Compile("string(apidata/@group)");
+ protected static XPathExpression apiSubgroupExpression = XPathExpression.Compile("string(apidata/@subgroup)");
+ protected static XPathExpression apiSubsubgroupExpression = XPathExpression.Compile("string(apidata/@subsubgroup)");
+
+ // support testing
+ protected static XPathExpression apiIsUnsafeExpression = XPathExpression.Compile("boolean(parameters/parameter//pointerTo or returns//pointerTo)");
+ protected static XPathExpression apiIsGenericExpression = XPathExpression.Compile("boolean(templates/template)");
+ protected static XPathExpression apiIsExtensionMethod = XPathExpression.Compile("boolean(attributes/attribute/type[@api='T:System.Runtime.CompilerServices.ExtensionAttribute'])");
+
+ // visibility attribute
+ protected static XPathExpression apiVisibilityExpression = XPathExpression.Compile("string((typedata|memberdata)/@visibility)");
+ protected static XPathExpression apiIsFamilyMemberExpression = XPathExpression.Compile("boolean(contains(memberdata/@visibility,'family'))");
+
+ // type data
+ protected static XPathExpression apiVisibilityOfTypeExpression = XPathExpression.Compile("string(typedata/@visibility)");
+ protected static XPathExpression apiIsAbstractTypeExpression = XPathExpression.Compile("boolean(typedata[@abstract='true'])");
+ protected static XPathExpression apiIsSealedTypeExpression = XPathExpression.Compile("boolean(typedata[@sealed='true'])");
+ protected static XPathExpression apiIsSerializableTypeExpression = XPathExpression.Compile("boolean(typedata[@serializable='true'])");
+
+ // class data
+ protected static XPathExpression apiBaseClassExpression = XPathExpression.Compile("family/ancestors/*[1]");
+ protected static XPathExpression apiAncestorsExpression = XPathExpression.Compile("family/ancestors/*");
+
+ // enumeration data
+
+ // various subheadings
+ protected static XPathExpression apiAttributesExpression = XPathExpression.Compile("attributes/attribute");
+ protected static XPathExpression apiTemplatesExpression = XPathExpression.Compile("templates/template");
+ protected static XPathExpression apiImplementedInterfacesExpression = XPathExpression.Compile("implements/type");
+ protected static XPathExpression apiParametersExpression = XPathExpression.Compile("parameters/parameter");
+ protected static XPathExpression apiReturnTypeExpression = XPathExpression.Compile("returns/*[1]");
+
+ // member data
+ protected static XPathExpression apiVisibilityOfMemberExpression = XPathExpression.Compile("string(memberdata/@visibility)");
+ protected static XPathExpression apiIsStaticExpression = XPathExpression.Compile("boolean(memberdata[@static='true'])");
+ protected static XPathExpression apiIsSpecialExpression = XPathExpression.Compile("boolean(memberdata[@special='true'])");
+ protected static XPathExpression apiIsDefaultMemberExpression = XPathExpression.Compile("boolean(memberdata[@default='true'])");
+
+ // field data
+ protected static XPathExpression apiIsLiteralFieldExpression = XPathExpression.Compile("boolean(fielddata[@literal='true'])");
+ protected static XPathExpression apiIsInitOnlyFieldExpression = XPathExpression.Compile("boolean(fielddata[@initonly='true'])");
+ protected static XPathExpression apiIsVolatileFieldExpression = XPathExpression.Compile("boolean(fielddata[@volatile='true'])");
+ protected static XPathExpression apiIsSerializedFieldExpression = XPathExpression.Compile("boolean(fielddata[@serialized='true'])");
+
+ // procedure data
+ protected static XPathExpression apiIsAbstractProcedureExpression = XPathExpression.Compile("boolean(proceduredata[@abstract='true'])");
+ protected static XPathExpression apiIsVirtualExpression = XPathExpression.Compile("boolean(proceduredata[@virtual='true'])");
+ protected static XPathExpression apiIsFinalExpression = XPathExpression.Compile("boolean(proceduredata[@final='true'])");
+ protected static XPathExpression apiOverridesMemberExpression = XPathExpression.Compile("string(proceduredata/@overrides/member)");
+ protected static XPathExpression apiIsExplicitImplementationExpression = XPathExpression.Compile("boolean(memberdata/@visibility='private' and proceduredata/@virtual='true' and boolean(implements/member))");
+ protected static XPathExpression apiImplementedMembersExpression = XPathExpression.Compile("implements/member");
+ protected static XPathExpression apiIsOverrideExpression = XPathExpression.Compile("boolean(overrides/member)");
+
+ // property data
+ protected static XPathExpression apiIsReadPropertyExpression = XPathExpression.Compile("boolean(propertydata/@get='true')");
+ protected static XPathExpression apiIsWritePropertyExpression = XPathExpression.Compile("boolean(propertydata/@set='true')");
+ protected static XPathExpression apiGetVisibilityExpression = XPathExpression.Compile("string(propertydata/@get-visibility)");
+ protected static XPathExpression apiSetVisibilityExpression = XPathExpression.Compile("string(propertydata/@set-visibility)");
+
+ // event data
+ protected static XPathExpression apiHandlerOfEventExpression = XPathExpression.Compile("eventhandler/*[1]");
+
+ // parameter data
+ //protected static XPathExpression params_expression = XPathExpression.Compile("boolean(@params='true')");
+ protected static XPathExpression parameterNameExpression = XPathExpression.Compile("string(@name)");
+ protected static XPathExpression parameterTypeExpression = XPathExpression.Compile("*[1]");
+ protected static XPathExpression parameterIsInExpression = XPathExpression.Compile("boolean(@in='true')");
+ protected static XPathExpression parameterIsOutExpression = XPathExpression.Compile("boolean(@out='true')");
+ protected static XPathExpression parameterIsRefExpression = XPathExpression.Compile("boolean(referenceTo)");
+ protected static XPathExpression parameterIsParamArrayExpression = XPathExpression.Compile("boolean(@params='true')");
+
+ // container data
+ protected static XPathExpression apiContainingTypeExpression = XPathExpression.Compile("containers/type");
+ protected static XPathExpression apiContainingTypeNameExpression = XPathExpression.Compile("string(containers/type/apidata/@name)");
+ protected static XPathExpression apiContainingTypeSubgroupExpression = XPathExpression.Compile("string(containers/type/apidata/@subgroup)");
+ protected static XPathExpression apiContainingAssemblyExpression = XPathExpression.Compile("string(containers/library/@assembly)");
+ protected static XPathExpression apiContainingNamespaceIdExpression = XPathExpression.Compile("string(containers/namespace/@api)");
+ protected static XPathExpression apiContainingNamespaceNameExpression = XPathExpression.Compile("string(containers/namespace/apidata/@name)");
+ // protected static XPathExpression containing_type_templates_expression = XPathExpression.Compile("containers/container[@type]/templates");
+
+ // referenced type data
+ protected static XPathExpression typeExpression = XPathExpression.Compile("*[1]");
+ protected static XPathExpression typeIdExpression = XPathExpression.Compile("@api");
+ protected static XPathExpression typeModifiersExpression = XPathExpression.Compile("optionalModifier|requiredModifier|specialization");
+ protected static XPathExpression typeOuterTypeExpression = XPathExpression.Compile("type");
+ protected static XPathExpression typeIsObjectExpression = XPathExpression.Compile("boolean(local-name()='type' and @api='T:System.Object')");
+ protected static XPathExpression valueExpression = XPathExpression.Compile("*[2]");
+ protected static XPathExpression nameExpression = XPathExpression.Compile("string(@name)");
+ protected static XPathExpression specializationArgumentsExpression = XPathExpression.Compile("*");
+
+ // referenced member data
+ protected static XPathExpression memberDeclaringTypeExpression = XPathExpression.Compile("*[1]");
+
+ // attribute data
+ protected static XPathExpression attributeTypeExpression = XPathExpression.Compile("*[1]");
+ protected static XPathExpression attributeArgumentsExpression = XPathExpression.Compile("argument");
+ protected static XPathExpression attributeAssignmentsExpression = XPathExpression.Compile("assignment");
+ protected static XPathExpression assignmentNameExpression = XPathExpression.Compile("string(@name)");
+
+ // template data
+ protected static XPathExpression templateNameExpression = XPathExpression.Compile("string(@name)");
+ protected static XPathExpression templateIsConstrainedExpression = XPathExpression.Compile("boolean(constrained)");
+ protected static XPathExpression templateIsValueTypeExpression = XPathExpression.Compile("boolean(constrained/@value='true')");
+ protected static XPathExpression templateIsReferenceTypeExpression = XPathExpression.Compile("boolean(constrained/@ref='true')");
+ protected static XPathExpression templateIsConstructableExpression = XPathExpression.Compile("boolean(constrained/@ctor='true')");
+ protected static XPathExpression templateConstraintsExpression = XPathExpression.Compile("constrained/type | constrained/implements/type");
+
+ protected static XPathExpression attachedEventAdderExpression = XPathExpression.Compile("string(attachedeventdata/adder/member/@api)");
+ protected static XPathExpression attachedEventRemoverExpression = XPathExpression.Compile("string(attachedeventdata/remover/member/@api)");
+
+ protected static XPathExpression attachedPropertyGetterExpression = XPathExpression.Compile("string(attachedpropertydata/getter/member/@api)");
+ protected static XPathExpression attachedPropertySetterExpression = XPathExpression.Compile("string(attachedpropertydata/setter/member/@api)");
+
+ // Methods to write syntax for different kinds of APIs
+
+ public override void WriteSyntax (XPathNavigator reflection, SyntaxWriter writer) {
+
+ writer.WriteStartBlock(Language);
+
+ string group = (string) reflection.Evaluate(apiGroupExpression);
+
+ switch (group) {
+ case "namespace":
+ WriteNamespaceSyntax(reflection, writer);
+ break;
+ case "type":
+ WriteTypeSyntax(reflection, writer);
+ break;
+ case "member":
+ WriteMemberSyntax(reflection, writer);
+ break;
+ }
+
+ writer.WriteEndBlock();
+
+ }
+
+ public virtual void WriteTypeSyntax (XPathNavigator reflection, SyntaxWriter writer) {
+
+ string subgroup = (string) reflection.Evaluate(apiSubgroupExpression);
+
+ switch (subgroup) {
+ case "class":
+ WriteClassSyntax(reflection, writer);
+ break;
+ case "structure":
+ WriteStructureSyntax(reflection, writer);
+ break;
+ case "interface":
+ WriteInterfaceSyntax(reflection, writer);
+ break;
+ case "delegate":
+ WriteDelegateSyntax(reflection, writer);
+ break;
+ case "enumeration":
+ WriteEnumerationSyntax(reflection, writer);
+ break;
+ }
+
+ }
+
+ public virtual void WriteMemberSyntax (XPathNavigator reflection, SyntaxWriter writer) {
+
+ string subgroup = (string) reflection.Evaluate(apiSubgroupExpression);
+ string subsubgroup = (string)reflection.Evaluate(apiSubsubgroupExpression);
+
+ switch (subgroup) {
+ case "constructor":
+ WriteConstructorSyntax(reflection, writer);
+ break;
+ case "method":
+ WriteMethodSyntax(reflection, writer);
+ break;
+ case "property":
+ if (subsubgroup == "attachedProperty")
+ WriteAttachedPropertySyntax(reflection, writer);
+ else
+ WritePropertySyntax(reflection, writer);
+ break;
+ case "event":
+ if (subsubgroup == "attachedEvent")
+ WriteAttachedEventSyntax(reflection, writer);
+ else
+ WriteEventSyntax(reflection, writer);
+ break;
+ case "field":
+ WriteFieldSyntax(reflection, writer);
+ break;
+ }
+
+ }
+
+ public abstract void WriteNamespaceSyntax (XPathNavigator reflection, SyntaxWriter writer);
+
+ public abstract void WriteClassSyntax (XPathNavigator reflection, SyntaxWriter writer);
+
+ public abstract void WriteStructureSyntax (XPathNavigator reflection, SyntaxWriter writer);
+
+ public abstract void WriteInterfaceSyntax (XPathNavigator reflection, SyntaxWriter writer);
+
+ public abstract void WriteDelegateSyntax (XPathNavigator reflection, SyntaxWriter writer);
+
+ public abstract void WriteEnumerationSyntax (XPathNavigator reflection, SyntaxWriter writer);
+
+ public abstract void WriteConstructorSyntax (XPathNavigator reflection, SyntaxWriter writer);
+
+ public virtual void WriteMethodSyntax (XPathNavigator reflection, SyntaxWriter writer) {
+ bool isSpecialName = (bool)reflection.Evaluate(apiIsSpecialExpression);
+ string name = (string)reflection.Evaluate(apiNameExpression);
+
+ if (isSpecialName) {
+ string subsubgroup = (string)reflection.Evaluate(apiSubsubgroupExpression);
+ if (subsubgroup == "operator") {
+ if ((name == "Implicit") || (name == "Explicit")) {
+ WriteCastSyntax(reflection, writer);
+ } else {
+ WriteOperatorSyntax(reflection, writer);
+ }
+ }
+ } else {
+ WriteNormalMethodSyntax(reflection, writer);
+ }
+ }
+
+ public abstract void WritePropertySyntax (XPathNavigator reflection, SyntaxWriter writer);
+
+ public abstract void WriteFieldSyntax (XPathNavigator reflection, SyntaxWriter writer);
+
+ public abstract void WriteEventSyntax (XPathNavigator reflection, SyntaxWriter writer);
+
+ public virtual void WriteNormalMethodSyntax (XPathNavigator reflection, SyntaxWriter writer) { }
+
+ public virtual void WriteOperatorSyntax (XPathNavigator reflection, SyntaxWriter writer) { }
+
+ public virtual void WriteCastSyntax (XPathNavigator reflection, SyntaxWriter writer) { }
+
+ public virtual void WriteAttachedPropertySyntax(XPathNavigator reflection, SyntaxWriter writer)
+ {
+ string getterId = (string)reflection.Evaluate(attachedPropertyGetterExpression);
+ string setterId = (string)reflection.Evaluate(attachedPropertySetterExpression);
+ if (!string.IsNullOrEmpty(getterId))
+ {
+ writer.WriteString("See ");
+ writer.WriteReferenceLink(getterId);
+ }
+ if (!string.IsNullOrEmpty(setterId))
+ {
+ if (!string.IsNullOrEmpty(getterId))
+ writer.WriteString(", ");
+ writer.WriteReferenceLink(setterId);
+ }
+ }
+
+ public virtual void WriteAttachedEventSyntax(XPathNavigator reflection, SyntaxWriter writer)
+ {
+ string adderId = (string)reflection.Evaluate(attachedEventAdderExpression);
+ string removerId = (string)reflection.Evaluate(attachedEventRemoverExpression);
+ if (!(string.IsNullOrEmpty(adderId) && string.IsNullOrEmpty(removerId)))
+ {
+ writer.WriteString("See ");
+ writer.WriteReferenceLink(adderId);
+ writer.WriteString(", ");
+ writer.WriteReferenceLink(removerId);
+ }
+ }
+
+ protected virtual bool IsUnsupportedUnsafe(XPathNavigator reflection, SyntaxWriter writer)
+ {
+ bool isUnsafe = (bool) reflection.Evaluate(apiIsUnsafeExpression);
+
+ if (isUnsafe) {
+ writer.WriteMessage("UnsupportedUnsafe_" + Language);
+ }
+
+ return(isUnsafe);
+ }
+
+ protected virtual bool IsUnsupportedGeneric (XPathNavigator reflection, SyntaxWriter writer) {
+
+ bool isGeneric = (bool) reflection.Evaluate(apiIsGenericExpression);
+
+ if (isGeneric) {
+ writer.WriteMessage("UnsupportedGeneric_" + Language);
+ }
+
+ return(isGeneric);
+
+ }
+
+ protected virtual bool IsUnsupportedExplicit (XPathNavigator reflection, SyntaxWriter writer) {
+
+ bool isExplicit = (bool) reflection.Evaluate(apiIsExplicitImplementationExpression);
+
+ if (isExplicit) {
+ writer.WriteMessage("UnsupportedExplicit_" + Language);
+ }
+
+ return(isExplicit);
+
+ }
+
+ }
+
+ public abstract class DeclarationSyntaxGeneratorTemplate : SyntaxGeneratorTemplate {
+
+ protected DeclarationSyntaxGeneratorTemplate (XPathNavigator configuration) : base(configuration) { }
+
+ // Methods to implement
+
+ protected abstract void WriteVisibility (XPathNavigator reflection, SyntaxWriter writer);
+
+ // Utility methods
+
+ protected static string[] SeperateTypes (string typelist) {
+ List<string> types = new List<string>();
+
+ int start = 0;
+ int specializationCount = 0;
+ for (int index=0; index<typelist.Length; index++) {
+ switch (typelist[index]) {
+ case '{':
+ specializationCount++;
+ break;
+ case '}':
+ specializationCount--;
+ break;
+ case ',':
+ if (specializationCount == 0) {
+ types.Add( "T:" + typelist.Substring(start, index-start) );
+ start = index + 1;
+ }
+ break;
+ }
+ }
+ types.Add( "T:" + typelist.Substring(start) );
+ return(types.ToArray());
+ }
+
+ protected static string GetTemplateParameterName (string reference, XPathNavigator reflection) {
+
+ string group = (string) reflection.Evaluate(apiGroupExpression);
+
+ XPathNavigator template = null;
+ if (reference.StartsWith("T:`")) {
+ if (reference[3]=='`') {
+
+ // a method template parameter
+
+ int position = Convert.ToInt32( reference.Substring(4) ) + 1;
+
+ if (group == "member") {
+ // we are in a method, so presumably it is one of that method's template parameters
+ template = reflection.SelectSingleNode( String.Format("templates/template[{0}]", position) );
+ }
+
+ } else {
+
+ // a type template parameter
+
+ int position = Convert.ToInt32( reference.Substring(3) ) + 1;
+
+ if (group == "type") {
+ // we are in a type, so look there for the parameter
+ template = reflection.SelectSingleNode( String.Format("templates/template[{0}]", position) );
+ }
+
+ if (template == null) {
+ // either we weren't in a type, or it didn't have the template
+ // so now look at the templates of the containing type
+ template = reflection.SelectSingleNode( String.Format("containers/container[@type]/templates/template[{0}]", position) );
+ }
+
+
+
+ }
+ }
+
+ if (template != null) {
+ return(template.GetAttribute("name", String.Empty));
+ } else {
+ Console.WriteLine("UNRESOLVED TEMPLATE PARAMETER NAME");
+ return("T");
+ }
+
+ }
+
+
+ }
+
+}