Problems reported:

parser/error_recovery/issue_48380_3_comma:2:30: Expected an identifier, but got ','.
  v./* about to write foo()*/,
                             ^

parser/error_recovery/issue_48380_3_comma:2:30: Expected '(' after this.
  v./* about to write foo()*/,
                             ^

beginCompilationUnit(enum)
  beginMetadataStar(enum)
  endMetadataStar(0)
  beginUncategorizedTopLevelDeclaration(enum)
    handleIdentifier(E, enumDeclaration)
    beginEnum(enum)
      handleNoTypeVariables({)
      handleEnumNoWithClause()
      handleImplements(null, 0)
      handleEnumHeader(enum, {)
      beginMetadataStar(v)
      endMetadataStar(0)
      handleIdentifier(v, enumValueDeclaration)
      handleNoTypeNameInConstructorReference(.)
      beginConstructorReference(v)
        handleNoTypeArguments(.)
        handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ','., Try inserting an identifier before ','., {lexeme: ,}], ,, ,)
        handleIdentifier(, constructorReferenceContinuationAfterTypeArguments)
      endConstructorReference(v, ., ,, ConstructorReferenceContext.Const)
      handleRecoverableError(Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}], ,, ,)
      beginArguments(()
      endArguments(0, (, ))
      handleEnumElement({)
      beginMetadataStar(v)
      endMetadataStar(0)
      handleIdentifier(v, enumValueDeclaration)
      handleNoTypeNameInConstructorReference(.)
      beginConstructorReference(v)
        handleNoTypeArguments(.)
        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, )
