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(v1)
      endMetadataStar(0)
      handleIdentifier(v1, enumValueDeclaration)
      handleNoTypeNameInConstructorReference(<)
      beginConstructorReference(v1)
        beginTypeArguments(<)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(>)
          handleType(int, null)
        endTypeArguments(1, <, >)
        handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
      endConstructorReference(v1, ., (, ConstructorReferenceContext.Const)
      beginArguments(()
      endArguments(0, (, ))
      handleEnumElement({)
      beginMetadataStar(v2)
      endMetadataStar(0)
      handleIdentifier(v2, enumValueDeclaration)
      handleNoTypeNameInConstructorReference(<)
      beginConstructorReference(v2)
        beginTypeArguments(<)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(>)
          handleType(int, null)
        endTypeArguments(1, <, >)
        handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
      endConstructorReference(v2, ., (, 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, )
