When we moved to schema-based debug configs, we've added validate_config - a trait method that is supposed to both validate the configuration and determine whether it is a launch configuration or an attach configuration. The validation bit is a bit problematic though - we received reports on Discords about scenarios not starting up properly; it turned out that Javascript's implementation was overly strict. Thus, I got rid of any code that tries to validate the config - let's let the debug adapter itself decide whether it can digest the configuration or not. validate_config is now left unimplemented for most DebugAdapter implementations (except for PHP), because all adapters use `request`: 'launch'/'attach' for that. Let's leave the trait method in place though, as nothing guarantees this to be true for all adapters. cc @Anthony-Eid Release Notes: - debugger: Improved error messages when the debug scenario is not valid. - debugger: Fixed cases where valid configs were rejected.
69 lines
1.7 KiB
Rust
69 lines
1.7 KiB
Rust
pub mod adapters;
|
|
pub mod client;
|
|
pub mod debugger_settings;
|
|
pub mod inline_value;
|
|
pub mod proto_conversions;
|
|
mod registry;
|
|
pub mod transport;
|
|
|
|
use std::net::Ipv4Addr;
|
|
|
|
pub use dap_types::*;
|
|
use debugger_settings::DebuggerSettings;
|
|
use gpui::App;
|
|
pub use registry::{DapLocator, DapRegistry};
|
|
use serde::Serialize;
|
|
use settings::Settings;
|
|
pub use task::DebugRequest;
|
|
|
|
pub type ScopeId = u64;
|
|
pub type VariableReference = u64;
|
|
pub type StackFrameId = u64;
|
|
|
|
#[cfg(any(test, feature = "test-support"))]
|
|
pub use adapters::FakeAdapter;
|
|
use task::{DebugScenario, TcpArgumentsTemplate};
|
|
|
|
pub async fn configure_tcp_connection(
|
|
tcp_connection: TcpArgumentsTemplate,
|
|
) -> anyhow::Result<(Ipv4Addr, u16, Option<u64>)> {
|
|
let host = tcp_connection.host();
|
|
let timeout = tcp_connection.timeout;
|
|
|
|
let port = if let Some(port) = tcp_connection.port {
|
|
port
|
|
} else {
|
|
transport::TcpTransport::port(&tcp_connection).await?
|
|
};
|
|
|
|
Ok((host, port, timeout))
|
|
}
|
|
|
|
#[derive(Clone, Copy, Serialize)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum TelemetrySpawnLocation {
|
|
Gutter,
|
|
ScenarioList,
|
|
Custom,
|
|
}
|
|
|
|
pub fn send_telemetry(scenario: &DebugScenario, location: TelemetrySpawnLocation, cx: &App) {
|
|
let Some(adapter) = cx.global::<DapRegistry>().adapter(&scenario.adapter) else {
|
|
return;
|
|
};
|
|
let kind = adapter
|
|
.request_kind(&scenario.config)
|
|
.ok()
|
|
.map(serde_json::to_value)
|
|
.and_then(Result::ok);
|
|
let dock = DebuggerSettings::get_global(cx).dock;
|
|
telemetry::event!(
|
|
"Debugger Session Started",
|
|
spawn_location = location,
|
|
with_build_task = scenario.build.is_some(),
|
|
kind = kind,
|
|
adapter = scenario.adapter.as_ref(),
|
|
dock_position = dock,
|
|
);
|
|
}
|