Skip to content

Commit 3566ea8

Browse files
factor out rustdoc's error message handler
1 parent 7bfa20b commit 3566ea8

File tree

1 file changed

+53
-32
lines changed

1 file changed

+53
-32
lines changed

src/librustdoc/core.rs

+53-32
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,57 @@ impl DocAccessLevels for AccessLevels<DefId> {
117117
}
118118
}
119119

120+
/// Creates a new diagnostic `Handler` that can be used to emit warnings and errors.
121+
///
122+
/// If the given `error_format` is `ErrorOutputType::Json` and no `CodeMap` is given, a new one
123+
/// will be created for the handler.
124+
pub fn new_handler(error_format: ErrorOutputType, codemap: Option<Lrc<codemap::CodeMap>>)
125+
-> errors::Handler
126+
{
127+
// rustdoc doesn't override (or allow to override) anything from this that is relevant here, so
128+
// stick to the defaults
129+
let sessopts = config::basic_options();
130+
let emitter: Box<dyn Emitter + sync::Send> = match error_format {
131+
ErrorOutputType::HumanReadable(color_config) => Box::new(
132+
EmitterWriter::stderr(
133+
color_config,
134+
codemap.map(|cm| cm as _),
135+
false,
136+
sessopts.debugging_opts.teach,
137+
).ui_testing(sessopts.debugging_opts.ui_testing)
138+
),
139+
ErrorOutputType::Json(pretty) => {
140+
let codemap = codemap.unwrap_or_else(
141+
|| Lrc::new(codemap::CodeMap::new(sessopts.file_path_mapping())));
142+
Box::new(
143+
JsonEmitter::stderr(
144+
None,
145+
codemap,
146+
pretty,
147+
sessopts.debugging_opts.suggestion_applicability,
148+
).ui_testing(sessopts.debugging_opts.ui_testing)
149+
)
150+
},
151+
ErrorOutputType::Short(color_config) => Box::new(
152+
EmitterWriter::stderr(
153+
color_config,
154+
codemap.map(|cm| cm as _),
155+
true,
156+
false)
157+
),
158+
};
159+
160+
errors::Handler::with_emitter_and_flags(
161+
emitter,
162+
errors::HandlerFlags {
163+
can_emit_warnings: true,
164+
treat_err_as_bug: false,
165+
external_macro_backtrace: false,
166+
..Default::default()
167+
},
168+
)
169+
}
170+
120171
pub fn run_core(search_paths: SearchPaths,
121172
cfgs: Vec<String>,
122173
externs: config::Externs,
@@ -159,41 +210,11 @@ pub fn run_core(search_paths: SearchPaths,
159210
},
160211
error_format,
161212
edition,
162-
..config::basic_options().clone()
213+
..config::basic_options()
163214
};
164215
driver::spawn_thread_pool(sessopts, move |sessopts| {
165216
let codemap = Lrc::new(codemap::CodeMap::new(sessopts.file_path_mapping()));
166-
let emitter: Box<dyn Emitter + sync::Send> = match error_format {
167-
ErrorOutputType::HumanReadable(color_config) => Box::new(
168-
EmitterWriter::stderr(
169-
color_config,
170-
Some(codemap.clone()),
171-
false,
172-
sessopts.debugging_opts.teach,
173-
).ui_testing(sessopts.debugging_opts.ui_testing)
174-
),
175-
ErrorOutputType::Json(pretty) => Box::new(
176-
JsonEmitter::stderr(
177-
None,
178-
codemap.clone(),
179-
pretty,
180-
sessopts.debugging_opts.suggestion_applicability,
181-
).ui_testing(sessopts.debugging_opts.ui_testing)
182-
),
183-
ErrorOutputType::Short(color_config) => Box::new(
184-
EmitterWriter::stderr(color_config, Some(codemap.clone()), true, false)
185-
),
186-
};
187-
188-
let diagnostic_handler = errors::Handler::with_emitter_and_flags(
189-
emitter,
190-
errors::HandlerFlags {
191-
can_emit_warnings: true,
192-
treat_err_as_bug: false,
193-
external_macro_backtrace: false,
194-
..Default::default()
195-
},
196-
);
217+
let diagnostic_handler = new_handler(error_format, Some(codemap.clone()));
197218

198219
let mut sess = session::build_session_(
199220
sessopts, cpath, diagnostic_handler, codemap,

0 commit comments

Comments
 (0)