Problems reported:

parser/general/ambiguous_builder_01:5:1: A function declaration needs an explicit list of parameters.
x.y = 42;
^

parser/general/ambiguous_builder_01:5:2: Expected a function body, but got '.'.
x.y = 42;
 ^

parser/general/ambiguous_builder_01:5:2: Expected a declaration, but got '.'.
x.y = 42;
 ^

parser/general/ambiguous_builder_01:5:3: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
x.y = 42;
  ^

parser/general/ambiguous_builder_01:6:1: A function declaration needs an explicit list of parameters.
x.z = true;
^

parser/general/ambiguous_builder_01:6:2: Expected a function body, but got '.'.
x.z = true;
 ^

parser/general/ambiguous_builder_01:6:2: Expected a declaration, but got '.'.
x.z = true;
 ^

parser/general/ambiguous_builder_01:6:3: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
x.z = true;
  ^

beginCompilationUnit(x)
  beginMetadataStar(x)
  endMetadataStar(0)
  beginTopLevelMember(x)
    beginTopLevelMethod(, null)
      handleNoType()
      handleIdentifier(x, topLevelFunctionDeclaration)
      handleNoTypeVariables(.)
      handleRecoverableError(MissingFunctionParameters, x, x)
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      handleRecoverableError(Message[ExpectedFunctionBody, Expected a function body, but got '.'., null, {lexeme: .}], ., .)
      handleInvalidFunctionBody({)
    endTopLevelMethod(x, null, })
  endTopLevelDeclaration(.)
  beginMetadataStar(.)
  endMetadataStar(0)
  beginTopLevelMember(.)
    handleRecoverableError(Message[ExpectedDeclaration, Expected a declaration, but got '.'., null, {lexeme: .}], ., .)
    handleInvalidTopLevelDeclaration(.)
  endTopLevelDeclaration(y)
  beginMetadataStar(y)
  endMetadataStar(0)
  beginTopLevelMember(y)
    beginFields(.)
      handleRecoverableError(MissingConstFinalVarOrType, y, y)
      handleNoType(.)
      handleIdentifier(y, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        handleLiteralInt(42)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, null, 1, y, ;)
  endTopLevelDeclaration(x)
  beginMetadataStar(x)
  endMetadataStar(0)
  beginTopLevelMember(x)
    beginTopLevelMethod(;, null)
      handleNoType(;)
      handleIdentifier(x, topLevelFunctionDeclaration)
      handleNoTypeVariables(.)
      handleRecoverableError(MissingFunctionParameters, x, x)
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      handleRecoverableError(Message[ExpectedFunctionBody, Expected a function body, but got '.'., null, {lexeme: .}], ., .)
      handleInvalidFunctionBody({)
    endTopLevelMethod(x, null, })
  endTopLevelDeclaration(.)
  beginMetadataStar(.)
  endMetadataStar(0)
  beginTopLevelMember(.)
    handleRecoverableError(Message[ExpectedDeclaration, Expected a declaration, but got '.'., null, {lexeme: .}], ., .)
    handleInvalidTopLevelDeclaration(.)
  endTopLevelDeclaration(z)
  beginMetadataStar(z)
  endMetadataStar(0)
  beginTopLevelMember(z)
    beginFields(.)
      handleRecoverableError(MissingConstFinalVarOrType, z, z)
      handleNoType(.)
      handleIdentifier(z, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        handleLiteralBool(true)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, null, 1, z, ;)
  endTopLevelDeclaration(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(;, null)
      handleVoidKeyword(void)
      handleIdentifier(foo, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginIfStatement(if)
          handleIdentifier(x, expression)
          handleNoTypeArguments(!=)
          handleNoArguments(!=)
          handleSend(x, !=)
          beginBinaryExpression(!=)
            handleLiteralNull(null)
          endBinaryExpression(!=)
          handleParenthesizedCondition(()
          beginThenStatement({)
            beginBlock({, BlockKind(statement))
            endBlock(0, {, }, BlockKind(statement))
          endThenStatement(})
        endIfStatement(if, null)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration()
endCompilationUnit(7, )
