remove DebuggerVisualizerCollector
Signed-off-by: Miguel Guarniz <mi9uel9@gmail.com>
This commit is contained in:
parent
52d721c3fa
commit
885b90bb34
@ -5,7 +5,6 @@ use rustc_data_structures::fx::FxHashSet;
|
|||||||
use rustc_expand::base::resolve_path;
|
use rustc_expand::base::resolve_path;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::CrateNum;
|
use rustc_hir::def_id::CrateNum;
|
||||||
use rustc_hir::itemlikevisit::ItemLikeVisitor;
|
|
||||||
use rustc_hir::{HirId, Target};
|
use rustc_hir::{HirId, Target};
|
||||||
use rustc_middle::ty::query::Providers;
|
use rustc_middle::ty::query::Providers;
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
@ -14,96 +13,71 @@ use rustc_span::{sym, DebuggerVisualizerFile, DebuggerVisualizerType};
|
|||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
struct DebuggerVisualizerCollector<'tcx> {
|
fn check_for_debugger_visualizer<'tcx>(
|
||||||
debugger_visualizers: FxHashSet<DebuggerVisualizerFile>,
|
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
}
|
hir_id: HirId,
|
||||||
|
debugger_visualizers: &mut FxHashSet<DebuggerVisualizerFile>
|
||||||
|
) {
|
||||||
|
let attrs = tcx.hir().attrs(hir_id);
|
||||||
|
for attr in attrs {
|
||||||
|
if attr.has_name(sym::debugger_visualizer) {
|
||||||
|
let list = match attr.meta_item_list() {
|
||||||
|
Some(list) => list,
|
||||||
|
_ => continue,
|
||||||
|
};
|
||||||
|
|
||||||
impl<'v, 'tcx> ItemLikeVisitor<'v> for DebuggerVisualizerCollector<'tcx> {
|
let meta_item = match list.len() {
|
||||||
fn visit_item(&mut self, item: &hir::Item<'_>) {
|
1 => match list[0].meta_item() {
|
||||||
let target = Target::from_item(item);
|
Some(meta_item) => meta_item,
|
||||||
match target {
|
|
||||||
Target::Mod => {
|
|
||||||
self.check_for_debugger_visualizer(item.hir_id());
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_trait_item(&mut self, _: &hir::TraitItem<'_>) {}
|
|
||||||
|
|
||||||
fn visit_impl_item(&mut self, _: &hir::ImplItem<'_>) {}
|
|
||||||
|
|
||||||
fn visit_foreign_item(&mut self, _: &hir::ForeignItem<'_>) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> DebuggerVisualizerCollector<'tcx> {
|
|
||||||
fn new(tcx: TyCtxt<'tcx>) -> DebuggerVisualizerCollector<'tcx> {
|
|
||||||
DebuggerVisualizerCollector { tcx, debugger_visualizers: FxHashSet::default() }
|
|
||||||
}
|
|
||||||
|
|
||||||
fn check_for_debugger_visualizer(&mut self, hir_id: HirId) {
|
|
||||||
let attrs = self.tcx.hir().attrs(hir_id);
|
|
||||||
for attr in attrs {
|
|
||||||
if attr.has_name(sym::debugger_visualizer) {
|
|
||||||
let list = match attr.meta_item_list() {
|
|
||||||
Some(list) => list,
|
|
||||||
_ => continue,
|
_ => continue,
|
||||||
};
|
},
|
||||||
|
_ => continue,
|
||||||
|
};
|
||||||
|
|
||||||
let meta_item = match list.len() {
|
let file = match (meta_item.name_or_empty(), meta_item.value_str()) {
|
||||||
1 => match list[0].meta_item() {
|
(sym::natvis_file, Some(value)) => {
|
||||||
Some(meta_item) => meta_item,
|
match resolve_path(&tcx.sess.parse_sess, value.as_str(), attr.span) {
|
||||||
_ => continue,
|
Ok(file) => file,
|
||||||
},
|
Err(mut err) => {
|
||||||
_ => continue,
|
err.emit();
|
||||||
};
|
|
||||||
|
|
||||||
let file = match (meta_item.name_or_empty(), meta_item.value_str()) {
|
|
||||||
(sym::natvis_file, Some(value)) => {
|
|
||||||
match resolve_path(&self.tcx.sess.parse_sess, value.as_str(), attr.span) {
|
|
||||||
Ok(file) => file,
|
|
||||||
Err(mut err) => {
|
|
||||||
err.emit();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(_, _) => continue,
|
|
||||||
};
|
|
||||||
|
|
||||||
if file.is_file() {
|
|
||||||
let contents = match std::fs::read(&file) {
|
|
||||||
Ok(contents) => contents,
|
|
||||||
Err(err) => {
|
|
||||||
self.tcx
|
|
||||||
.sess
|
|
||||||
.struct_span_err(
|
|
||||||
attr.span,
|
|
||||||
&format!(
|
|
||||||
"Unable to read contents of file `{}`. {}",
|
|
||||||
file.display(),
|
|
||||||
err
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.emit();
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
self.debugger_visualizers.insert(DebuggerVisualizerFile::new(
|
|
||||||
Arc::from(contents),
|
|
||||||
DebuggerVisualizerType::Natvis,
|
|
||||||
));
|
|
||||||
} else {
|
|
||||||
self.tcx
|
|
||||||
.sess
|
|
||||||
.struct_span_err(
|
|
||||||
attr.span,
|
|
||||||
&format!("{} is not a valid file", file.display()),
|
|
||||||
)
|
|
||||||
.emit();
|
|
||||||
}
|
}
|
||||||
|
(_, _) => continue,
|
||||||
|
};
|
||||||
|
|
||||||
|
if file.is_file() {
|
||||||
|
let contents = match std::fs::read(&file) {
|
||||||
|
Ok(contents) => contents,
|
||||||
|
Err(err) => {
|
||||||
|
tcx
|
||||||
|
.sess
|
||||||
|
.struct_span_err(
|
||||||
|
attr.span,
|
||||||
|
&format!(
|
||||||
|
"Unable to read contents of file `{}`. {}",
|
||||||
|
file.display(),
|
||||||
|
err
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.emit();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
debugger_visualizers.insert(DebuggerVisualizerFile::new(
|
||||||
|
Arc::from(contents),
|
||||||
|
DebuggerVisualizerType::Natvis,
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
tcx
|
||||||
|
.sess
|
||||||
|
.struct_span_err(
|
||||||
|
attr.span,
|
||||||
|
&format!("{} is not a valid file", file.display()),
|
||||||
|
)
|
||||||
|
.emit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -114,17 +88,21 @@ fn debugger_visualizers<'tcx>(tcx: TyCtxt<'tcx>, cnum: CrateNum) -> Vec<Debugger
|
|||||||
assert_eq!(cnum, LOCAL_CRATE);
|
assert_eq!(cnum, LOCAL_CRATE);
|
||||||
|
|
||||||
// Initialize the collector.
|
// Initialize the collector.
|
||||||
let mut collector = DebuggerVisualizerCollector::new(tcx);
|
let mut debugger_visualizers = FxHashSet::default();
|
||||||
|
|
||||||
// Collect debugger visualizers in this crate.
|
// Collect debugger visualizers in this crate.
|
||||||
tcx.hir().visit_all_item_likes(&mut collector);
|
for id in tcx.hir().items() {
|
||||||
|
let target = Target::from_def_kind(tcx.def_kind(id.def_id));
|
||||||
|
if let Target::Mod = target {
|
||||||
|
check_for_debugger_visualizer(tcx, id.hir_id(), &mut debugger_visualizers);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Collect debugger visualizers on the crate attributes.
|
// Collect debugger visualizers on the crate attributes.
|
||||||
collector.check_for_debugger_visualizer(CRATE_HIR_ID);
|
check_for_debugger_visualizer(tcx, CRATE_HIR_ID, &mut debugger_visualizers);
|
||||||
|
|
||||||
|
|
||||||
// Extract out the found debugger_visualizer items.
|
// Extract out the found debugger_visualizer items.
|
||||||
let DebuggerVisualizerCollector { debugger_visualizers, .. } = collector;
|
|
||||||
|
|
||||||
let mut visualizers = debugger_visualizers.into_iter().collect::<Vec<_>>();
|
let mut visualizers = debugger_visualizers.into_iter().collect::<Vec<_>>();
|
||||||
|
|
||||||
// Sort the visualizers so we always get a deterministic query result.
|
// Sort the visualizers so we always get a deterministic query result.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user