docs: private void generateConstraintsForWrite(
        Type lType, @Nullable Symbol decl, ExpressionTree rVal, @Nullable Tree lVal) {
      // TODO(kmb): Consider just visiting these expression types
      if (rVal.getKind() == Kind.NULL_LITERAL) {
        qualifierConstraints.putEdge(
            ProperInferenceVar.NULL, TypeArgInferenceVar.create(ImmutableList.of(), rVal));
        qualifierConstraints.putEdge(
            TypeArgInferenceVar.create(ImmutableList.of(), rVal), ProperInferenceVar.NULL);
      } else if ((rVal instanceof LiteralTree)
          || (rVal instanceof NewClassTree)
          || (rVal instanceof NewArrayTree)
          || ((rVal instanceof IdentifierTree)
              && ((IdentifierTree) rVal).getName().contentEquals("this"))) {
        qualifierConstraints.putEdge(
            ProperInferenceVar.NONNULL, TypeArgInferenceVar.create(ImmutableList.of(), rVal));
        qualifierConstraints.putEdge(
            TypeArgInferenceVar.create(ImmutableList.of(), rVal), ProperInferenceVar.NONNULL);
      }
      generateConstraintsForWrite(lType, decl, rVal, lVal, new ArrayDeque<>());
    }