================
@@ -0,0 +1,529 @@
+# FIXME: remove when LLDB_MINIMUM_PYTHON_VERSION > 3.8
+from __future__ import annotations
+
+import contextlib
+import dataclasses
+import functools
+import io
+import itertools
+import json
+import logging
+import os
+import subprocess
+import threading
+from concurrent import futures
+from concurrent.futures import Future
+from dataclasses import fields
+from pathlib import Path
+from typing import Any, Callable, Generic, Optional, Type, TypeVar
+
+from .dap_types import (
+    AnyResponse,
+    ArgsProtocol,
+    Capabilities,
+    CapabilitiesEvent,
+    ContinueArgs,
+    DAPError,
+    DisconnectArgs,
+    ErrorResponse,
+    Event,
+    ExitedEvent,
+    GotoArgs,
+    InitializeArgs,
+    InitializedEvent,
+    Message,
+    MessageType,
+    NextArgs,
+    OutputCategory,
+    OutputEvent,
+    RawMessage,
+    Request,
+    Response,
+    RestartArgs,
+    ReverseResponse,
+    RunInTerminalRequest,
+    RunInTerminalResponse,
+    StepInArgs,
+    StepOutArgs,
+    StoppedEvent,
+    TerminateArgs,
+    dict_to_message,
+)
+from .utils import (
+    DebugAdapter,
+    EventHistory,
+    MessageHandler,
+    SubProcessSpawner,
+    redirect_stream,
+)
+
+R = TypeVar("R")
+
+# Any Request that resumes execution (or terminates the session),
+# invalidates any frameId or variablesReference captured during the current 
stop.
+# Sending one of these Requests advances the session's stop_generation.
+# To prevent using a frameId or variablesReference that is no longer valid once
+# the session continues.
+_RESUMING_COMMANDS = (
+    ContinueArgs,
+    NextArgs,
+    StepInArgs,
+    StepOutArgs,
+    GotoArgs,
+    RestartArgs,
+    TerminateArgs,
+)
+
+
+class PendingResponse(Generic[AnyResponse]):
+    """A Holds the future to the expected request for the sequence id."""
+
+    def __init__(
+        self,
+        seq: int,
+        response_class: Type[AnyResponse],
+        raw_future: Future[RawMessage],
+        timeout: float,
+        command: str,
+        on_resolve: Callable[[Response], None] = lambda _: None,
+    ):
+        assert issubclass(
+            response_class, Response
+        ), f"'{response_class.__name__}' must be a subclass of Response."
+        self.seq = seq
+        self.response_class: Type[AnyResponse] = response_class
+        self._future = raw_future
+        self._timeout = timeout
+        self._command = command
+        self._on_resolve = on_resolve
+
+    def result(self, msg: Optional[str] = None) -> AnyResponse:
+        response = self.result_or_error()
+
+        if isinstance(response, self.response_class):
+            return response
+        detail = f"expected '{self.response_class.__name__}' got {response}."
+        raise DAPError(f"{msg}:\n\t{detail}" if msg else detail)
+
+    def error(self, msg: Optional[str] = None) -> ErrorResponse:
+        response = self.result_or_error()
+
+        if isinstance(response, ErrorResponse):
+            return response
+        detail = f"expected '{self.response_class.__name__}' got {response}."
----------------
DrSergei wrote:

 `detail = f"expected '{ErrorResponse.__name__}' got {response}."` ?


https://github.com/llvm/llvm-project/pull/203978
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to