code: @SuppressWarnings("unchecked")
      <T extends JCExpression, Z extends ArgumentType<T>> void processArg(T that, Supplier<Z> argumentTypeFactory) {
          UniquePos pos = new UniquePos(that);
          Z cached = (Z)argumentTypeCache.get(pos);
          if (cached != null) {
              //dup existing speculative type
              setResult(that, cached.dup(that, env));
          } else {
              Z res = argumentTypeFactory.get();
              argumentTypeCache.put(pos, res);
              setResult(that, res);
          }
      }
docs: Process a method argument; this method allows the caller to specify a custom speculative attribution
  logic (this is used e.g. for lambdas).