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(DeclarationKind.TopLevel, null, null, null, null, null, null, .)
      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(DeclarationKind.TopLevel, null, null, null, null, null, null, .)
      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, )
