docs: @Override
    public Description matchReturn(ReturnTree returnTree, VisitorState state) {
      ExpressionTree returnExpression = returnTree.getExpression();
      if (returnExpression == null || returnExpression.getKind() != Kind.NULL_LITERAL) {
        return Description.NO_MATCH;
      }
  
      TreePath path = state.getPath();
      MethodTree enclosingMethod = null;
      while (true) {
        if (path == null || path.getLeaf() instanceof LambdaExpressionTree) {
          return Description.NO_MATCH;
        } else if (path.getLeaf() instanceof MethodTree) {
          enclosingMethod = (MethodTree) path.getLeaf();
          break;
        } else {
          path = path.getParentPath();
        }
      }
      MethodSymbol enclosingMethodSym = ASTHelpers.getSymbol(enclosingMethod);
      if (enclosingMethodSym == null) {
        return Description.NO_MATCH;
      }
  
      if (!ASTHelpers.hasAnnotation(enclosingMethodSym, "dagger.Provides", state)
          || ASTHelpers.hasDirectAnnotationWithSimpleName(enclosingMethodSym, "Nullable")) {
        return Description.NO_MATCH;
      }
  
      Fix addNullableFix =
          SuggestedFix.builder()
              .prefixWith(enclosingMethod, "@Nullable\n")
              .addImport("javax.annotation.Nullable")
              .build();
  
      CatchTree enclosingCatch = ASTHelpers.findEnclosingNode(state.getPath(), CatchTree.class);
      if (enclosingCatch == null) {
        // If not in a catch block, suggest adding @Nullable first, then throwing an exception.
        Fix throwRuntimeExceptionFix =
            SuggestedFix.replace(returnTree, "throw new RuntimeException();");
        return buildDescription(returnTree)
            .addFix(addNullableFix)
            .addFix(throwRuntimeExceptionFix)
            .build();
      } else {
        // If in a catch block, suggest throwing an exception first, then adding @Nullable.
        String replacement =
            String.format("throw new RuntimeException(%s);", enclosingCatch.getParameter().getName());
        Fix throwRuntimeExceptionFix = SuggestedFix.replace(returnTree, replacement);
        return buildDescription(returnTree)
            .addFix(throwRuntimeExceptionFix)
            .addFix(addNullableFix)
            .build();
      }
    }