Browse Source

Implement DAP "source" request

This implements the DAP "source" request.  I renamed the
"loadedSources" function from "sources" to "loaded_sources" to avoid
any confusion.  I also moved the loadedSources test to the new
sources.exp.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30691
gdb-14-branch
Tom Tromey 3 years ago
parent
commit
13bd1a9175
  1. 24
      gdb/python/lib/gdb/dap/sources.py
  2. 3
      gdb/testsuite/gdb.dap/basic-dap.exp
  3. 22
      gdb/testsuite/gdb.dap/sources.c
  4. 52
      gdb/testsuite/gdb.dap/sources.exp

24
gdb/python/lib/gdb/dap/sources.py

@ -82,5 +82,27 @@ def _sources():
@request("loadedSources")
@capability("supportsLoadedSourcesRequest")
def sources(**extra):
def loaded_sources(**extra):
return send_gdb_with_response(_sources)
# This helper is needed because we must only access the globals here
# from the gdb thread.
@in_gdb_thread
def _get_source(source):
filename = decode_source(source)
with open(filename) as f:
content = f.read()
return {
"content": content,
}
@request("source")
def source(*, source=None, sourceReference: int, **extra):
# The 'sourceReference' parameter is required by the spec, but is
# for backward compatibility, which I take to mean that the
# 'source' is preferred.
if source is None:
source = {"sourceReference": sourceReference}
return send_gdb_with_response(lambda: _get_source(source))

3
gdb/testsuite/gdb.dap/basic-dap.exp

@ -207,7 +207,4 @@ set obj [dap_check_request_and_response "command repl" \
set response [lindex $obj 0]
gdb_assert {[dict get $response body result] == 23}
set obj [dap_check_request_and_response sources loadedSources]
gdb_assert {[string first basic-dap.c $obj] != -1}
dap_shutdown

22
gdb/testsuite/gdb.dap/sources.c

@ -0,0 +1,22 @@
/* Copyright 2023 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
int
main ()
{
/* Distinguishing comment. */
}

52
gdb/testsuite/gdb.dap/sources.exp

@ -0,0 +1,52 @@
# Copyright 2023 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Test 'sources' and 'loadedSources'.
require allow_dap_tests
load_lib dap-support.exp
standard_testfile
if {[build_executable ${testfile}.exp $testfile] == -1} {
return
}
if {[dap_launch $testfile stop_at_main 1] == ""} {
return
}
set obj [dap_check_request_and_response loadedSources loadedSources]
set ref 0
foreach src [dict get [lindex $obj 0] body sources] {
if {[file tail [dict get $src name]] == "sources.c"} {
set ref [dict get $src sourceReference]
}
}
if {$ref == 0} {
fail "sources.c in loadedSources"
} else {
pass "sources.c in loadedSources"
set obj [dap_check_request_and_response "get source" source \
[format {o sourceReference [i %d]} $ref]]
set text [dict get [lindex $obj 0] body content]
gdb_assert {[string first "Distinguishing comment" $text] != -1}
}
dap_shutdown
Loading…
Cancel
Save