Rollup merge of #107838 - estebank:terminal_hyperlinks, r=nagisa
Introduce `-Zterminal-urls` to use OSC8 for error codes Terminals supporting the OSC8 Hyperlink Extension can support inline anchors where the text is user defineable but clicking on it opens a browser to a specified URLs, just like `<a href="URL">` does in HTML. https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda
This commit is contained in:
commit
780beae7bd
16 changed files with 99 additions and 9 deletions
|
@ -23,7 +23,7 @@ use rustc_codegen_ssa::{traits::CodegenBackend, CodegenErrors, CodegenResults};
|
||||||
use rustc_data_structures::profiling::{get_resident_set_size, print_time_passes_entry};
|
use rustc_data_structures::profiling::{get_resident_set_size, print_time_passes_entry};
|
||||||
use rustc_data_structures::sync::SeqCst;
|
use rustc_data_structures::sync::SeqCst;
|
||||||
use rustc_errors::registry::{InvalidErrorCode, Registry};
|
use rustc_errors::registry::{InvalidErrorCode, Registry};
|
||||||
use rustc_errors::{ErrorGuaranteed, PResult};
|
use rustc_errors::{ErrorGuaranteed, PResult, TerminalUrl};
|
||||||
use rustc_feature::find_gated_cfg;
|
use rustc_feature::find_gated_cfg;
|
||||||
use rustc_hir::def_id::LOCAL_CRATE;
|
use rustc_hir::def_id::LOCAL_CRATE;
|
||||||
use rustc_interface::util::{self, collect_crate_types, get_codegen_backend};
|
use rustc_interface::util::{self, collect_crate_types, get_codegen_backend};
|
||||||
|
@ -1191,6 +1191,7 @@ pub fn report_ice(info: &panic::PanicInfo<'_>, bug_report_url: &str) {
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
TerminalUrl::No,
|
||||||
));
|
));
|
||||||
let handler = rustc_errors::Handler::with_emitter(true, None, emitter);
|
let handler = rustc_errors::Handler::with_emitter(true, None, emitter);
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ use crate::translation::{to_fluent_args, Translate};
|
||||||
use crate::{
|
use crate::{
|
||||||
diagnostic::DiagnosticLocation, CodeSuggestion, Diagnostic, DiagnosticId, DiagnosticMessage,
|
diagnostic::DiagnosticLocation, CodeSuggestion, Diagnostic, DiagnosticId, DiagnosticMessage,
|
||||||
FluentBundle, Handler, LazyFallbackBundle, Level, MultiSpan, SubDiagnostic,
|
FluentBundle, Handler, LazyFallbackBundle, Level, MultiSpan, SubDiagnostic,
|
||||||
SubstitutionHighlight, SuggestionStyle,
|
SubstitutionHighlight, SuggestionStyle, TerminalUrl,
|
||||||
};
|
};
|
||||||
use rustc_lint_defs::pluralize;
|
use rustc_lint_defs::pluralize;
|
||||||
|
|
||||||
|
@ -66,6 +66,7 @@ impl HumanReadableErrorType {
|
||||||
diagnostic_width: Option<usize>,
|
diagnostic_width: Option<usize>,
|
||||||
macro_backtrace: bool,
|
macro_backtrace: bool,
|
||||||
track_diagnostics: bool,
|
track_diagnostics: bool,
|
||||||
|
terminal_url: TerminalUrl,
|
||||||
) -> EmitterWriter {
|
) -> EmitterWriter {
|
||||||
let (short, color_config) = self.unzip();
|
let (short, color_config) = self.unzip();
|
||||||
let color = color_config.suggests_using_colors();
|
let color = color_config.suggests_using_colors();
|
||||||
|
@ -80,6 +81,7 @@ impl HumanReadableErrorType {
|
||||||
diagnostic_width,
|
diagnostic_width,
|
||||||
macro_backtrace,
|
macro_backtrace,
|
||||||
track_diagnostics,
|
track_diagnostics,
|
||||||
|
terminal_url,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -652,6 +654,7 @@ pub struct EmitterWriter {
|
||||||
|
|
||||||
macro_backtrace: bool,
|
macro_backtrace: bool,
|
||||||
track_diagnostics: bool,
|
track_diagnostics: bool,
|
||||||
|
terminal_url: TerminalUrl,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -672,6 +675,7 @@ impl EmitterWriter {
|
||||||
diagnostic_width: Option<usize>,
|
diagnostic_width: Option<usize>,
|
||||||
macro_backtrace: bool,
|
macro_backtrace: bool,
|
||||||
track_diagnostics: bool,
|
track_diagnostics: bool,
|
||||||
|
terminal_url: TerminalUrl,
|
||||||
) -> EmitterWriter {
|
) -> EmitterWriter {
|
||||||
let dst = Destination::from_stderr(color_config);
|
let dst = Destination::from_stderr(color_config);
|
||||||
EmitterWriter {
|
EmitterWriter {
|
||||||
|
@ -685,6 +689,7 @@ impl EmitterWriter {
|
||||||
diagnostic_width,
|
diagnostic_width,
|
||||||
macro_backtrace,
|
macro_backtrace,
|
||||||
track_diagnostics,
|
track_diagnostics,
|
||||||
|
terminal_url,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -699,6 +704,7 @@ impl EmitterWriter {
|
||||||
diagnostic_width: Option<usize>,
|
diagnostic_width: Option<usize>,
|
||||||
macro_backtrace: bool,
|
macro_backtrace: bool,
|
||||||
track_diagnostics: bool,
|
track_diagnostics: bool,
|
||||||
|
terminal_url: TerminalUrl,
|
||||||
) -> EmitterWriter {
|
) -> EmitterWriter {
|
||||||
EmitterWriter {
|
EmitterWriter {
|
||||||
dst: Raw(dst, colored),
|
dst: Raw(dst, colored),
|
||||||
|
@ -711,6 +717,7 @@ impl EmitterWriter {
|
||||||
diagnostic_width,
|
diagnostic_width,
|
||||||
macro_backtrace,
|
macro_backtrace,
|
||||||
track_diagnostics,
|
track_diagnostics,
|
||||||
|
terminal_url,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1378,7 +1385,13 @@ impl EmitterWriter {
|
||||||
// only render error codes, not lint codes
|
// only render error codes, not lint codes
|
||||||
if let Some(DiagnosticId::Error(ref code)) = *code {
|
if let Some(DiagnosticId::Error(ref code)) = *code {
|
||||||
buffer.append(0, "[", Style::Level(*level));
|
buffer.append(0, "[", Style::Level(*level));
|
||||||
buffer.append(0, code, Style::Level(*level));
|
let code = if let TerminalUrl::Yes = self.terminal_url {
|
||||||
|
let path = "https://doc.rust-lang.org/error_codes";
|
||||||
|
format!("\x1b]8;;{path}/{code}.html\x07{code}\x1b]8;;\x07")
|
||||||
|
} else {
|
||||||
|
code.clone()
|
||||||
|
};
|
||||||
|
buffer.append(0, &code, Style::Level(*level));
|
||||||
buffer.append(0, "]", Style::Level(*level));
|
buffer.append(0, "]", Style::Level(*level));
|
||||||
label_width += 2 + code.len();
|
label_width += 2 + code.len();
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ use crate::translation::{to_fluent_args, Translate};
|
||||||
use crate::DiagnosticId;
|
use crate::DiagnosticId;
|
||||||
use crate::{
|
use crate::{
|
||||||
CodeSuggestion, FluentBundle, LazyFallbackBundle, MultiSpan, SpanLabel, SubDiagnostic,
|
CodeSuggestion, FluentBundle, LazyFallbackBundle, MultiSpan, SpanLabel, SubDiagnostic,
|
||||||
|
TerminalUrl,
|
||||||
};
|
};
|
||||||
use rustc_lint_defs::Applicability;
|
use rustc_lint_defs::Applicability;
|
||||||
|
|
||||||
|
@ -47,6 +48,7 @@ pub struct JsonEmitter {
|
||||||
diagnostic_width: Option<usize>,
|
diagnostic_width: Option<usize>,
|
||||||
macro_backtrace: bool,
|
macro_backtrace: bool,
|
||||||
track_diagnostics: bool,
|
track_diagnostics: bool,
|
||||||
|
terminal_url: TerminalUrl,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl JsonEmitter {
|
impl JsonEmitter {
|
||||||
|
@ -60,6 +62,7 @@ impl JsonEmitter {
|
||||||
diagnostic_width: Option<usize>,
|
diagnostic_width: Option<usize>,
|
||||||
macro_backtrace: bool,
|
macro_backtrace: bool,
|
||||||
track_diagnostics: bool,
|
track_diagnostics: bool,
|
||||||
|
terminal_url: TerminalUrl,
|
||||||
) -> JsonEmitter {
|
) -> JsonEmitter {
|
||||||
JsonEmitter {
|
JsonEmitter {
|
||||||
dst: Box::new(io::BufWriter::new(io::stderr())),
|
dst: Box::new(io::BufWriter::new(io::stderr())),
|
||||||
|
@ -73,6 +76,7 @@ impl JsonEmitter {
|
||||||
diagnostic_width,
|
diagnostic_width,
|
||||||
macro_backtrace,
|
macro_backtrace,
|
||||||
track_diagnostics,
|
track_diagnostics,
|
||||||
|
terminal_url,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,6 +88,7 @@ impl JsonEmitter {
|
||||||
diagnostic_width: Option<usize>,
|
diagnostic_width: Option<usize>,
|
||||||
macro_backtrace: bool,
|
macro_backtrace: bool,
|
||||||
track_diagnostics: bool,
|
track_diagnostics: bool,
|
||||||
|
terminal_url: TerminalUrl,
|
||||||
) -> JsonEmitter {
|
) -> JsonEmitter {
|
||||||
let file_path_mapping = FilePathMapping::empty();
|
let file_path_mapping = FilePathMapping::empty();
|
||||||
JsonEmitter::stderr(
|
JsonEmitter::stderr(
|
||||||
|
@ -96,6 +101,7 @@ impl JsonEmitter {
|
||||||
diagnostic_width,
|
diagnostic_width,
|
||||||
macro_backtrace,
|
macro_backtrace,
|
||||||
track_diagnostics,
|
track_diagnostics,
|
||||||
|
terminal_url,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,6 +116,7 @@ impl JsonEmitter {
|
||||||
diagnostic_width: Option<usize>,
|
diagnostic_width: Option<usize>,
|
||||||
macro_backtrace: bool,
|
macro_backtrace: bool,
|
||||||
track_diagnostics: bool,
|
track_diagnostics: bool,
|
||||||
|
terminal_url: TerminalUrl,
|
||||||
) -> JsonEmitter {
|
) -> JsonEmitter {
|
||||||
JsonEmitter {
|
JsonEmitter {
|
||||||
dst,
|
dst,
|
||||||
|
@ -123,6 +130,7 @@ impl JsonEmitter {
|
||||||
diagnostic_width,
|
diagnostic_width,
|
||||||
macro_backtrace,
|
macro_backtrace,
|
||||||
track_diagnostics,
|
track_diagnostics,
|
||||||
|
terminal_url,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -360,6 +368,7 @@ impl Diagnostic {
|
||||||
je.diagnostic_width,
|
je.diagnostic_width,
|
||||||
je.macro_backtrace,
|
je.macro_backtrace,
|
||||||
je.track_diagnostics,
|
je.track_diagnostics,
|
||||||
|
je.terminal_url,
|
||||||
)
|
)
|
||||||
.ui_testing(je.ui_testing)
|
.ui_testing(je.ui_testing)
|
||||||
.emit_diagnostic(diag);
|
.emit_diagnostic(diag);
|
||||||
|
|
|
@ -4,7 +4,7 @@ use crate::json::JsonEmitter;
|
||||||
use rustc_span::source_map::{FilePathMapping, SourceMap};
|
use rustc_span::source_map::{FilePathMapping, SourceMap};
|
||||||
|
|
||||||
use crate::emitter::{ColorConfig, HumanReadableErrorType};
|
use crate::emitter::{ColorConfig, HumanReadableErrorType};
|
||||||
use crate::Handler;
|
use crate::{Handler, TerminalUrl};
|
||||||
use rustc_span::{BytePos, Span};
|
use rustc_span::{BytePos, Span};
|
||||||
|
|
||||||
use std::str;
|
use std::str;
|
||||||
|
@ -60,6 +60,7 @@ fn test_positions(code: &str, span: (u32, u32), expected_output: SpanTestData) {
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
TerminalUrl::No,
|
||||||
);
|
);
|
||||||
|
|
||||||
let span = Span::with_root_ctxt(BytePos(span.0), BytePos(span.1));
|
let span = Span::with_root_ctxt(BytePos(span.0), BytePos(span.1));
|
||||||
|
|
|
@ -573,6 +573,7 @@ impl Handler {
|
||||||
None,
|
None,
|
||||||
flags.macro_backtrace,
|
flags.macro_backtrace,
|
||||||
flags.track_diagnostics,
|
flags.track_diagnostics,
|
||||||
|
TerminalUrl::No,
|
||||||
));
|
));
|
||||||
Self::with_emitter_and_flags(emitter, flags)
|
Self::with_emitter_and_flags(emitter, flags)
|
||||||
}
|
}
|
||||||
|
@ -1838,6 +1839,13 @@ pub fn add_elided_lifetime_in_path_suggestion(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, PartialEq, Hash, Debug)]
|
||||||
|
pub enum TerminalUrl {
|
||||||
|
No,
|
||||||
|
Yes,
|
||||||
|
Auto,
|
||||||
|
}
|
||||||
|
|
||||||
/// Useful type to use with `Result<>` indicate that an error has already
|
/// Useful type to use with `Result<>` indicate that an error has already
|
||||||
/// been reported to the user, so no need to continue checking.
|
/// been reported to the user, so no need to continue checking.
|
||||||
#[derive(Clone, Copy, Debug, Encodable, Decodable, Hash, PartialEq, Eq, PartialOrd, Ord)]
|
#[derive(Clone, Copy, Debug, Encodable, Decodable, Hash, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
|
|
@ -8,7 +8,7 @@ use rustc_span::{BytePos, Span};
|
||||||
|
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
use rustc_errors::emitter::EmitterWriter;
|
use rustc_errors::emitter::EmitterWriter;
|
||||||
use rustc_errors::{Handler, MultiSpan, PResult};
|
use rustc_errors::{Handler, MultiSpan, PResult, TerminalUrl};
|
||||||
|
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
|
@ -152,6 +152,7 @@ fn test_harness(file_text: &str, span_labels: Vec<SpanLabel>, expected_output: &
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
TerminalUrl::No,
|
||||||
);
|
);
|
||||||
let handler = Handler::with_emitter(true, None, Box::new(emitter));
|
let handler = Handler::with_emitter(true, None, Box::new(emitter));
|
||||||
#[allow(rustc::untranslatable_diagnostic)]
|
#[allow(rustc::untranslatable_diagnostic)]
|
||||||
|
|
|
@ -4,7 +4,7 @@ use crate::early_error;
|
||||||
use crate::lint;
|
use crate::lint;
|
||||||
use crate::search_paths::SearchPath;
|
use crate::search_paths::SearchPath;
|
||||||
use crate::utils::NativeLib;
|
use crate::utils::NativeLib;
|
||||||
use rustc_errors::LanguageIdentifier;
|
use rustc_errors::{LanguageIdentifier, TerminalUrl};
|
||||||
use rustc_target::spec::{CodeModel, LinkerFlavorCli, MergeFunctions, PanicStrategy, SanitizerSet};
|
use rustc_target::spec::{CodeModel, LinkerFlavorCli, MergeFunctions, PanicStrategy, SanitizerSet};
|
||||||
use rustc_target::spec::{
|
use rustc_target::spec::{
|
||||||
RelocModel, RelroLevel, SplitDebuginfo, StackProtector, TargetTriple, TlsModel,
|
RelocModel, RelroLevel, SplitDebuginfo, StackProtector, TargetTriple, TlsModel,
|
||||||
|
@ -402,6 +402,8 @@ mod desc {
|
||||||
pub const parse_code_model: &str = "one of supported code models (`rustc --print code-models`)";
|
pub const parse_code_model: &str = "one of supported code models (`rustc --print code-models`)";
|
||||||
pub const parse_tls_model: &str = "one of supported TLS models (`rustc --print tls-models`)";
|
pub const parse_tls_model: &str = "one of supported TLS models (`rustc --print tls-models`)";
|
||||||
pub const parse_target_feature: &str = parse_string;
|
pub const parse_target_feature: &str = parse_string;
|
||||||
|
pub const parse_terminal_url: &str =
|
||||||
|
"either a boolean (`yes`, `no`, `on`, `off`, etc), or `auto`";
|
||||||
pub const parse_wasi_exec_model: &str = "either `command` or `reactor`";
|
pub const parse_wasi_exec_model: &str = "either `command` or `reactor`";
|
||||||
pub const parse_split_debuginfo: &str =
|
pub const parse_split_debuginfo: &str =
|
||||||
"one of supported split-debuginfo modes (`off`, `packed`, or `unpacked`)";
|
"one of supported split-debuginfo modes (`off`, `packed`, or `unpacked`)";
|
||||||
|
@ -1044,6 +1046,16 @@ mod parse {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn parse_terminal_url(slot: &mut TerminalUrl, v: Option<&str>) -> bool {
|
||||||
|
*slot = match v {
|
||||||
|
Some("on" | "" | "yes" | "y") | None => TerminalUrl::Yes,
|
||||||
|
Some("off" | "no" | "n") => TerminalUrl::No,
|
||||||
|
Some("auto") => TerminalUrl::Auto,
|
||||||
|
_ => return false,
|
||||||
|
};
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn parse_symbol_mangling_version(
|
pub(crate) fn parse_symbol_mangling_version(
|
||||||
slot: &mut Option<SymbolManglingVersion>,
|
slot: &mut Option<SymbolManglingVersion>,
|
||||||
v: Option<&str>,
|
v: Option<&str>,
|
||||||
|
@ -1675,6 +1687,8 @@ options! {
|
||||||
"show extended diagnostic help (default: no)"),
|
"show extended diagnostic help (default: no)"),
|
||||||
temps_dir: Option<String> = (None, parse_opt_string, [UNTRACKED],
|
temps_dir: Option<String> = (None, parse_opt_string, [UNTRACKED],
|
||||||
"the directory the intermediate files are written to"),
|
"the directory the intermediate files are written to"),
|
||||||
|
terminal_urls: TerminalUrl = (TerminalUrl::No, parse_terminal_url, [UNTRACKED],
|
||||||
|
"use the OSC 8 hyperlink terminal specification to print hyperlinks in the compiler output"),
|
||||||
#[rustc_lint_opt_deny_field_access("use `Session::lto` instead of this field")]
|
#[rustc_lint_opt_deny_field_access("use `Session::lto` instead of this field")]
|
||||||
thinlto: Option<bool> = (None, parse_opt_bool, [TRACKED],
|
thinlto: Option<bool> = (None, parse_opt_bool, [TRACKED],
|
||||||
"enable ThinLTO when possible"),
|
"enable ThinLTO when possible"),
|
||||||
|
|
|
@ -24,6 +24,7 @@ use rustc_errors::registry::Registry;
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
error_code, fallback_fluent_bundle, DiagnosticBuilder, DiagnosticId, DiagnosticMessage,
|
error_code, fallback_fluent_bundle, DiagnosticBuilder, DiagnosticId, DiagnosticMessage,
|
||||||
ErrorGuaranteed, FluentBundle, IntoDiagnostic, LazyFallbackBundle, MultiSpan, Noted,
|
ErrorGuaranteed, FluentBundle, IntoDiagnostic, LazyFallbackBundle, MultiSpan, Noted,
|
||||||
|
TerminalUrl,
|
||||||
};
|
};
|
||||||
use rustc_macros::HashStable_Generic;
|
use rustc_macros::HashStable_Generic;
|
||||||
pub use rustc_span::def_id::StableCrateId;
|
pub use rustc_span::def_id::StableCrateId;
|
||||||
|
@ -1273,6 +1274,19 @@ fn default_emitter(
|
||||||
) -> Box<dyn Emitter + sync::Send> {
|
) -> Box<dyn Emitter + sync::Send> {
|
||||||
let macro_backtrace = sopts.unstable_opts.macro_backtrace;
|
let macro_backtrace = sopts.unstable_opts.macro_backtrace;
|
||||||
let track_diagnostics = sopts.unstable_opts.track_diagnostics;
|
let track_diagnostics = sopts.unstable_opts.track_diagnostics;
|
||||||
|
let terminal_url = match sopts.unstable_opts.terminal_urls {
|
||||||
|
TerminalUrl::Auto => {
|
||||||
|
match (std::env::var("COLORTERM").as_deref(), std::env::var("TERM").as_deref()) {
|
||||||
|
(Ok("truecolor"), Ok("xterm-256color"))
|
||||||
|
if sopts.unstable_features.is_nightly_build() =>
|
||||||
|
{
|
||||||
|
TerminalUrl::Yes
|
||||||
|
}
|
||||||
|
_ => TerminalUrl::No,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
t => t,
|
||||||
|
};
|
||||||
match sopts.error_format {
|
match sopts.error_format {
|
||||||
config::ErrorOutputType::HumanReadable(kind) => {
|
config::ErrorOutputType::HumanReadable(kind) => {
|
||||||
let (short, color_config) = kind.unzip();
|
let (short, color_config) = kind.unzip();
|
||||||
|
@ -1297,6 +1311,7 @@ fn default_emitter(
|
||||||
sopts.diagnostic_width,
|
sopts.diagnostic_width,
|
||||||
macro_backtrace,
|
macro_backtrace,
|
||||||
track_diagnostics,
|
track_diagnostics,
|
||||||
|
terminal_url,
|
||||||
);
|
);
|
||||||
Box::new(emitter.ui_testing(sopts.unstable_opts.ui_testing))
|
Box::new(emitter.ui_testing(sopts.unstable_opts.ui_testing))
|
||||||
}
|
}
|
||||||
|
@ -1312,6 +1327,7 @@ fn default_emitter(
|
||||||
sopts.diagnostic_width,
|
sopts.diagnostic_width,
|
||||||
macro_backtrace,
|
macro_backtrace,
|
||||||
track_diagnostics,
|
track_diagnostics,
|
||||||
|
terminal_url,
|
||||||
)
|
)
|
||||||
.ui_testing(sopts.unstable_opts.ui_testing),
|
.ui_testing(sopts.unstable_opts.ui_testing),
|
||||||
),
|
),
|
||||||
|
@ -1628,6 +1644,7 @@ fn early_error_handler(output: config::ErrorOutputType) -> rustc_errors::Handler
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
TerminalUrl::No,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
config::ErrorOutputType::Json { pretty, json_rendered } => Box::new(JsonEmitter::basic(
|
config::ErrorOutputType::Json { pretty, json_rendered } => Box::new(JsonEmitter::basic(
|
||||||
|
@ -1638,6 +1655,7 @@ fn early_error_handler(output: config::ErrorOutputType) -> rustc_errors::Handler
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
TerminalUrl::No,
|
||||||
)),
|
)),
|
||||||
};
|
};
|
||||||
rustc_errors::Handler::with_emitter(true, None, emitter)
|
rustc_errors::Handler::with_emitter(true, None, emitter)
|
||||||
|
|
|
@ -4,6 +4,7 @@ use rustc_data_structures::sync::{self, Lrc};
|
||||||
use rustc_data_structures::unord::UnordSet;
|
use rustc_data_structures::unord::UnordSet;
|
||||||
use rustc_errors::emitter::{Emitter, EmitterWriter};
|
use rustc_errors::emitter::{Emitter, EmitterWriter};
|
||||||
use rustc_errors::json::JsonEmitter;
|
use rustc_errors::json::JsonEmitter;
|
||||||
|
use rustc_errors::TerminalUrl;
|
||||||
use rustc_feature::UnstableFeatures;
|
use rustc_feature::UnstableFeatures;
|
||||||
use rustc_hir::def::Res;
|
use rustc_hir::def::Res;
|
||||||
use rustc_hir::def_id::{DefId, DefIdMap, DefIdSet, LocalDefId};
|
use rustc_hir::def_id::{DefId, DefIdMap, DefIdSet, LocalDefId};
|
||||||
|
@ -144,6 +145,7 @@ pub(crate) fn new_handler(
|
||||||
diagnostic_width,
|
diagnostic_width,
|
||||||
false,
|
false,
|
||||||
unstable_opts.track_diagnostics,
|
unstable_opts.track_diagnostics,
|
||||||
|
TerminalUrl::No,
|
||||||
)
|
)
|
||||||
.ui_testing(unstable_opts.ui_testing),
|
.ui_testing(unstable_opts.ui_testing),
|
||||||
)
|
)
|
||||||
|
@ -163,6 +165,7 @@ pub(crate) fn new_handler(
|
||||||
diagnostic_width,
|
diagnostic_width,
|
||||||
false,
|
false,
|
||||||
unstable_opts.track_diagnostics,
|
unstable_opts.track_diagnostics,
|
||||||
|
TerminalUrl::No,
|
||||||
)
|
)
|
||||||
.ui_testing(unstable_opts.ui_testing),
|
.ui_testing(unstable_opts.ui_testing),
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
use rustc_errors::{ColorConfig, ErrorGuaranteed, FatalError};
|
use rustc_errors::{ColorConfig, ErrorGuaranteed, FatalError, TerminalUrl};
|
||||||
use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID, LOCAL_CRATE};
|
use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID, LOCAL_CRATE};
|
||||||
use rustc_hir::{self as hir, intravisit, CRATE_HIR_ID};
|
use rustc_hir::{self as hir, intravisit, CRATE_HIR_ID};
|
||||||
use rustc_interface::interface;
|
use rustc_interface::interface;
|
||||||
|
@ -557,6 +557,7 @@ pub(crate) fn make_test(
|
||||||
Some(80),
|
Some(80),
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
TerminalUrl::No,
|
||||||
)
|
)
|
||||||
.supports_color();
|
.supports_color();
|
||||||
|
|
||||||
|
@ -571,6 +572,7 @@ pub(crate) fn make_test(
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
TerminalUrl::No,
|
||||||
);
|
);
|
||||||
|
|
||||||
// FIXME(misdreavus): pass `-Z treat-err-as-bug` to the doctest parser
|
// FIXME(misdreavus): pass `-Z treat-err-as-bug` to the doctest parser
|
||||||
|
@ -756,6 +758,7 @@ fn check_if_attr_is_complete(source: &str, edition: Edition) -> bool {
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
TerminalUrl::No,
|
||||||
);
|
);
|
||||||
|
|
||||||
let handler = Handler::with_emitter(false, None, Box::new(emitter));
|
let handler = Handler::with_emitter(false, None, Box::new(emitter));
|
||||||
|
|
|
@ -11,7 +11,7 @@ use rustc_ast::token::CommentKind;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
use rustc_errors::emitter::EmitterWriter;
|
use rustc_errors::emitter::EmitterWriter;
|
||||||
use rustc_errors::{Applicability, Handler, SuggestionStyle};
|
use rustc_errors::{Applicability, Handler, SuggestionStyle, TerminalUrl};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::intravisit::{self, Visitor};
|
use rustc_hir::intravisit::{self, Visitor};
|
||||||
use rustc_hir::{AnonConst, Expr};
|
use rustc_hir::{AnonConst, Expr};
|
||||||
|
@ -717,6 +717,7 @@ fn check_code(cx: &LateContext<'_>, text: &str, edition: Edition, span: Span) {
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
TerminalUrl::No,
|
||||||
);
|
);
|
||||||
let handler = Handler::with_emitter(false, None, Box::new(emitter));
|
let handler = Handler::with_emitter(false, None, Box::new(emitter));
|
||||||
let sess = ParseSess::with_span_handler(handler, sm);
|
let sess = ParseSess::with_span_handler(handler, sm);
|
||||||
|
|
|
@ -220,6 +220,7 @@ fn report_clippy_ice(info: &panic::PanicInfo<'_>, bug_report_url: &str) {
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
rustc_errors::TerminalUrl::No,
|
||||||
));
|
));
|
||||||
let handler = rustc_errors::Handler::with_emitter(true, None, emitter);
|
let handler = rustc_errors::Handler::with_emitter(true, None, emitter);
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use rustc_data_structures::sync::{Lrc, Send};
|
use rustc_data_structures::sync::{Lrc, Send};
|
||||||
use rustc_errors::emitter::{Emitter, EmitterWriter};
|
use rustc_errors::emitter::{Emitter, EmitterWriter};
|
||||||
use rustc_errors::translation::Translate;
|
use rustc_errors::translation::Translate;
|
||||||
use rustc_errors::{ColorConfig, Diagnostic, Handler, Level as DiagnosticLevel};
|
use rustc_errors::{ColorConfig, Diagnostic, Handler, Level as DiagnosticLevel, TerminalUrl};
|
||||||
use rustc_session::parse::ParseSess as RawParseSess;
|
use rustc_session::parse::ParseSess as RawParseSess;
|
||||||
use rustc_span::{
|
use rustc_span::{
|
||||||
source_map::{FilePathMapping, SourceMap},
|
source_map::{FilePathMapping, SourceMap},
|
||||||
|
@ -135,6 +135,7 @@ fn default_handler(
|
||||||
None,
|
None,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
TerminalUrl::No,
|
||||||
))
|
))
|
||||||
};
|
};
|
||||||
Handler::with_emitter(
|
Handler::with_emitter(
|
||||||
|
|
|
@ -176,6 +176,7 @@
|
||||||
-Z symbol-mangling-version=val -- which mangling version to use for symbol names ('legacy' (default) or 'v0')
|
-Z symbol-mangling-version=val -- which mangling version to use for symbol names ('legacy' (default) or 'v0')
|
||||||
-Z teach=val -- show extended diagnostic help (default: no)
|
-Z teach=val -- show extended diagnostic help (default: no)
|
||||||
-Z temps-dir=val -- the directory the intermediate files are written to
|
-Z temps-dir=val -- the directory the intermediate files are written to
|
||||||
|
-Z terminal-urls=val -- use the OSC 8 hyperlink terminal specification to print hyperlinks in the compiler output
|
||||||
-Z thinlto=val -- enable ThinLTO when possible
|
-Z thinlto=val -- enable ThinLTO when possible
|
||||||
-Z thir-unsafeck=val -- use the THIR unsafety checker (default: no)
|
-Z thir-unsafeck=val -- use the THIR unsafety checker (default: no)
|
||||||
-Z threads=val -- use a thread pool with N threads
|
-Z threads=val -- use a thread pool with N threads
|
||||||
|
|
4
tests/ui/diagnostic-flags/terminal_urls.rs
Normal file
4
tests/ui/diagnostic-flags/terminal_urls.rs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
// compile-flags: -Zterminal-urls=yes
|
||||||
|
fn main() {
|
||||||
|
let () = 4; //~ ERROR
|
||||||
|
}
|
11
tests/ui/diagnostic-flags/terminal_urls.stderr
Normal file
11
tests/ui/diagnostic-flags/terminal_urls.stderr
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
error[]8;;https://doc.rust-lang.org/error_codes/E0308.htmlE0308]8;;]: mismatched types
|
||||||
|
--> $DIR/terminal_urls.rs:3:9
|
||||||
|
|
|
||||||
|
LL | let () = 4;
|
||||||
|
| ^^ - this expression has type `{integer}`
|
||||||
|
| |
|
||||||
|
| expected integer, found `()`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
Loading…
Add table
Add a link
Reference in a new issue