Problems reported:

parser/error_recovery/issue_000032:7:1: Expected a type, but got '}'.
}
^

parser/error_recovery/issue_000032:7:1: Expected an identifier, but got '}'.
}
^

parser/error_recovery/issue_000032:7:1: Expected ';' after this.
}
^

parser/error_recovery/issue_000032:11:1: Expected an identifier, but got '}'.
}
^

parser/error_recovery/issue_000032:11:1: Expected ';' after this.
}
^

beginCompilationUnit(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrNamedMixinApplicationPrelude(class)
    handleIdentifier(C, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, C)
      handleNoType(C)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinBody(DeclarationKind.Class, {)
        beginMetadataStar(C)
        endMetadataStar(0)
        beginMember()
          beginFields({)
            handleIdentifier(C, typeReference)
            beginTypeArguments(<)
              handleRecoverableError(Message[ExpectedType, Expected a type, but got '}'., null, {lexeme: }}], }, })
              handleIdentifier(, typeReference)
              handleNoTypeArguments(})
              handleType(, null)
            endTypeArguments(1, <, >)
            handleType(C, null)
            handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got '}'., Try inserting an identifier before '}'., {lexeme: }}], }, })
            handleIdentifier(, fieldDeclaration)
            handleNoFieldInitializer(})
            handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], }, })
          endClassFields(null, null, null, null, null, null, 1, C, ;)
        endMember()
      endClassOrMixinBody(DeclarationKind.Class, 1, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(main)
  beginMetadataStar(main)
  endMetadataStar(0)
  beginTopLevelMember(main)
    beginTopLevelMethod(}, null)
      handleNoType(})
      handleIdentifier(main, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        handleIdentifier(C, expression)
        handleNoTypeArguments(<)
        handleNoArguments(<)
        handleSend(C, <)
        beginBinaryExpression(<)
          handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got '}'., Try inserting an identifier before '}'., {lexeme: }}], }, })
          handleIdentifier(, expression)
          handleNoTypeArguments(})
          handleNoArguments(})
          handleSend(, })
        endBinaryExpression(<)
        handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], }, })
        handleExpressionStatement(;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(main, null, })
  endTopLevelDeclaration()
endCompilationUnit(2, )
