beginCompilationUnit(enum)
  beginMetadataStar(enum)
  endMetadataStar(0)
  beginUncategorizedTopLevelDeclaration(enum)
    handleIdentifier(E, enumDeclaration)
    beginEnum(enum)
      beginTypeVariables(<)
        beginMetadataStar(F)
        endMetadataStar(0)
        handleIdentifier(F, typeVariableDeclaration)
        beginTypeVariable(F)
          handleTypeVariablesDefined(F, 1)
          handleNoType(F)
        endTypeVariable(>, 0, null, null)
      endTypeVariables(<, >)
      handleEnumNoWithClause()
      handleImplements(null, 0)
      handleEnumHeader(enum, {)
      beginMetadataStar(v)
      endMetadataStar(0)
      handleIdentifier(v, enumValueDeclaration)
      handleNoTypeNameInConstructorReference(<)
      beginConstructorReference(v)
        beginTypeArguments(<)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(>)
          handleType(int, null)
        endTypeArguments(1, <, >)
        handleNoConstructorReferenceContinuationAfterTypeArguments(()
      endConstructorReference(v, null, (, ConstructorReferenceContext.Const)
      beginArguments(()
      endArguments(0, (, ))
      handleEnumElement({)
      beginMetadataStar(v)
      endMetadataStar(0)
      handleIdentifier(v, enumValueDeclaration)
      handleNoTypeNameInConstructorReference(<)
      beginConstructorReference(v)
        beginTypeArguments(<)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(>)
          handleType(int, null)
        endTypeArguments(1, <, >)
        handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
      endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
      beginArguments(()
      endArguments(0, (, ))
      handleEnumElement(,)
      handleEnumElements(;, 2)
      beginMetadataStar(const)
      endMetadataStar(0)
      beginMember()
        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
          handleNoType(const)
          handleIdentifier(E, methodDeclaration)
          handleNoTypeVariables(()
          beginFormalParameters((, MemberKind.NonStaticMethod)
          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
          handleNoInitializers()
          handleAsyncModifier(null, null)
          handleEmptyFunctionBody(;)
        endEnumConstructor(null, const, (, null, ;)
      endMember()
      beginMetadataStar(const)
      endMetadataStar(0)
      beginMember()
        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
          handleNoType(const)
          handleIdentifier(E, methodDeclaration)
          handleIdentifier(foo, methodDeclarationContinuation)
          handleQualified(.)
          handleNoTypeVariables(()
          beginFormalParameters((, MemberKind.NonStaticMethod)
          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
          handleNoInitializers()
          handleAsyncModifier(null, null)
          handleEmptyFunctionBody(;)
        endEnumConstructor(null, const, (, null, ;)
      endMember()
    endEnum(enum, {, 2)
  endTopLevelDeclaration()
endCompilationUnit(1, )
