public CompletableFuture<Boolean> isObsolete() throws EvaluateException {
    DebuggerManagerThreadImpl.assertIsManagerThread();
    if (!getVirtualMachine().canRedefineClasses()) {
      return CompletableFuture.completedFuture(false);
    }
    checkValid();
    if (myIsObsolete != ThreeState.UNSURE) {
      return CompletableFuture.completedFuture(myIsObsolete.toBoolean());
    }
    return DebuggerUtilsAsync.method(location())
      .thenCompose(method -> {
        if (method == null) {
          myIsObsolete = ThreeState.YES;
          return CompletableFuture.completedFuture(true);
        }
        else {
          return DebuggerUtilsAsync.isObsolete(method).thenApply(res -> {
            myIsObsolete = ThreeState.fromBoolean(res);
            return res;
          });
        }
      })
      .exceptionally(throwable -> {
        Throwable exception = DebuggerUtilsAsync.unwrap(throwable);
        if (exception instanceof InternalException && ((InternalException)exception).errorCode() == JvmtiError.INVALID_METHODID) {
          myIsObsolete = ThreeState.YES;
          return true;
        }
        throw (RuntimeException)throwable;
      });
  }
public CompletableFuture<Boolean> isObsolete()