Problems reported:

parser/error_recovery/issue_42267:4:16: Expected an identifier, but got ']'.
  builder..foo[];
               ^

parser/error_recovery/issue_42267:5:39: Expected an identifier, but got ']'.
  FilterSet((builder) => builder..foo[]);
                                      ^

parser/error_recovery/issue_42267:6:17: Expected an identifier, but got ']'.
  builder..foo[ ];
                ^

parser/error_recovery/issue_42267:7:40: Expected an identifier, but got ']'.
  FilterSet((builder) => builder..foo[ ]);
                                       ^

beginCompilationUnit(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(, null)
      handleVoidKeyword(void)
      handleIdentifier(main, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        handleIdentifier(builder, expression)
        handleNoTypeArguments(..)
        handleNoArguments(..)
        handleSend(builder, ..)
        beginCascade(..)
          handleIdentifier(foo, expressionContinuation)
          handleNoTypeArguments([)
          handleNoArguments([)
          handleSend(foo, [)
          handleEndingBinaryExpression(..)
          handleIdentifier(bar, expression)
          handleNoTypeArguments(])
          handleNoArguments(])
          handleSend(bar, ])
          handleIndexedExpression(null, [, ])
        endCascade()
        handleExpressionStatement(;)
        handleIdentifier(FilterSet, expression)
        handleNoTypeArguments(()
        beginArguments(()
          handleNoTypeVariables(()
          beginFunctionExpression(()
            beginFormalParameters((, MemberKind.Local)
              beginMetadataStar(builder)
              endMetadataStar(0)
              beginFormalParameter(builder, MemberKind.Local, null, null, null)
                handleNoType(()
                handleIdentifier(builder, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
            endFormalParameters(1, (, ), MemberKind.Local)
            handleAsyncModifier(null, null)
            handleIdentifier(builder, expression)
            handleNoTypeArguments(..)
            handleNoArguments(..)
            handleSend(builder, ..)
            beginCascade(..)
              handleIdentifier(foo, expressionContinuation)
              handleNoTypeArguments([)
              handleNoArguments([)
              handleSend(foo, [)
              handleEndingBinaryExpression(..)
              handleIdentifier(bar, expression)
              handleNoTypeArguments(])
              handleNoArguments(])
              handleSend(bar, ])
              handleIndexedExpression(null, [, ])
            endCascade()
            handleExpressionFunctionBody(=>, null)
          endFunctionExpression((, ))
        endArguments(1, (, ))
        handleSend(FilterSet, ;)
        handleExpressionStatement(;)
        handleIdentifier(builder, expression)
        handleNoTypeArguments(..)
        handleNoArguments(..)
        handleSend(builder, ..)
        beginCascade(..)
          handleIdentifier(foo, expressionContinuation)
          handleNoTypeArguments([])
          handleNoArguments([])
          handleSend(foo, [])
          handleEndingBinaryExpression(..)
          handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ']'., Try inserting an identifier before ']'., {token: ]}], ], ])
          handleIdentifier(, expression)
          handleNoTypeArguments(])
          handleNoArguments(])
          handleSend(, ])
          handleIndexedExpression(null, [, ])
        endCascade()
        handleExpressionStatement(;)
        handleIdentifier(FilterSet, expression)
        handleNoTypeArguments(()
        beginArguments(()
          handleNoTypeVariables(()
          beginFunctionExpression(()
            beginFormalParameters((, MemberKind.Local)
              beginMetadataStar(builder)
              endMetadataStar(0)
              beginFormalParameter(builder, MemberKind.Local, null, null, null)
                handleNoType(()
                handleIdentifier(builder, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
            endFormalParameters(1, (, ), MemberKind.Local)
            handleAsyncModifier(null, null)
            handleIdentifier(builder, expression)
            handleNoTypeArguments(..)
            handleNoArguments(..)
            handleSend(builder, ..)
            beginCascade(..)
              handleIdentifier(foo, expressionContinuation)
              handleNoTypeArguments([])
              handleNoArguments([])
              handleSend(foo, [])
              handleEndingBinaryExpression(..)
              handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ']'., Try inserting an identifier before ']'., {token: ]}], ], ])
              handleIdentifier(, expression)
              handleNoTypeArguments(])
              handleNoArguments(])
              handleSend(, ])
              handleIndexedExpression(null, [, ])
            endCascade()
            handleExpressionFunctionBody(=>, null)
          endFunctionExpression((, ))
        endArguments(1, (, ))
        handleSend(FilterSet, ;)
        handleExpressionStatement(;)
        handleIdentifier(builder, expression)
        handleNoTypeArguments(..)
        handleNoArguments(..)
        handleSend(builder, ..)
        beginCascade(..)
          handleIdentifier(foo, expressionContinuation)
          handleNoTypeArguments([)
          handleNoArguments([)
          handleSend(foo, [)
          handleEndingBinaryExpression(..)
          handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ']'., Try inserting an identifier before ']'., {token: ]}], ], ])
          handleIdentifier(, expression)
          handleNoTypeArguments(])
          handleNoArguments(])
          handleSend(, ])
          handleIndexedExpression(null, [, ])
        endCascade()
        handleExpressionStatement(;)
        handleIdentifier(FilterSet, expression)
        handleNoTypeArguments(()
        beginArguments(()
          handleNoTypeVariables(()
          beginFunctionExpression(()
            beginFormalParameters((, MemberKind.Local)
              beginMetadataStar(builder)
              endMetadataStar(0)
              beginFormalParameter(builder, MemberKind.Local, null, null, null)
                handleNoType(()
                handleIdentifier(builder, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
            endFormalParameters(1, (, ), MemberKind.Local)
            handleAsyncModifier(null, null)
            handleIdentifier(builder, expression)
            handleNoTypeArguments(..)
            handleNoArguments(..)
            handleSend(builder, ..)
            beginCascade(..)
              handleIdentifier(foo, expressionContinuation)
              handleNoTypeArguments([)
              handleNoArguments([)
              handleSend(foo, [)
              handleEndingBinaryExpression(..)
              handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ']'., Try inserting an identifier before ']'., {token: ]}], ], ])
              handleIdentifier(, expression)
              handleNoTypeArguments(])
              handleNoArguments(])
              handleSend(, ])
              handleIndexedExpression(null, [, ])
            endCascade()
            handleExpressionFunctionBody(=>, null)
          endFunctionExpression((, ))
        endArguments(1, (, ))
        handleSend(FilterSet, ;)
        handleExpressionStatement(;)
      endBlockFunctionBody(6, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
