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, {token: .}], ., .)
      handleInvalidFunctionBody({)
    endTopLevelMethod(x, null, })
  endTopLevelDeclaration(.)
  beginMetadataStar(.)
  endMetadataStar(0)
  beginTopLevelMember(.)
    handleRecoverableError(Message[ExpectedDeclaration, Expected a declaration, but got '.'., null, {token: .}], ., .)
    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, {token: .}], ., .)
      handleInvalidFunctionBody({)
    endTopLevelMethod(x, null, })
  endTopLevelDeclaration(.)
  beginMetadataStar(.)
  endMetadataStar(0)
  beginTopLevelMember(.)
    handleRecoverableError(Message[ExpectedDeclaration, Expected a declaration, but got '.'., null, {token: .}], ., .)
    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, )
