Problems reported:

parser/error_recovery/issue_26810_or:2:37: Binary operator 'or' is written as '|' instead of the written out word.
  int get a => runtimeType.hashCode or null.hashCode;
                                    ^^

parser/error_recovery/issue_26810_or:4:43: Binary operator 'or' is written as '|' instead of the written out word.
  int get c { return runtimeType.hashCode or null.hashCode; }
                                          ^^

parser/error_recovery/issue_26810_or:7:41: Binary operator 'or' is written as '|' instead of the written out word.
  int get e => 1 + runtimeType.hashCode or null.hashCode + 3;
                                        ^^

parser/error_recovery/issue_26810_or:9:47: Binary operator 'or' is written as '|' instead of the written out word.
  int get g { return 1 + runtimeType.hashCode or null.hashCode + 3; }
                                              ^^

parser/error_recovery/issue_26810_or:12:28: Binary operator 'or' is written as '|' instead of the written out word.
  int i(int x, int y) => x or y;
                           ^^

parser/error_recovery/issue_26810_or:14:34: Binary operator 'or' is written as '|' instead of the written out word.
  int k(int x, int y) { return x or y; }
                                 ^^

parser/error_recovery/issue_26810_or:16:36: Binary operator 'or' is written as '|' instead of the written out word.
  int m(int x, int y) { int z =  x or y; return z; }
                                   ^^

parser/error_recovery/issue_26810_or:19:32: Binary operator 'or' is written as '|' instead of the written out word.
  int o(int x, int y) => 1 + x or y + 3;
                               ^^

parser/error_recovery/issue_26810_or:21:38: Binary operator 'or' is written as '|' instead of the written out word.
  int q(int x, int y) { return 1 + x or y + 3; }
                                     ^^

parser/error_recovery/issue_26810_or:25:9: Binary operator 'or' is written as '|' instead of the written out word.
    s(x or y, x or y);
        ^^

parser/error_recovery/issue_26810_or:25:17: Binary operator 'or' is written as '|' instead of the written out word.
    s(x or y, x or y);
                ^^

parser/error_recovery/issue_26810_or:29:31: Binary operator 'or' is written as '|' instead of the written out word.
  Key(int x, int y) : foo = x or y, bar = x or y {
                              ^^

parser/error_recovery/issue_26810_or:29:45: Binary operator 'or' is written as '|' instead of the written out word.
  Key(int x, int y) : foo = x or y, bar = x or y {
                                            ^^

parser/error_recovery/issue_26810_or:30:22: Binary operator 'or' is written as '|' instead of the written out word.
    print("hello ${x or y}");
                     ^^

parser/error_recovery/issue_26810_or:38:7: Expected ';' after this.
    x or y;
      ^^

beginCompilationUnit(abstract)
  beginMetadataStar(abstract)
  endMetadataStar(0)
  beginClassOrNamedMixinApplicationPrelude(abstract)
    handleIdentifier(Key, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(abstract, abstract, Key)
      handleNoType(Key)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(abstract, class, null)
      beginClassOrMixinBody(DeclarationKind.Class, {)
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, get, a)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(a, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleIdentifier(runtimeType, expression)
            handleNoTypeArguments(.)
            handleNoArguments(.)
            handleSend(runtimeType, .)
            handleIdentifier(hashCode, expressionContinuation)
            handleNoTypeArguments(or)
            handleNoArguments(or)
            handleSend(hashCode, or)
            handleEndingBinaryExpression(.)
            handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
            beginBinaryExpression(|)
              handleLiteralNull(null)
              handleIdentifier(hashCode, expressionContinuation)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(hashCode, ;)
              handleEndingBinaryExpression(.)
            endBinaryExpression(|)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(get, int, =>, null, ;)
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, get, b)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(b, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleIdentifier(runtimeType, expression)
            handleNoTypeArguments(.)
            handleNoArguments(.)
            handleSend(runtimeType, .)
            handleIdentifier(hashCode, expressionContinuation)
            handleNoTypeArguments(|)
            handleNoArguments(|)
            handleSend(hashCode, |)
            handleEndingBinaryExpression(.)
            beginBinaryExpression(|)
              handleLiteralNull(null)
              handleIdentifier(hashCode, expressionContinuation)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(hashCode, ;)
              handleEndingBinaryExpression(.)
            endBinaryExpression(|)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(get, int, =>, null, ;)
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, get, c)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(c, methodDeclaration)
            handleNoTypeVariables({)
            handleNoFormalParameters({, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleIdentifier(runtimeType, expression)
                handleNoTypeArguments(.)
                handleNoArguments(.)
                handleSend(runtimeType, .)
                handleIdentifier(hashCode, expressionContinuation)
                handleNoTypeArguments(or)
                handleNoArguments(or)
                handleSend(hashCode, or)
                handleEndingBinaryExpression(.)
                handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
                beginBinaryExpression(|)
                  handleLiteralNull(null)
                  handleIdentifier(hashCode, expressionContinuation)
                  handleNoTypeArguments(;)
                  handleNoArguments(;)
                  handleSend(hashCode, ;)
                  handleEndingBinaryExpression(.)
                endBinaryExpression(|)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(get, int, {, null, })
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, get, d)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(d, methodDeclaration)
            handleNoTypeVariables({)
            handleNoFormalParameters({, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleIdentifier(runtimeType, expression)
                handleNoTypeArguments(.)
                handleNoArguments(.)
                handleSend(runtimeType, .)
                handleIdentifier(hashCode, expressionContinuation)
                handleNoTypeArguments(|)
                handleNoArguments(|)
                handleSend(hashCode, |)
                handleEndingBinaryExpression(.)
                beginBinaryExpression(|)
                  handleLiteralNull(null)
                  handleIdentifier(hashCode, expressionContinuation)
                  handleNoTypeArguments(;)
                  handleNoArguments(;)
                  handleSend(hashCode, ;)
                  handleEndingBinaryExpression(.)
                endBinaryExpression(|)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(get, int, {, null, })
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, get, e)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(e, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralInt(1)
            beginBinaryExpression(+)
              handleIdentifier(runtimeType, expression)
              handleNoTypeArguments(.)
              handleNoArguments(.)
              handleSend(runtimeType, .)
              handleIdentifier(hashCode, expressionContinuation)
              handleNoTypeArguments(or)
              handleNoArguments(or)
              handleSend(hashCode, or)
              handleEndingBinaryExpression(.)
            endBinaryExpression(+)
            handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
            beginBinaryExpression(|)
              handleLiteralNull(null)
              handleIdentifier(hashCode, expressionContinuation)
              handleNoTypeArguments(+)
              handleNoArguments(+)
              handleSend(hashCode, +)
              handleEndingBinaryExpression(.)
              beginBinaryExpression(+)
                handleLiteralInt(3)
              endBinaryExpression(+)
            endBinaryExpression(|)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(get, int, =>, null, ;)
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, get, f)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(f, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralInt(1)
            beginBinaryExpression(+)
              handleIdentifier(runtimeType, expression)
              handleNoTypeArguments(.)
              handleNoArguments(.)
              handleSend(runtimeType, .)
              handleIdentifier(hashCode, expressionContinuation)
              handleNoTypeArguments(|)
              handleNoArguments(|)
              handleSend(hashCode, |)
              handleEndingBinaryExpression(.)
            endBinaryExpression(+)
            beginBinaryExpression(|)
              handleLiteralNull(null)
              handleIdentifier(hashCode, expressionContinuation)
              handleNoTypeArguments(+)
              handleNoArguments(+)
              handleSend(hashCode, +)
              handleEndingBinaryExpression(.)
              beginBinaryExpression(+)
                handleLiteralInt(3)
              endBinaryExpression(+)
            endBinaryExpression(|)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(get, int, =>, null, ;)
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, get, g)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(g, methodDeclaration)
            handleNoTypeVariables({)
            handleNoFormalParameters({, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleLiteralInt(1)
                beginBinaryExpression(+)
                  handleIdentifier(runtimeType, expression)
                  handleNoTypeArguments(.)
                  handleNoArguments(.)
                  handleSend(runtimeType, .)
                  handleIdentifier(hashCode, expressionContinuation)
                  handleNoTypeArguments(or)
                  handleNoArguments(or)
                  handleSend(hashCode, or)
                  handleEndingBinaryExpression(.)
                endBinaryExpression(+)
                handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
                beginBinaryExpression(|)
                  handleLiteralNull(null)
                  handleIdentifier(hashCode, expressionContinuation)
                  handleNoTypeArguments(+)
                  handleNoArguments(+)
                  handleSend(hashCode, +)
                  handleEndingBinaryExpression(.)
                  beginBinaryExpression(+)
                    handleLiteralInt(3)
                  endBinaryExpression(+)
                endBinaryExpression(|)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(get, int, {, null, })
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, get, h)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(h, methodDeclaration)
            handleNoTypeVariables({)
            handleNoFormalParameters({, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleLiteralInt(1)
                beginBinaryExpression(+)
                  handleIdentifier(runtimeType, expression)
                  handleNoTypeArguments(.)
                  handleNoArguments(.)
                  handleSend(runtimeType, .)
                  handleIdentifier(hashCode, expressionContinuation)
                  handleNoTypeArguments(|)
                  handleNoArguments(|)
                  handleSend(hashCode, |)
                  handleEndingBinaryExpression(.)
                endBinaryExpression(+)
                beginBinaryExpression(|)
                  handleLiteralNull(null)
                  handleIdentifier(hashCode, expressionContinuation)
                  handleNoTypeArguments(+)
                  handleNoArguments(+)
                  handleSend(hashCode, +)
                  handleEndingBinaryExpression(.)
                  beginBinaryExpression(+)
                    handleLiteralInt(3)
                  endBinaryExpression(+)
                endBinaryExpression(|)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(get, int, {, null, })
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, i)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(i)
            handleType(int, null)
            handleIdentifier(i, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleIdentifier(x, expression)
            handleNoTypeArguments(or)
            handleNoArguments(or)
            handleSend(x, or)
            handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
            beginBinaryExpression(|)
              handleIdentifier(y, expression)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(y, ;)
            endBinaryExpression(|)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(null, int, (, null, ;)
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, j)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(j)
            handleType(int, null)
            handleIdentifier(j, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleIdentifier(x, expression)
            handleNoTypeArguments(|)
            handleNoArguments(|)
            handleSend(x, |)
            beginBinaryExpression(|)
              handleIdentifier(y, expression)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(y, ;)
            endBinaryExpression(|)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(null, int, (, null, ;)
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, k)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(k)
            handleType(int, null)
            handleIdentifier(k, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleIdentifier(x, expression)
                handleNoTypeArguments(or)
                handleNoArguments(or)
                handleSend(x, or)
                handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
                beginBinaryExpression(|)
                  handleIdentifier(y, expression)
                  handleNoTypeArguments(;)
                  handleNoArguments(;)
                  handleSend(y, ;)
                endBinaryExpression(|)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(null, int, (, null, })
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, l)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(l)
            handleType(int, null)
            handleIdentifier(l, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleIdentifier(x, expression)
                handleNoTypeArguments(|)
                handleNoArguments(|)
                handleSend(x, |)
                beginBinaryExpression(|)
                  handleIdentifier(y, expression)
                  handleNoTypeArguments(;)
                  handleNoArguments(;)
                  handleSend(y, ;)
                endBinaryExpression(|)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(null, int, (, null, })
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, m)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(m)
            handleType(int, null)
            handleIdentifier(m, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginMetadataStar(int)
              endMetadataStar(0)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(z)
              handleType(int, null)
              beginVariablesDeclaration(z, null, null)
                handleIdentifier(z, localVariableDeclaration)
                beginInitializedIdentifier(z)
                  beginVariableInitializer(=)
                    handleIdentifier(x, expression)
                    handleNoTypeArguments(or)
                    handleNoArguments(or)
                    handleSend(x, or)
                    handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
                    beginBinaryExpression(|)
                      handleIdentifier(y, expression)
                      handleNoTypeArguments(;)
                      handleNoArguments(;)
                      handleSend(y, ;)
                    endBinaryExpression(|)
                  endVariableInitializer(=)
                endInitializedIdentifier(z)
              endVariablesDeclaration(1, ;)
              beginReturnStatement(return)
                handleIdentifier(z, expression)
                handleNoTypeArguments(;)
                handleNoArguments(;)
                handleSend(z, ;)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(2, {, })
          endClassMethod(null, int, (, null, })
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, n)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(n)
            handleType(int, null)
            handleIdentifier(n, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginMetadataStar(int)
              endMetadataStar(0)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(z)
              handleType(int, null)
              beginVariablesDeclaration(z, null, null)
                handleIdentifier(z, localVariableDeclaration)
                beginInitializedIdentifier(z)
                  beginVariableInitializer(=)
                    handleIdentifier(x, expression)
                    handleNoTypeArguments(|)
                    handleNoArguments(|)
                    handleSend(x, |)
                    beginBinaryExpression(|)
                      handleIdentifier(y, expression)
                      handleNoTypeArguments(;)
                      handleNoArguments(;)
                      handleSend(y, ;)
                    endBinaryExpression(|)
                  endVariableInitializer(=)
                endInitializedIdentifier(z)
              endVariablesDeclaration(1, ;)
              beginReturnStatement(return)
                handleIdentifier(z, expression)
                handleNoTypeArguments(;)
                handleNoArguments(;)
                handleSend(z, ;)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(2, {, })
          endClassMethod(null, int, (, null, })
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, o)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(o)
            handleType(int, null)
            handleIdentifier(o, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralInt(1)
            beginBinaryExpression(+)
              handleIdentifier(x, expression)
              handleNoTypeArguments(or)
              handleNoArguments(or)
              handleSend(x, or)
            endBinaryExpression(+)
            handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
            beginBinaryExpression(|)
              handleIdentifier(y, expression)
              handleNoTypeArguments(+)
              handleNoArguments(+)
              handleSend(y, +)
              beginBinaryExpression(+)
                handleLiteralInt(3)
              endBinaryExpression(+)
            endBinaryExpression(|)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(null, int, (, null, ;)
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, p)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(p)
            handleType(int, null)
            handleIdentifier(p, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralInt(1)
            beginBinaryExpression(+)
              handleIdentifier(x, expression)
              handleNoTypeArguments(|)
              handleNoArguments(|)
              handleSend(x, |)
            endBinaryExpression(+)
            beginBinaryExpression(|)
              handleIdentifier(y, expression)
              handleNoTypeArguments(+)
              handleNoArguments(+)
              handleSend(y, +)
              beginBinaryExpression(+)
                handleLiteralInt(3)
              endBinaryExpression(+)
            endBinaryExpression(|)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(null, int, (, null, ;)
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, q)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(q)
            handleType(int, null)
            handleIdentifier(q, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleLiteralInt(1)
                beginBinaryExpression(+)
                  handleIdentifier(x, expression)
                  handleNoTypeArguments(or)
                  handleNoArguments(or)
                  handleSend(x, or)
                endBinaryExpression(+)
                handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
                beginBinaryExpression(|)
                  handleIdentifier(y, expression)
                  handleNoTypeArguments(+)
                  handleNoArguments(+)
                  handleSend(y, +)
                  beginBinaryExpression(+)
                    handleLiteralInt(3)
                  endBinaryExpression(+)
                endBinaryExpression(|)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(null, int, (, null, })
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, r)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(r)
            handleType(int, null)
            handleIdentifier(r, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleLiteralInt(1)
                beginBinaryExpression(+)
                  handleIdentifier(x, expression)
                  handleNoTypeArguments(|)
                  handleNoArguments(|)
                  handleSend(x, |)
                endBinaryExpression(+)
                beginBinaryExpression(|)
                  handleIdentifier(y, expression)
                  handleNoTypeArguments(+)
                  handleNoArguments(+)
                  handleSend(y, +)
                  beginBinaryExpression(+)
                    handleLiteralInt(3)
                  endBinaryExpression(+)
                endBinaryExpression(|)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(null, int, (, null, })
        endMember()
        beginMetadataStar(s)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, s)
            handleNoType(})
            handleIdentifier(s, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              handleIdentifier(s, expression)
              handleNoTypeArguments(()
              beginArguments(()
                handleIdentifier(x, expression)
                handleNoTypeArguments(or)
                handleNoArguments(or)
                handleSend(x, or)
                handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
                beginBinaryExpression(|)
                  handleIdentifier(y, expression)
                  handleNoTypeArguments(,)
                  handleNoArguments(,)
                  handleSend(y, ,)
                endBinaryExpression(|)
                handleIdentifier(x, expression)
                handleNoTypeArguments(or)
                handleNoArguments(or)
                handleSend(x, or)
                handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
                beginBinaryExpression(|)
                  handleIdentifier(y, expression)
                  handleNoTypeArguments())
                  handleNoArguments())
                  handleSend(y, ))
                endBinaryExpression(|)
              endArguments(2, (, ))
              handleSend(s, ;)
              handleExpressionStatement(;)
              handleIdentifier(s, expression)
              handleNoTypeArguments(()
              beginArguments(()
                handleIdentifier(x, expression)
                handleNoTypeArguments(|)
                handleNoArguments(|)
                handleSend(x, |)
                beginBinaryExpression(|)
                  handleIdentifier(y, expression)
                  handleNoTypeArguments(,)
                  handleNoArguments(,)
                  handleSend(y, ,)
                endBinaryExpression(|)
                handleIdentifier(x, expression)
                handleNoTypeArguments(|)
                handleNoArguments(|)
                handleSend(x, |)
                beginBinaryExpression(|)
                  handleIdentifier(y, expression)
                  handleNoTypeArguments())
                  handleNoArguments())
                  handleSend(y, ))
                endBinaryExpression(|)
              endArguments(2, (, ))
              handleSend(s, ;)
              handleExpressionStatement(;)
            endBlockFunctionBody(2, {, })
          endClassMethod(null, s, (, null, })
        endMember()
        beginMetadataStar(Key)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, Key)
            handleNoType(})
            handleIdentifier(Key, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            beginInitializers(:)
              beginInitializer(foo)
                handleIdentifier(foo, expression)
                handleNoTypeArguments(=)
                handleNoArguments(=)
                handleSend(foo, =)
                handleIdentifier(x, expression)
                handleNoTypeArguments(or)
                handleNoArguments(or)
                handleSend(x, or)
                handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
                beginBinaryExpression(|)
                  handleIdentifier(y, expression)
                  handleNoTypeArguments(,)
                  handleNoArguments(,)
                  handleSend(y, ,)
                endBinaryExpression(|)
                handleAssignmentExpression(=)
              endInitializer(,)
              beginInitializer(bar)
                handleIdentifier(bar, expression)
                handleNoTypeArguments(=)
                handleNoArguments(=)
                handleSend(bar, =)
                handleIdentifier(x, expression)
                handleNoTypeArguments(or)
                handleNoArguments(or)
                handleSend(x, or)
                handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
                beginBinaryExpression(|)
                  handleIdentifier(y, expression)
                  handleNoTypeArguments({)
                  handleNoArguments({)
                  handleSend(y, {)
                endBinaryExpression(|)
                handleAssignmentExpression(=)
              endInitializer({)
            endInitializers(2, :, {)
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              handleIdentifier(print, expression)
              handleNoTypeArguments(()
              beginArguments(()
                beginLiteralString("hello )
                  handleIdentifier(x, expression)
                  handleNoTypeArguments(or)
                  handleNoArguments(or)
                  handleSend(x, or)
                  handleRecoverableError(Message[BinaryOperatorWrittenOut, Binary operator 'or' is written as '|' instead of the written out word., Try replacing 'or' with '|'., {string: or, string2: |}], or, or)
                  beginBinaryExpression(|)
                    handleIdentifier(y, expression)
                    handleNoTypeArguments(})
                    handleNoArguments(})
                    handleSend(y, })
                  endBinaryExpression(|)
                  handleInterpolationExpression(${, })
                  handleStringPart(")
                endLiteralString(1, ))
              endArguments(1, (, ))
              handleSend(print, ;)
              handleExpressionStatement(;)
            endBlockFunctionBody(1, {, })
          endClassConstructor(null, Key, (, :, })
        endMember()
        beginMetadataStar(Key)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, Key)
            handleNoType(})
            handleIdentifier(Key, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            beginInitializers(:)
              beginInitializer(foo)
                handleIdentifier(foo, expression)
                handleNoTypeArguments(=)
                handleNoArguments(=)
                handleSend(foo, =)
                handleIdentifier(x, expression)
                handleNoTypeArguments(|)
                handleNoArguments(|)
                handleSend(x, |)
                beginBinaryExpression(|)
                  handleIdentifier(y, expression)
                  handleNoTypeArguments(,)
                  handleNoArguments(,)
                  handleSend(y, ,)
                endBinaryExpression(|)
                handleAssignmentExpression(=)
              endInitializer(,)
              beginInitializer(bar)
                handleIdentifier(bar, expression)
                handleNoTypeArguments(=)
                handleNoArguments(=)
                handleSend(bar, =)
                handleIdentifier(x, expression)
                handleNoTypeArguments(|)
                handleNoArguments(|)
                handleSend(x, |)
                beginBinaryExpression(|)
                  handleIdentifier(y, expression)
                  handleNoTypeArguments({)
                  handleNoArguments({)
                  handleSend(y, {)
                endBinaryExpression(|)
                handleAssignmentExpression(=)
              endInitializer({)
            endInitializers(2, :, {)
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              handleIdentifier(print, expression)
              handleNoTypeArguments(()
              beginArguments(()
                beginLiteralString("hello )
                  handleIdentifier(x, expression)
                  handleNoTypeArguments(|)
                  handleNoArguments(|)
                  handleSend(x, |)
                  beginBinaryExpression(|)
                    handleIdentifier(y, expression)
                    handleNoTypeArguments(})
                    handleNoArguments(})
                    handleSend(y, })
                  endBinaryExpression(|)
                  handleInterpolationExpression(${, })
                  handleStringPart(")
                endLiteralString(1, ))
              endArguments(1, (, ))
              handleSend(print, ;)
              handleExpressionStatement(;)
            endBlockFunctionBody(1, {, })
          endClassConstructor(null, Key, (, :, })
        endMember()
        beginMetadataStar(not_currently_working)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, not_currently_working)
            handleNoType(})
            handleIdentifier(not_currently_working, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(x)
                handleType(int, null)
                handleIdentifier(x, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(y)
                handleType(int, null)
                handleIdentifier(y, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginMetadataStar(x)
              endMetadataStar(0)
              handleIdentifier(x, typeReference)
              handleNoTypeArguments(or)
              handleType(x, null)
              beginVariablesDeclaration(or, null, null)
                handleIdentifier(or, localVariableDeclaration)
                beginInitializedIdentifier(or)
                  handleNoVariableInitializer(or)
                endInitializedIdentifier(or)
                handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], or, or)
              endVariablesDeclaration(1, ;)
              handleIdentifier(y, expression)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(y, ;)
              handleExpressionStatement(;)
              handleIdentifier(x, expression)
              handleNoTypeArguments(|)
              handleNoArguments(|)
              handleSend(x, |)
              beginBinaryExpression(|)
                handleIdentifier(y, expression)
                handleNoTypeArguments(;)
                handleNoArguments(;)
                handleSend(y, ;)
              endBinaryExpression(|)
              handleExpressionStatement(;)
            endBlockFunctionBody(3, {, })
          endClassMethod(null, not_currently_working, (, null, })
        endMember()
      endClassOrMixinBody(DeclarationKind.Class, 22, {, })
    endClassDeclaration(abstract, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
