docs: @Override
    public Description matchReturn(ReturnTree tree, VisitorState state) {
      if (!matchWithinClass) {
        return Description.NO_MATCH;
      }
      handler.onMatchReturn(this, tree, state);
      ExpressionTree retExpr = tree.getExpression();
      // let's do quick checks on returned expression first
      if (retExpr == null) {
        return Description.NO_MATCH;
      }
      // now let's check the enclosing method
      TreePath enclosingMethodOrLambda =
          NullabilityUtil.findEnclosingMethodOrLambdaOrInitializer(state.getPath());
      if (enclosingMethodOrLambda == null) {
        throw new RuntimeException("no enclosing method, lambda or initializer!");
      }
      if (!(enclosingMethodOrLambda.getLeaf() instanceof MethodTree
          || enclosingMethodOrLambda.getLeaf() instanceof LambdaExpressionTree)) {
        throw new RuntimeException(
            "return statement outside of a method or lambda! (e.g. in an initializer block)");
      }
      Tree leaf = enclosingMethodOrLambda.getLeaf();
      Symbol.MethodSymbol methodSymbol;
      if (leaf instanceof MethodTree) {
        MethodTree enclosingMethod = (MethodTree) leaf;
        methodSymbol = ASTHelpers.getSymbol(enclosingMethod);
      } else {
        // we have a lambda
        methodSymbol =
            NullabilityUtil.getFunctionalInterfaceMethod(
                (LambdaExpressionTree) leaf, state.getTypes());
      }
      return checkReturnExpression(tree, retExpr, methodSymbol, state);
    }