Problems reported:

parser/patterns/cast_insideNullAssert:4:10: This pattern cannot appear inside a unary pattern (cast pattern, null check pattern, or null assert pattern) without parentheses.
    case y as int!:
         ^^^^^^^^

beginCompilationUnit(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(, null, null)
      handleVoidKeyword(void)
      handleIdentifier(f, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
        beginMetadataStar(x)
        endMetadataStar(0)
        beginFormalParameter(x, MemberKind.TopLevelMethod, null, null, null)
          handleNoType(()
          handleIdentifier(x, formalParameterDeclaration)
          handleFormalParameterWithoutValue())
        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginMetadataStar(const)
        endMetadataStar(0)
        handleNoType(const)
        beginVariablesDeclaration(y, null, const)
          handleIdentifier(y, localVariableDeclaration)
          beginInitializedIdentifier(y)
            beginVariableInitializer(=)
              handleLiteralInt(1)
            endVariableInitializer(=)
          endInitializedIdentifier(y)
        endVariablesDeclaration(1, ;)
        beginSwitchStatement(switch)
          handleIdentifier(x, expression)
          handleNoTypeArguments())
          handleNoArguments())
          handleSend(x, x)
          handleParenthesizedCondition((, null, null)
          beginSwitchBlock({)
            beginCaseExpression(case)
              beginPattern(case)
                beginConstantPattern(null)
                  handleIdentifier(y, expression)
                  handleNoTypeArguments(as)
                  handleNoArguments(as)
                  handleSend(y, y)
                endConstantPattern(null)
                beginAsOperatorType(as)
                  handleIdentifier(int, typeReference)
                  handleNoTypeArguments(!)
                  handleType(int, null)
                endAsOperatorType(as)
                handleCastPattern(as)
                handleRecoverableError(InvalidInsideUnaryPattern, y, int)
                handleNullAssertPattern(!)
              endPattern(!)
              handleSwitchCaseNoWhenClause(!)
            endCaseExpression(case, null, :)
            beginSwitchCase(0, 1, case)
              handleBreakStatement(false, break, ;)
            endSwitchCase(0, 1, null, null, 1, case, ;)
          endSwitchBlock(1, {, })
        endSwitchStatement(switch, })
      endBlockFunctionBody(2, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration(})
endCompilationUnit(1, )
