JetFile: When.jet
  NAMESPACE
    FUN
      PsiElement(fun)('fun')
      PsiWhiteSpace(' ')
      PsiElement(IDENTIFIER)('foo')
      VALUE_PARAMETER_LIST
        PsiElement(LPAR)('(')
        PsiElement(RPAR)(')')
      PsiWhiteSpace(' ')
      BLOCK
        PsiElement(LBRACE)('{')
        PsiWhiteSpace('\n  ')
        RETURN
          PsiElement(return)('return')
          PsiWhiteSpace(' ')
          BOOLEAN_CONSTANT
            PsiElement(false)('false')
        PsiWhiteSpace('\n\n  ')
        FUN
          PsiElement(fun)('fun')
          PsiWhiteSpace(' ')
          PsiElement(IDENTIFIER)('a')
          VALUE_PARAMETER_LIST
            PsiElement(LPAR)('(')
            PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          PsiElement(EQ)('=')
          PsiWhiteSpace(' ')
          FUNCTION_LITERAL_EXPRESSION
            FUNCTION_LITERAL
              PsiElement(LBRACE)('{')
              BLOCK
                WHEN
                  PsiElement(when)('when')
                  PsiElement(LPAR)('(')
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('x')
                  PsiElement(RPAR)(')')
                  PsiWhiteSpace(' ')
                  PsiElement(LBRACE)('{')
                  PsiWhiteSpace(' ')
                  WHEN_ENTRY
                    WHEN_CONDITION_IS_PATTERN
                      PsiElement(is)('is')
                      PsiWhiteSpace(' ')
                      TYPE_PATTERN
                        TYPE_REFERENCE
                          USER_TYPE
                            REFERENCE_EXPRESSION
                              PsiElement(IDENTIFIER)('a')
                    PsiWhiteSpace(' ')
                    PsiElement(DOUBLE_ARROW)('=>')
                    PsiWhiteSpace(' ')
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('b')
                  PsiWhiteSpace(' ')
                  PsiElement(RBRACE)('}')
              PsiElement(RBRACE)('}')
        PsiWhiteSpace('\n\n  ')
        PsiComment(EOL_COMMENT)('// foo')
        PsiWhiteSpace('\n  ')
        FUN
          PsiElement(fun)('fun')
          PsiWhiteSpace(' ')
          PsiElement(IDENTIFIER)('b')
          VALUE_PARAMETER_LIST
            PsiElement(LPAR)('(')
            PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          BLOCK
            PsiElement(LBRACE)('{')
            PsiElement(RBRACE)('}')
        PsiWhiteSpace('\n\n')
        PsiElement(RBRACE)('}')
    PsiWhiteSpace('\n\n')
    FUN
      PsiElement(fun)('fun')
      PsiWhiteSpace(' ')
      PsiElement(IDENTIFIER)('foo')
      VALUE_PARAMETER_LIST
        PsiElement(LPAR)('(')
        PsiElement(RPAR)(')')
      PsiWhiteSpace(' ')
      BLOCK
        PsiElement(LBRACE)('{')
        PsiWhiteSpace('\n  ')
        WHEN
          PsiElement(when)('when')
          PsiWhiteSpace(' ')
          PsiElement(LPAR)('(')
          REFERENCE_EXPRESSION
            PsiElement(IDENTIFIER)('e')
          PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          PsiElement(LBRACE)('{')
          PsiWhiteSpace('\n                          \n  ')
          PsiElement(RBRACE)('}')
        PsiWhiteSpace('\n  ')
        WHEN
          PsiElement(when)('when')
          PsiWhiteSpace(' ')
          PsiElement(LPAR)('(')
          REFERENCE_EXPRESSION
            PsiElement(IDENTIFIER)('e')
          PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          PsiElement(LBRACE)('{')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              TYPE_PATTERN
                TYPE_REFERENCE
                  USER_TYPE
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('a')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('foo')
          PsiWhiteSpace('\n  ')
          PsiElement(RBRACE)('}')
        PsiWhiteSpace('\n  ')
        WHEN
          PsiElement(when)('when')
          PsiWhiteSpace(' ')
          PsiElement(LPAR)('(')
          REFERENCE_EXPRESSION
            PsiElement(IDENTIFIER)('e')
          PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          PsiElement(LBRACE)('{')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              DECOMPOSER_PATTERN
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('Tree')
                PsiWhiteSpace(' ')
                PsiElement(AT)('@')
                PsiWhiteSpace(' ')
                DECOMPOSER_ARGUMENT_LIST
                  PsiElement(LPAR)('(')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('a')
                  PsiElement(COMMA)(',')
                  PsiWhiteSpace(' ')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('b')
                  PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('foo')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              EXPRESSION_PATTERN
                NULL
                  PsiElement(null)('null')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('foo')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              EXPRESSION_PATTERN
                INTEGER_CONSTANT
                  PsiElement(INTEGER_LITERAL)('1')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('foo')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              TYPE_PATTERN
                TYPE_REFERENCE
                  USER_TYPE
                    USER_TYPE
                      REFERENCE_EXPRESSION
                        PsiElement(IDENTIFIER)('A')
                    PsiElement(DOT)('.')
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('b')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('foo')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              EXPRESSION_PATTERN
                FLOAT_CONSTANT
                  PsiElement(FLOAT_CONSTANT)('1.0')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('foo')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              EXPRESSION_PATTERN
                CHARACTER_CONSTANT
                  PsiElement(CHARACTER_LITERAL)(''c'')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('foo')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              EXPRESSION_PATTERN
                STRING_TEMPLATE
                  PsiElement(OPEN_QUOTE)('"')
                  LITERAL_STRING_TEMPLATE_ENTRY
                    PsiElement(REGULAR_STRING_PART)('sadfsa')
                  PsiElement(CLOSING_QUOTE)('"')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('foo')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              EXPRESSION_PATTERN
                STRING_CONSTANT
                  PsiElement(RAW_STRING_LITERAL)('"""ddd"""')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('foo')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              WILDCARD_PATTERN
                PsiElement(MUL)('*')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('foo')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              BINDING_PATTERN
                PROPERTY
                  PsiElement(val)('val')
                  PsiWhiteSpace(' ')
                  PsiElement(IDENTIFIER)('a')
                PsiWhiteSpace(' ')
                WHEN_CONDITION_IS_PATTERN
                  PsiElement(is)('is')
                  PsiWhiteSpace(' ')
                  TYPE_PATTERN
                    TYPE_REFERENCE
                      USER_TYPE
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('Foo')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('foo')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              TUPLE_PATTERN
                PsiElement(LPAR)('(')
                TUPLE_PATTERN_ENTRY
                  BINDING_PATTERN
                    PROPERTY
                      PsiElement(val)('val')
                      PsiWhiteSpace(' ')
                      PsiElement(IDENTIFIER)('a')
                    PsiWhiteSpace(' ')
                    WHEN_CONDITION_IS_PATTERN
                      PsiElement(is)('is')
                      PsiWhiteSpace(' ')
                      TYPE_PATTERN
                        TYPE_REFERENCE
                          USER_TYPE
                            REFERENCE_EXPRESSION
                              PsiElement(IDENTIFIER)('Foo')
                PsiElement(COMMA)(',')
                PsiWhiteSpace(' ')
                TUPLE_PATTERN_ENTRY
                  TYPE_PATTERN
                    TYPE_REFERENCE
                      USER_TYPE
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('b')
                PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('foo')
          PsiWhiteSpace('\n  ')
          PsiElement(RBRACE)('}')
        PsiWhiteSpace('\n  ')
        WHEN
          PsiElement(when)('when')
          PsiWhiteSpace(' ')
          PsiElement(LPAR)('(')
          WHEN
            PsiElement(when)('when')
            PsiElement(LPAR)('(')
            WHEN
              PsiElement(when)('when')
              PsiWhiteSpace(' ')
              PsiElement(LPAR)('(')
              REFERENCE_EXPRESSION
                PsiElement(IDENTIFIER)('e')
              PsiElement(RPAR)(')')
              PsiWhiteSpace(' ')
              PsiElement(LBRACE)('{')
              PsiWhiteSpace('\n\n  ')
              PsiElement(RBRACE)('}')
            PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(LBRACE)('{')
            PsiWhiteSpace('\n\n  ')
            PsiElement(RBRACE)('}')
          PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          PsiElement(LBRACE)('{')
          PsiWhiteSpace('\n\n  ')
          PsiElement(RBRACE)('}')
        PsiWhiteSpace('\n')
        PsiElement(RBRACE)('}')
    PsiWhiteSpace('\n\n')
    FUN
      PsiElement(fun)('fun')
      PsiWhiteSpace(' ')
      PsiElement(IDENTIFIER)('foo')
      VALUE_PARAMETER_LIST
        PsiElement(LPAR)('(')
        PsiElement(RPAR)(')')
      PsiWhiteSpace(' ')
      BLOCK
        PsiElement(LBRACE)('{')
        PsiWhiteSpace('\n  ')
        WHEN
          PsiElement(when)('when')
          PsiWhiteSpace(' ')
          PsiElement(LPAR)('(')
          PROPERTY
            PsiElement(val)('val')
            PsiWhiteSpace(' ')
            PsiElement(IDENTIFIER)('a')
            PsiWhiteSpace(' ')
            PsiElement(EQ)('=')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('e')
          PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          PsiElement(LBRACE)('{')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              TYPE_PATTERN
                TYPE_REFERENCE
                  USER_TYPE
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('Tree')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('c')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              DECOMPOSER_PATTERN
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('Tree')
                PsiWhiteSpace(' ')
                PsiElement(AT)('@')
                PsiWhiteSpace(' ')
                DECOMPOSER_ARGUMENT_LIST
                  PsiElement(LPAR)('(')
                  TUPLE_PATTERN_ENTRY
                    EXPRESSION_PATTERN
                      NULL
                        PsiElement(null)('null')
                  PsiElement(COMMA)(',')
                  PsiWhiteSpace(' ')
                  TUPLE_PATTERN_ENTRY
                    BINDING_PATTERN
                      PROPERTY
                        PsiElement(val)('val')
                        PsiWhiteSpace(' ')
                        PsiElement(IDENTIFIER)('r')
                  PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('c')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              DECOMPOSER_PATTERN
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('a')
                PsiWhiteSpace(' ')
                PsiElement(AT)('@')
                PsiWhiteSpace(' ')
                DECOMPOSER_ARGUMENT_LIST
                  PsiElement(LPAR)('(')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('a')
                  PsiElement(COMMA)(',')
                  PsiWhiteSpace(' ')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('b')
                  PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('c')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              DECOMPOSER_PATTERN
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('a')
                PsiWhiteSpace(' ')
                PsiElement(AT)('@')
                PsiWhiteSpace(' ')
                DECOMPOSER_ARGUMENT_LIST
                  PsiElement(LPAR)('(')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('a')
                  PsiElement(COMMA)(',')
                  PsiWhiteSpace(' ')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('b')
                  PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('c')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              DECOMPOSER_PATTERN
                DOT_QUALIFIED_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('a')
                  PsiElement(DOT)('.')
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('a')
                PsiWhiteSpace(' ')
                PsiElement(AT)('@')
                PsiWhiteSpace(' ')
                DECOMPOSER_ARGUMENT_LIST
                  PsiElement(LPAR)('(')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('a')
                  PsiElement(COMMA)(',')
                  PsiWhiteSpace(' ')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('b')
                  PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('c')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              DECOMPOSER_PATTERN
                DOT_QUALIFIED_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('a')
                  PsiElement(DOT)('.')
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('a')
                PsiWhiteSpace(' ')
                PsiElement(AT)('@')
                PsiWhiteSpace(' ')
                DECOMPOSER_ARGUMENT_LIST
                  PsiElement(LPAR)('(')
                  TUPLE_PATTERN_ENTRY
                    PsiElement(IDENTIFIER)('foo')
                    PsiWhiteSpace(' ')
                    PsiElement(EQ)('=')
                    PsiWhiteSpace(' ')
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('a')
                  PsiElement(COMMA)(',')
                  PsiWhiteSpace(' ')
                  TUPLE_PATTERN_ENTRY
                    PsiElement(IDENTIFIER)('bar')
                    PsiWhiteSpace(' ')
                    PsiElement(EQ)('=')
                    PsiWhiteSpace(' ')
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('b')
                  PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('c')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              DECOMPOSER_PATTERN
                DOT_QUALIFIED_EXPRESSION
                  DOT_QUALIFIED_EXPRESSION
                    ROOT_NAMESPACE
                      PsiElement(namespace)('namespace')
                    PsiElement(DOT)('.')
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('a')
                  PsiElement(DOT)('.')
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('a')
                PsiWhiteSpace(' ')
                PsiElement(AT)('@')
                PsiWhiteSpace(' ')
                DECOMPOSER_ARGUMENT_LIST
                  PsiElement(LPAR)('(')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('a')
                  PsiElement(COMMA)(',')
                  PsiWhiteSpace(' ')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('b')
                  PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('c')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              DECOMPOSER_PATTERN
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('a')
                PsiWhiteSpace(' ')
                PsiElement(AT)('@')
                PsiWhiteSpace(' ')
                DECOMPOSER_ARGUMENT_LIST
                  PsiElement(LPAR)('(')
                  TUPLE_PATTERN_ENTRY
                    BINDING_PATTERN
                      PROPERTY
                        PsiElement(val)('val')
                        PsiWhiteSpace(' ')
                        PsiElement(IDENTIFIER)('a')
                      PsiWhiteSpace(' ')
                      WHEN_CONDITION_IS_PATTERN
                        PsiElement(is)('is')
                        PsiWhiteSpace(' ')
                        TYPE_PATTERN
                          TYPE_REFERENCE
                            USER_TYPE
                              REFERENCE_EXPRESSION
                                PsiElement(IDENTIFIER)('T')
                  PsiElement(COMMA)(',')
                  PsiWhiteSpace(' ')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('b')
                  PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('c')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              DECOMPOSER_PATTERN
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('a')
                PsiWhiteSpace(' ')
                PsiElement(AT)('@')
                PsiWhiteSpace(' ')
                DECOMPOSER_ARGUMENT_LIST
                  PsiElement(LPAR)('(')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('b')
                  PsiElement(COMMA)(',')
                  PsiWhiteSpace(' ')
                  TUPLE_PATTERN_ENTRY
                    EXPRESSION_PATTERN
                      INTEGER_CONSTANT
                        PsiElement(INTEGER_LITERAL)('1')
                  PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('c')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IN_RANGE
              OPERATION_REFERENCE
                PsiElement(in)('in')
              PsiWhiteSpace(' ')
              BINARY_EXPRESSION
                INTEGER_CONSTANT
                  PsiElement(INTEGER_LITERAL)('1')
                OPERATION_REFERENCE
                  PsiElement(RANGE)('..')
                INTEGER_CONSTANT
                  PsiElement(INTEGER_LITERAL)('2')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('dsf')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IN_RANGE
              OPERATION_REFERENCE
                PsiElement(NOT_IN)('!in')
              PsiWhiteSpace(' ')
              INTEGER_CONSTANT
                PsiElement(INTEGER_LITERAL)('2')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('sd')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(NOT_IS)('!is')
              PsiWhiteSpace(' ')
              TYPE_PATTERN
                TYPE_REFERENCE
                  USER_TYPE
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('t')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('d')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              TYPE_PATTERN
                TYPE_REFERENCE
                  FUNCTION_TYPE
                    PsiElement(fun)('fun')
                    PsiWhiteSpace(' ')
                    VALUE_PARAMETER_LIST
                      PsiElement(LPAR)('(')
                      VALUE_PARAMETER
                        TYPE_REFERENCE
                          USER_TYPE
                            REFERENCE_EXPRESSION
                              PsiElement(IDENTIFIER)('foo')
                      PsiElement(RPAR)(')')
                    PsiWhiteSpace(' ')
                    PsiElement(COLON)(':')
                    PsiWhiteSpace(' ')
                    TYPE_REFERENCE
                      USER_TYPE
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('Bar')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('fgpp')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              TUPLE_PATTERN
                PsiElement(LPAR)('(')
                TUPLE_PATTERN_ENTRY
                  EXPRESSION_PATTERN
                    INTEGER_CONSTANT
                      PsiElement(INTEGER_LITERAL)('1')
                PsiElement(COMMA)(',')
                PsiWhiteSpace(' ')
                TUPLE_PATTERN_ENTRY
                  BINDING_PATTERN
                    PROPERTY
                      PsiElement(val)('val')
                      PsiWhiteSpace(' ')
                      PsiElement(IDENTIFIER)('a')
                    PsiWhiteSpace(' ')
                    WHEN_CONDITION_IS_PATTERN
                      PsiElement(is)('is')
                      PsiWhiteSpace(' ')
                      TYPE_PATTERN
                        TYPE_REFERENCE
                          USER_TYPE
                            REFERENCE_EXPRESSION
                              PsiElement(IDENTIFIER)('Foo')
                PsiElement(COMMA)(',')
                PsiWhiteSpace(' ')
                TUPLE_PATTERN_ENTRY
                  WILDCARD_PATTERN
                    PsiElement(MUL)('*')
                PsiElement(COMMA)(',')
                PsiWhiteSpace(' ')
                TUPLE_PATTERN_ENTRY
                  TYPE_PATTERN
                    TYPE_REFERENCE
                      USER_TYPE
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('Foo')
                PsiElement(COMMA)(',')
                PsiWhiteSpace(' ')
                TUPLE_PATTERN_ENTRY
                  TYPE_PATTERN
                    TYPE_REFERENCE
                      USER_TYPE
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('bar')
                PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('d')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              TUPLE_PATTERN
                PsiElement(LPAR)('(')
                TUPLE_PATTERN_ENTRY
                  TYPE_PATTERN
                    TYPE_REFERENCE
                      USER_TYPE
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('Foo')
                PsiElement(COMMA)(',')
                PsiWhiteSpace(' ')
                TUPLE_PATTERN_ENTRY
                  BINDING_PATTERN
                    PROPERTY
                      PsiElement(val)('val')
                      PsiWhiteSpace(' ')
                      PsiElement(IDENTIFIER)('a')
                    PsiWhiteSpace(' ')
                    WHEN_CONDITION_IN_RANGE
                      OPERATION_REFERENCE
                        PsiElement(in)('in')
                      PsiWhiteSpace(' ')
                      BINARY_EXPRESSION
                        INTEGER_CONSTANT
                          PsiElement(INTEGER_LITERAL)('1')
                        OPERATION_REFERENCE
                          PsiElement(RANGE)('..')
                        INTEGER_CONSTANT
                          PsiElement(INTEGER_LITERAL)('2')
                PsiElement(COMMA)(',')
                PsiWhiteSpace(' ')
                TUPLE_PATTERN_ENTRY
                  WILDCARD_PATTERN
                    PsiElement(MUL)('*')
                PsiElement(COMMA)(',')
                PsiWhiteSpace(' ')
                TUPLE_PATTERN_ENTRY
                  BINDING_PATTERN
                    PROPERTY
                      PsiElement(val)('val')
                      PsiWhiteSpace(' ')
                      PsiElement(IDENTIFIER)('_')
                    PsiWhiteSpace(' ')
                    WHEN_CONDITION_IS_PATTERN
                      PsiElement(NOT_IS)('!is')
                      PsiWhiteSpace(' ')
                      TYPE_PATTERN
                        TYPE_REFERENCE
                          USER_TYPE
                            REFERENCE_EXPRESSION
                              PsiElement(IDENTIFIER)('Foo')
                PsiElement(COMMA)(',')
                PsiWhiteSpace(' ')
                TUPLE_PATTERN_ENTRY
                  BINDING_PATTERN
                    PROPERTY
                      PsiElement(val)('val')
                      PsiWhiteSpace(' ')
                      PsiElement(IDENTIFIER)('bar')
                    PsiWhiteSpace(' ')
                    WHEN_CONDITION_IS_PATTERN
                      PsiElement(is)('is')
                      PsiWhiteSpace(' ')
                      DECOMPOSER_PATTERN
                        DOT_QUALIFIED_EXPRESSION
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('foo')
                          PsiElement(DOT)('.')
                          CALL_EXPRESSION
                            REFERENCE_EXPRESSION
                              PsiElement(IDENTIFIER)('bar')
                            TYPE_ARGUMENT_LIST
                              PsiElement(LT)('<')
                              TYPE_PROJECTION
                                TYPE_REFERENCE
                                  USER_TYPE
                                    REFERENCE_EXPRESSION
                                      PsiElement(IDENTIFIER)('a')
                              PsiElement(GT)('>')
                        PsiWhiteSpace(' ')
                        PsiElement(AT)('@')
                        PsiWhiteSpace(' ')
                        DECOMPOSER_ARGUMENT_LIST
                          PsiElement(LPAR)('(')
                          TUPLE_PATTERN_ENTRY
                            TYPE_PATTERN
                              TYPE_REFERENCE
                                USER_TYPE
                                  REFERENCE_EXPRESSION
                                    PsiElement(IDENTIFIER)('a')
                          PsiElement(RPAR)(')')
                PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('d')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              TUPLE_PATTERN
                PsiElement(LPAR)('(')
                TUPLE_PATTERN_ENTRY
                  TYPE_PATTERN
                    TYPE_REFERENCE
                      USER_TYPE
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('Int')
                PsiElement(COMMA)(',')
                PsiWhiteSpace(' ')
                TUPLE_PATTERN_ENTRY
                  TYPE_PATTERN
                    TYPE_REFERENCE
                      USER_TYPE
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('Int')
                PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            INTEGER_CONSTANT
              PsiElement(INTEGER_LITERAL)('2')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              BINDING_PATTERN
                PROPERTY
                  PsiElement(val)('val')
                  PsiWhiteSpace(' ')
                  PsiElement(IDENTIFIER)('a')
                  PsiWhiteSpace(' ')
                  PsiElement(COLON)(':')
                  PsiWhiteSpace(' ')
                  TYPE_REFERENCE
                    USER_TYPE
                      REFERENCE_EXPRESSION
                        PsiElement(IDENTIFIER)('Foo')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            INTEGER_CONSTANT
              PsiElement(INTEGER_LITERAL)('2')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            PsiElement(else)('else')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('foo')
          PsiWhiteSpace('\n  ')
          PsiElement(RBRACE)('}')
        PsiWhiteSpace('\n')
        PsiElement(RBRACE)('}')
    PsiWhiteSpace('\n\n')
    FUN
      PsiElement(fun)('fun')
      PsiWhiteSpace(' ')
      PsiElement(IDENTIFIER)('foo')
      VALUE_PARAMETER_LIST
        PsiElement(LPAR)('(')
        PsiElement(RPAR)(')')
      PsiWhiteSpace(' ')
      BLOCK
        PsiElement(LBRACE)('{')
        PsiWhiteSpace('\n  ')
        WHEN
          PsiElement(when)('when')
          PsiWhiteSpace(' ')
          PsiElement(LPAR)('(')
          PROPERTY
            PsiElement(val)('val')
            PsiWhiteSpace(' ')
            PsiElement(IDENTIFIER)('a')
            PsiWhiteSpace(' ')
            PsiElement(EQ)('=')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('e')
          PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          PsiElement(LBRACE)('{')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              TYPE_PATTERN
                TYPE_REFERENCE
                  USER_TYPE
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('Tree')
            PsiElement(COMMA)(',')
            PsiWhiteSpace('\n    ')
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              DECOMPOSER_PATTERN
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('Tree')
                PsiWhiteSpace(' ')
                PsiElement(AT)('@')
                PsiWhiteSpace(' ')
                DECOMPOSER_ARGUMENT_LIST
                  PsiElement(LPAR)('(')
                  TUPLE_PATTERN_ENTRY
                    EXPRESSION_PATTERN
                      NULL
                        PsiElement(null)('null')
                  PsiElement(COMMA)(',')
                  PsiWhiteSpace(' ')
                  TUPLE_PATTERN_ENTRY
                    BINDING_PATTERN
                      PROPERTY
                        PsiElement(val)('val')
                        PsiWhiteSpace(' ')
                        PsiElement(IDENTIFIER)('r')
                  PsiElement(RPAR)(')')
            PsiElement(COMMA)(',')
            PsiWhiteSpace('\n    ')
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              DECOMPOSER_PATTERN
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('a')
                PsiWhiteSpace(' ')
                PsiElement(AT)('@')
                PsiWhiteSpace(' ')
                DECOMPOSER_ARGUMENT_LIST
                  PsiElement(LPAR)('(')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('a')
                  PsiElement(COMMA)(',')
                  PsiWhiteSpace(' ')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('b')
                  PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('c')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              EXPRESSION_PATTERN
                INTEGER_CONSTANT
                  PsiElement(INTEGER_LITERAL)('1')
            PsiElement(COMMA)(',')
            PsiWhiteSpace(' ')
            WHEN_CONDITION_IS_PATTERN
              EXPRESSION_PATTERN
                CALL_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('foo')
                  VALUE_ARGUMENT_LIST
                    PsiElement(LPAR)('(')
                    PsiElement(RPAR)(')')
            PsiElement(COMMA)(',')
            PsiWhiteSpace(' ')
            WHEN_CONDITION_IS_PATTERN
              EXPRESSION_PATTERN
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('bar')
            PsiElement(COMMA)(',')
            PsiWhiteSpace(' ')
            WHEN_CONDITION_IS_PATTERN
              EXPRESSION_PATTERN
                BINARY_EXPRESSION
                  INTEGER_CONSTANT
                    PsiElement(INTEGER_LITERAL)('2')
                  PsiWhiteSpace(' ')
                  OPERATION_REFERENCE
                    PsiElement(PLUS)('+')
                  PsiWhiteSpace(' ')
                  INTEGER_CONSTANT
                    PsiElement(INTEGER_LITERAL)('3')
            PsiElement(COMMA)(',')
            PsiWhiteSpace('\n    ')
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              DECOMPOSER_PATTERN
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('a')
                PsiWhiteSpace(' ')
                PsiElement(AT)('@')
                PsiWhiteSpace(' ')
                DECOMPOSER_ARGUMENT_LIST
                  PsiElement(LPAR)('(')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('a')
                  PsiElement(COMMA)(',')
                  PsiWhiteSpace(' ')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('b')
                  PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('c')
          PsiWhiteSpace('\n    ')
          WHEN_ENTRY
            WHEN_CONDITION_IS_PATTERN
              PsiElement(is)('is')
              PsiWhiteSpace(' ')
              DECOMPOSER_PATTERN
                DOT_QUALIFIED_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('a')
                  PsiElement(DOT)('.')
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('a')
                PsiWhiteSpace(' ')
                PsiElement(AT)('@')
                PsiWhiteSpace(' ')
                DECOMPOSER_ARGUMENT_LIST
                  PsiElement(LPAR)('(')
                  TUPLE_PATTERN_ENTRY
                    BINDING_PATTERN
                      PROPERTY
                        PsiElement(val)('val')
                        PsiWhiteSpace(' ')
                        PsiElement(IDENTIFIER)('b')
                  PsiElement(COMMA)(',')
                  PsiWhiteSpace(' ')
                  TUPLE_PATTERN_ENTRY
                    TYPE_PATTERN
                      TYPE_REFERENCE
                        USER_TYPE
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('b')
                  PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            PsiElement(DOUBLE_ARROW)('=>')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('c')
          PsiWhiteSpace('\n  ')
          PsiElement(RBRACE)('}')
        PsiWhiteSpace('\n')
        PsiElement(RBRACE)('}')