<?xml version="1.0" encoding="utf-8" ?>

<Tree Root="SyntaxNode">
  <PredefinedNode Name="RazorSyntaxNode" Base="SyntaxNode" />
  <PredefinedNode Name="SyntaxToken" Base="RazorSyntaxNode" />
  
  <!-- Common -->
  <AbstractNode Name="RazorBlockSyntax" Base="RazorSyntaxNode">
    <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" />
  </AbstractNode>
  <Node Name="RazorDocumentSyntax" Base="RazorSyntaxNode">
    <Kind Name="RazorDocument" />
    <Field Name="Document" Type="RazorBlockSyntax" />
  </Node>
  <Node Name="RazorCommentBlockSyntax" Base="RazorSyntaxNode">
    <Kind Name="RazorComment" />
    <Field Name="StartCommentTransition" Type="SyntaxToken">
      <Kind Name="RazorCommentTransition" />
    </Field>
    <Field Name="StartCommentStar" Type="SyntaxToken">
      <Kind Name="RazorCommentStar" />
    </Field>
    <Field Name="Comment" Type="SyntaxToken">
      <Kind Name="RazorCommentLiteral" />
    </Field>
    <Field Name="EndCommentStar" Type="SyntaxToken">
      <Kind Name="RazorCommentStar" />
    </Field>
    <Field Name="EndCommentTransition" Type="SyntaxToken">
      <Kind Name="RazorCommentTransition" />
    </Field>
  </Node>
  <Node Name="RazorMetaCodeSyntax" Base="RazorSyntaxNode">
    <Kind Name="RazorMetaCode" />
    <Field Name="MetaCode" Type="SyntaxList&lt;SyntaxToken&gt;" />
  </Node>
  <Node Name="GenericBlockSyntax" Base="RazorBlockSyntax">
    <Kind Name="GenericBlock" />
    <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  </Node>
  <Node Name="UnclassifiedTextLiteralSyntax" Base="RazorSyntaxNode">
    <Kind Name="UnclassifiedTextLiteral" />
    <Field Name="LiteralTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  </Node>

  <!-- Markup -->
  <AbstractNode Name="MarkupSyntaxNode" Base="RazorSyntaxNode" />
  <Node Name="MarkupBlockSyntax" Base="RazorBlockSyntax">
    <Kind Name="MarkupBlock" />
    <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  </Node>
  <Node Name="MarkupTransitionSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupTransition" />
    <Field Name="TransitionTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  </Node>
  <Node Name="MarkupTextLiteralSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupTextLiteral" />
    <Field Name="LiteralTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  </Node>
  <Node Name="MarkupEphemeralTextLiteralSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupEphemeralTextLiteral" />
    <Field Name="LiteralTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  </Node>
  <Node Name="MarkupCommentBlockSyntax" Base="RazorBlockSyntax">
    <Kind Name="MarkupCommentBlock" />
    <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  </Node>
  <Node Name="MarkupMinimizedAttributeBlockSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupMinimizedAttributeBlock" />
    <Field Name="NamePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="Name" Type="MarkupTextLiteralSyntax" />
  </Node>
  <Node Name="MarkupAttributeBlockSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupAttributeBlock" />
    <Field Name="NamePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="Name" Type="MarkupTextLiteralSyntax" />
    <Field Name="NameSuffix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="EqualsToken" Type="SyntaxToken">
      <Kind Name="Equals" />
    </Field>
    <Field Name="ValuePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="Value" Type="RazorBlockSyntax" Optional="true" />
    <Field Name="ValueSuffix" Type="MarkupTextLiteralSyntax" Optional="true" />
  </Node>
  <Node Name="MarkupMiscAttributeContentSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupMiscAttributeContent" />
    <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" />
  </Node>
  <Node Name="MarkupLiteralAttributeValueSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupLiteralAttributeValue" />
    <Field Name="Prefix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="Value" Type="MarkupTextLiteralSyntax" Optional="true" />
  </Node>
  <Node Name="MarkupDynamicAttributeValueSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupDynamicAttributeValue" />
    <Field Name="Prefix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="Value" Type="RazorBlockSyntax" />
  </Node>
  <Node Name="MarkupElementSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupElement" />
    <Field Name="StartTag" Type="MarkupStartTagSyntax" Optional="true" />
    <Field Name="Body" Type="SyntaxList&lt;RazorSyntaxNode&gt;" />
    <Field Name="EndTag" Type="MarkupEndTagSyntax" Optional="true" />
  </Node>
  <Node Name="MarkupStartTagSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupStartTag" />
    <Field Name="OpenAngle" Type="SyntaxToken">
      <Kind Name="OpenAngle" />
    </Field>
    <Field Name="Bang" Type="SyntaxToken" Optional="true">
      <Kind Name="Bang" />
    </Field>
    <Field Name="Name" Type="SyntaxToken">
      <Kind Name="Text" />
    </Field>
    <Field Name="Attributes" Type="SyntaxList&lt;RazorSyntaxNode&gt;" />
    <Field Name="ForwardSlash" Type="SyntaxToken" Optional="true">
      <Kind Name="ForwardSlash" />
    </Field>
    <Field Name="CloseAngle" Type="SyntaxToken">
      <Kind Name="CloseAngle" />
    </Field>
  </Node>
  <Node Name="MarkupEndTagSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupEndTag" />
    <Field Name="OpenAngle" Type="SyntaxToken">
      <Kind Name="OpenAngle" />
    </Field>
    <Field Name="ForwardSlash" Type="SyntaxToken">
      <Kind Name="ForwardSlash" />
    </Field>
    <Field Name="Bang" Type="SyntaxToken" Optional="true">
      <Kind Name="Bang" />
    </Field>
    <Field Name="Name" Type="SyntaxToken">
      <Kind Name="Text" />
    </Field>
    <Field Name="MiscAttributeContent" Type="MarkupMiscAttributeContentSyntax" Optional="true" />
    <Field Name="CloseAngle" Type="SyntaxToken">
      <Kind Name="CloseAngle" />
    </Field>
  </Node>
  <Node Name="MarkupTagHelperElementSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupTagHelperElement" />
    <Field Name="StartTag" Type="MarkupTagHelperStartTagSyntax" />
    <Field Name="Body" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Optional="true" />
    <Field Name="EndTag" Type="MarkupTagHelperEndTagSyntax" Optional="true" />
  </Node>
  <Node Name="MarkupTagHelperStartTagSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupTagHelperStartTag" />
    <Field Name="OpenAngle" Type="SyntaxToken">
      <Kind Name="OpenAngle" />
    </Field>
    <Field Name="Bang" Type="SyntaxToken" Optional="true">
      <Kind Name="Bang" />
    </Field>
    <Field Name="Name" Type="SyntaxToken">
      <Kind Name="Text" />
    </Field>
    <Field Name="Attributes" Type="SyntaxList&lt;RazorSyntaxNode&gt;" />
    <Field Name="ForwardSlash" Type="SyntaxToken" Optional="true">
      <Kind Name="ForwardSlash" />
    </Field>
    <Field Name="CloseAngle" Type="SyntaxToken">
      <Kind Name="CloseAngle" />
    </Field>
  </Node>
  <Node Name="MarkupTagHelperEndTagSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupTagHelperEndTag" />
    <Field Name="OpenAngle" Type="SyntaxToken">
      <Kind Name="OpenAngle" />
    </Field>
    <Field Name="ForwardSlash" Type="SyntaxToken">
      <Kind Name="ForwardSlash" />
    </Field>
    <Field Name="Bang" Type="SyntaxToken" Optional="true">
      <Kind Name="Bang" />
    </Field>
    <Field Name="Name" Type="SyntaxToken">
      <Kind Name="Text" />
    </Field>
    <Field Name="MiscAttributeContent" Type="MarkupMiscAttributeContentSyntax" Optional="true" />
    <Field Name="CloseAngle" Type="SyntaxToken">
      <Kind Name="CloseAngle" />
    </Field>
  </Node>
  <Node Name="MarkupTagHelperAttributeSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupTagHelperAttribute" />
    <Field Name="NamePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="Name" Type="MarkupTextLiteralSyntax" />
    <Field Name="NameSuffix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="EqualsToken" Type="SyntaxToken">
      <Kind Name="Equals" />
    </Field>
    <Field Name="ValuePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="Value" Type="MarkupTagHelperAttributeValueSyntax" />
    <Field Name="ValueSuffix" Type="MarkupTextLiteralSyntax" Optional="true" />
  </Node>
  <Node Name="MarkupMinimizedTagHelperAttributeSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupMinimizedTagHelperAttribute" />
    <Field Name="NamePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="Name" Type="MarkupTextLiteralSyntax" />
  </Node>
  <Node Name="MarkupTagHelperAttributeValueSyntax" Base="RazorBlockSyntax">
    <Kind Name="MarkupTagHelperAttributeValue" />
    <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  </Node>
  <Node Name="MarkupTagHelperDirectiveAttributeSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupTagHelperDirectiveAttribute" />
    <Field Name="NamePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="Transition" Type="RazorMetaCodeSyntax" />
    <Field Name="Name" Type="MarkupTextLiteralSyntax" />
    <Field Name="Colon" Type="RazorMetaCodeSyntax" Optional="true" />
    <Field Name="ParameterName" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="NameSuffix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="EqualsToken" Type="SyntaxToken">
      <Kind Name="Equals" />
    </Field>
    <Field Name="ValuePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="Value" Type="MarkupTagHelperAttributeValueSyntax" />
    <Field Name="ValueSuffix" Type="MarkupTextLiteralSyntax" Optional="true" />
  </Node>
  <Node Name="MarkupMinimizedTagHelperDirectiveAttributeSyntax" Base="MarkupSyntaxNode">
    <Kind Name="MarkupMinimizedTagHelperDirectiveAttribute" />
    <Field Name="NamePrefix" Type="MarkupTextLiteralSyntax" Optional="true" />
    <Field Name="Transition" Type="RazorMetaCodeSyntax" />
    <Field Name="Name" Type="MarkupTextLiteralSyntax" />
    <Field Name="Colon" Type="RazorMetaCodeSyntax" Optional="true" />
    <Field Name="ParameterName" Type="MarkupTextLiteralSyntax" Optional="true" />
  </Node>
  
  <!-- CSharp -->
  <AbstractNode Name="CSharpSyntaxNode" Base="RazorSyntaxNode" />
  <Node Name="CSharpCodeBlockSyntax" Base="RazorBlockSyntax">
    <Kind Name="CSharpCodeBlock" />
    <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  </Node>
  <Node Name="CSharpTransitionSyntax" Base="CSharpSyntaxNode">
    <Kind Name="CSharpTransition" />
    <Field Name="Transition" Type="SyntaxToken">
      <Kind Name="Transition" />
    </Field>
  </Node>
  <Node Name="CSharpStatementLiteralSyntax" Base="CSharpSyntaxNode">
    <Kind Name="CSharpStatementLiteral" />
    <Field Name="LiteralTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  </Node>
  <Node Name="CSharpExpressionLiteralSyntax" Base="CSharpSyntaxNode">
    <Kind Name="CSharpExpressionLiteral" />
    <Field Name="LiteralTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  </Node>
  <Node Name="CSharpEphemeralTextLiteralSyntax" Base="CSharpSyntaxNode">
    <Kind Name="CSharpEphemeralTextLiteral" />
    <Field Name="LiteralTokens" Type="SyntaxList&lt;SyntaxToken&gt;" />
  </Node>
  <Node Name="CSharpTemplateBlockSyntax" Base="RazorBlockSyntax">
    <Kind Name="CSharpTemplateBlock" />
    <Field Name="Children" Type="SyntaxList&lt;RazorSyntaxNode&gt;" Override="true" />
  </Node>
  <AbstractNode Name="CSharpRazorBlockSyntax" Base="CSharpSyntaxNode">
    <Field Name="Transition" Type="CSharpTransitionSyntax" />
    <Field Name="Body" Type="CSharpSyntaxNode" />
  </AbstractNode>
  <Node Name="CSharpStatementSyntax" Base="CSharpRazorBlockSyntax">
    <Kind Name="CSharpStatement" />
    <Field Name="Transition" Type="CSharpTransitionSyntax" Override="true">
      <Kind Name="CSharpTransition" />
    </Field>
    <Field Name="Body" Type="CSharpSyntaxNode" Override="true">
      <Kind Name="CSharpStatementBody" />
    </Field>
  </Node>
  <Node Name="CSharpStatementBodySyntax" Base="CSharpSyntaxNode">
    <Kind Name="CSharpStatementBody" />
    <Field Name="OpenBrace" Type="RazorMetaCodeSyntax" />
    <Field Name="CSharpCode" Type="CSharpCodeBlockSyntax" />
    <Field Name="CloseBrace" Type="RazorMetaCodeSyntax" />
  </Node>
  <Node Name="CSharpExplicitExpressionSyntax" Base="CSharpRazorBlockSyntax">
    <Kind Name="CSharpExplicitExpression" />
    <Field Name="Transition" Type="CSharpTransitionSyntax" Override="true">
      <Kind Name="CSharpTransition" />
    </Field>
    <Field Name="Body" Type="CSharpSyntaxNode" Override="true">
      <Kind Name="CSharpExplicitExpressionBody" />
    </Field>
  </Node>
  <Node Name="CSharpExplicitExpressionBodySyntax" Base="CSharpSyntaxNode">
    <Kind Name="CSharpExplicitExpressionBody" />
    <Field Name="OpenParen" Type="RazorMetaCodeSyntax" />
    <Field Name="CSharpCode" Type="CSharpCodeBlockSyntax" />
    <Field Name="CloseParen" Type="RazorMetaCodeSyntax" />
  </Node>
  <Node Name="CSharpImplicitExpressionSyntax" Base="CSharpRazorBlockSyntax">
    <Kind Name="CSharpImplicitExpression" />
    <Field Name="Transition" Type="CSharpTransitionSyntax" Override="true">
      <Kind Name="CSharpTransition" />
    </Field>
    <Field Name="Body" Type="CSharpSyntaxNode" Override="true">
      <Kind Name="CSharpImplicitExpressionBody" />
    </Field>
  </Node>
  <Node Name="CSharpImplicitExpressionBodySyntax" Base="CSharpSyntaxNode">
    <Kind Name="CSharpImplicitExpressionBody" />
    <Field Name="CSharpCode" Type="CSharpCodeBlockSyntax" />
  </Node>
  <Node Name="RazorDirectiveSyntax" Base="CSharpRazorBlockSyntax">
    <Kind Name="RazorDirective" />
    <Field Name="Transition" Type="CSharpTransitionSyntax" Override="true">
      <Kind Name="CSharpTransition" />
    </Field>
    <Field Name="Body" Type="CSharpSyntaxNode" Override="true">
      <Kind Name="RazorDirectiveBody" />
    </Field>
  </Node>
  <Node Name="RazorDirectiveBodySyntax" Base="CSharpSyntaxNode">
    <Kind Name="RazorDirectiveBody" />
    <Field Name="Keyword" Type="RazorSyntaxNode" />
    <Field Name="CSharpCode" Type="CSharpCodeBlockSyntax" Optional="true" />
  </Node>
</Tree>