squash fix render_call_locations panic when default span points at file outside of local_sources
add test against crashing with --html-after-content file correctly add --html-after-content to env not args formatting fix for rustdoc-call-locations-after-content/rmake.rs Use local crate source file as default span in `render_call_locations` - avoids unwrapping the first file added to the source map as a local file in `href_from_span` move test to tests/rustdoc-gui, rename to scrape_examples_ice test link is correct use rustdocflags, rename path in example, track lock file factor out duplicate function calls use compile-flags to make sure the after.html file is actually included in the rustdoc call fix goml go-to path increment assert-count in sidebar-source-code.goml adjust crate-search width in search-result-display.goml renamed Bar in scrape_examples_ice test make crate name shorter ..
This commit is contained in:
parent
154037ffb8
commit
f67e29e5a8
8 changed files with 73 additions and 16 deletions
|
|
@ -2812,24 +2812,46 @@ fn render_call_locations<W: fmt::Write>(
|
|||
let needs_expansion = line_max - line_min > NUM_VISIBLE_LINES;
|
||||
let locations_encoded = serde_json::to_string(&line_ranges).unwrap();
|
||||
|
||||
// Look for the example file in the source map if it exists, otherwise return a dummy span
|
||||
let file_span = (|| {
|
||||
let source_map = tcx.sess.source_map();
|
||||
let crate_src = tcx.sess.local_crate_source_file()?.into_local_path()?;
|
||||
let source_map = tcx.sess.source_map();
|
||||
let files = source_map.files();
|
||||
let local = tcx.sess.local_crate_source_file().unwrap();
|
||||
|
||||
let get_file_start_pos = || {
|
||||
let crate_src = local.clone().into_local_path()?;
|
||||
let abs_crate_src = crate_src.canonicalize().ok()?;
|
||||
let crate_root = abs_crate_src.parent()?.parent()?;
|
||||
let rel_path = path.strip_prefix(crate_root).ok()?;
|
||||
let files = source_map.files();
|
||||
let file = files.iter().find(|file| match &file.name {
|
||||
FileName::Real(RealFileName::LocalPath(other_path)) => rel_path == other_path,
|
||||
_ => false,
|
||||
})?;
|
||||
Some(rustc_span::Span::with_root_ctxt(
|
||||
file.start_pos + BytePos(byte_min),
|
||||
file.start_pos + BytePos(byte_max),
|
||||
))
|
||||
})()
|
||||
.unwrap_or(DUMMY_SP);
|
||||
files
|
||||
.iter()
|
||||
.find(|file| match &file.name {
|
||||
FileName::Real(RealFileName::LocalPath(other_path)) => rel_path == other_path,
|
||||
_ => false,
|
||||
})
|
||||
.map(|file| file.start_pos)
|
||||
};
|
||||
|
||||
// Look for the example file in the source map if it exists, otherwise
|
||||
// return a span to the local crate's source file
|
||||
let Some(file_span) = get_file_start_pos()
|
||||
.or_else(|| {
|
||||
files
|
||||
.iter()
|
||||
.find(|file| match &file.name {
|
||||
FileName::Real(file_name) => file_name == &local,
|
||||
_ => false,
|
||||
})
|
||||
.map(|file| file.start_pos)
|
||||
})
|
||||
.map(|start_pos| {
|
||||
rustc_span::Span::with_root_ctxt(
|
||||
start_pos + BytePos(byte_min),
|
||||
start_pos + BytePos(byte_max),
|
||||
)
|
||||
})
|
||||
else {
|
||||
// if the fallback span can't be built, don't render the code for this example
|
||||
return false;
|
||||
};
|
||||
|
||||
let mut decoration_info = FxIndexMap::default();
|
||||
decoration_info.insert("highlight focus", vec![byte_ranges.remove(0)]);
|
||||
|
|
|
|||
6
tests/rustdoc-gui/scrape-examples-ice-links.goml
Normal file
6
tests/rustdoc-gui/scrape-examples-ice-links.goml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
// Check that the line number column has the correct layout.
|
||||
go-to: "file://" + |DOC_PATH| + "/scrape_ice/struct.ObscurelyNamedType1.html"
|
||||
wait-for: ".scraped-example-title"
|
||||
assert-attribute: (".scraped-example-title a", {"href": "../src/bar/bar.rs.html#2"})
|
||||
click: ".scraped-example-title a"
|
||||
wait-for-property: ("h1", {"innerText": "bar/\nbar.rs"})
|
||||
|
|
@ -71,7 +71,7 @@ assert: "//*[@class='dir-entry' and @open]/*[normalize-space()='sub_mod']"
|
|||
// Only "another_folder" should be "open" in "lib2".
|
||||
assert: "//*[@class='dir-entry' and not(@open)]/*[normalize-space()='another_mod']"
|
||||
// All other trees should be collapsed.
|
||||
assert-count: ("//*[@id='src-sidebar']/details[not(normalize-space()='lib2') and not(@open)]", 12)
|
||||
assert-count: ("//*[@id='src-sidebar']/details[not(normalize-space()='lib2') and not(@open)]", 13)
|
||||
|
||||
// We now switch to mobile mode.
|
||||
set-window-size: (600, 600)
|
||||
|
|
|
|||
7
tests/rustdoc-gui/src/scrape_examples_ice/Cargo.lock
Normal file
7
tests/rustdoc-gui/src/scrape_examples_ice/Cargo.lock
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "scrape_ice"
|
||||
version = "0.1.0"
|
||||
9
tests/rustdoc-gui/src/scrape_examples_ice/Cargo.toml
Normal file
9
tests/rustdoc-gui/src/scrape_examples_ice/Cargo.toml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "scrape_ice"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[[example]]
|
||||
name = "bar"
|
||||
path = "examples/bar.rs"
|
||||
doc-scrape-examples = true
|
||||
1
tests/rustdoc-gui/src/scrape_examples_ice/empty.html
Normal file
1
tests/rustdoc-gui/src/scrape_examples_ice/empty.html
Normal file
|
|
@ -0,0 +1 @@
|
|||
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
fn main() {
|
||||
let mut bar = scrape_ice::ObscurelyNamedType1::new();
|
||||
}
|
||||
9
tests/rustdoc-gui/src/scrape_examples_ice/src/lib.rs
Normal file
9
tests/rustdoc-gui/src/scrape_examples_ice/src/lib.rs
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
//@ run-flags:-Zrustdoc-scrape-examples
|
||||
//@ compile-flags: --html-after-content empty.html
|
||||
pub struct ObscurelyNamedType1;
|
||||
|
||||
impl ObscurelyNamedType1 {
|
||||
pub fn new() -> Self {
|
||||
ObscurelyNamedType1
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue