Auto merge of #100426 - matthiaskrgr:rollup-0ks4dou, r=matthiaskrgr
Rollup of 13 pull requests Successful merges: - #93896 (rustdoc: make item-infos dimmer on dark theme) - #99337 (rustdoc: simplify highlight.rs) - #99421 (add crt-static for android) - #99500 (Fix flags when using clang as linker for Fuchsia) - #99511 (make raw_eq precondition more restrictive) - #99992 (Add `x.sh` and `x.ps1` shell scripts) - #100112 (Fix test: chunks_mut_are_send_and_sync) - #100203 (provide correct size hint for unsupported platform `CommandArgs`) - #100307 (Fix #96847) - #100350 (Stringify non-shorthand visibility correctly) - #100374 (Improve crate selection on rustdoc search results page) - #100392 (Simplify visitors) - #100418 (Add stability attributes to BacktraceStatus variants) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
2ed0f29168
@ -2142,9 +2142,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.126"
|
||||
version = "0.2.129"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836"
|
||||
checksum = "64de3cc433455c14174d42e554d4027ee631c4d046d43e3ecc6efc4636cdc7a7"
|
||||
dependencies = [
|
||||
"rustc-std-workspace-core",
|
||||
]
|
||||
|
@ -2601,7 +2601,7 @@ pub struct Visibility {
|
||||
#[derive(Clone, Encodable, Decodable, Debug)]
|
||||
pub enum VisibilityKind {
|
||||
Public,
|
||||
Restricted { path: P<Path>, id: NodeId },
|
||||
Restricted { path: P<Path>, id: NodeId, shorthand: bool },
|
||||
Inherited,
|
||||
}
|
||||
|
||||
|
@ -1487,7 +1487,7 @@ pub fn noop_flat_map_stmt_kind<T: MutVisitor>(
|
||||
pub fn noop_visit_vis<T: MutVisitor>(visibility: &mut Visibility, vis: &mut T) {
|
||||
match &mut visibility.kind {
|
||||
VisibilityKind::Public | VisibilityKind::Inherited => {}
|
||||
VisibilityKind::Restricted { path, id } => {
|
||||
VisibilityKind::Restricted { path, id, shorthand: _ } => {
|
||||
vis.visit_path(path);
|
||||
vis.visit_id(id);
|
||||
}
|
||||
|
@ -168,8 +168,8 @@ pub trait Visitor<'ast>: Sized {
|
||||
fn visit_param_bound(&mut self, bounds: &'ast GenericBound, _ctxt: BoundKind) {
|
||||
walk_param_bound(self, bounds)
|
||||
}
|
||||
fn visit_poly_trait_ref(&mut self, t: &'ast PolyTraitRef, m: &'ast TraitBoundModifier) {
|
||||
walk_poly_trait_ref(self, t, m)
|
||||
fn visit_poly_trait_ref(&mut self, t: &'ast PolyTraitRef) {
|
||||
walk_poly_trait_ref(self, t)
|
||||
}
|
||||
fn visit_variant_data(&mut self, s: &'ast VariantData) {
|
||||
walk_struct_def(self, s)
|
||||
@ -177,14 +177,8 @@ pub trait Visitor<'ast>: Sized {
|
||||
fn visit_field_def(&mut self, s: &'ast FieldDef) {
|
||||
walk_field_def(self, s)
|
||||
}
|
||||
fn visit_enum_def(
|
||||
&mut self,
|
||||
enum_definition: &'ast EnumDef,
|
||||
generics: &'ast Generics,
|
||||
item_id: NodeId,
|
||||
_: Span,
|
||||
) {
|
||||
walk_enum_def(self, enum_definition, generics, item_id)
|
||||
fn visit_enum_def(&mut self, enum_definition: &'ast EnumDef) {
|
||||
walk_enum_def(self, enum_definition)
|
||||
}
|
||||
fn visit_variant(&mut self, v: &'ast Variant) {
|
||||
walk_variant(self, v)
|
||||
@ -287,11 +281,8 @@ pub fn walk_lifetime<'a, V: Visitor<'a>>(visitor: &mut V, lifetime: &'a Lifetime
|
||||
visitor.visit_ident(lifetime.ident);
|
||||
}
|
||||
|
||||
pub fn walk_poly_trait_ref<'a, V>(
|
||||
visitor: &mut V,
|
||||
trait_ref: &'a PolyTraitRef,
|
||||
_: &TraitBoundModifier,
|
||||
) where
|
||||
pub fn walk_poly_trait_ref<'a, V>(visitor: &mut V, trait_ref: &'a PolyTraitRef)
|
||||
where
|
||||
V: Visitor<'a>,
|
||||
{
|
||||
walk_list!(visitor, visit_generic_param, &trait_ref.bound_generic_params);
|
||||
@ -334,7 +325,7 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
|
||||
}
|
||||
ItemKind::Enum(ref enum_definition, ref generics) => {
|
||||
visitor.visit_generics(generics);
|
||||
visitor.visit_enum_def(enum_definition, generics, item.id, item.span)
|
||||
visitor.visit_enum_def(enum_definition)
|
||||
}
|
||||
ItemKind::Impl(box Impl {
|
||||
defaultness: _,
|
||||
@ -377,12 +368,7 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
|
||||
walk_list!(visitor, visit_attribute, &item.attrs);
|
||||
}
|
||||
|
||||
pub fn walk_enum_def<'a, V: Visitor<'a>>(
|
||||
visitor: &mut V,
|
||||
enum_definition: &'a EnumDef,
|
||||
_: &'a Generics,
|
||||
_: NodeId,
|
||||
) {
|
||||
pub fn walk_enum_def<'a, V: Visitor<'a>>(visitor: &mut V, enum_definition: &'a EnumDef) {
|
||||
walk_list!(visitor, visit_variant, &enum_definition.variants);
|
||||
}
|
||||
|
||||
@ -598,7 +584,7 @@ pub fn walk_foreign_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a ForeignI
|
||||
|
||||
pub fn walk_param_bound<'a, V: Visitor<'a>>(visitor: &mut V, bound: &'a GenericBound) {
|
||||
match *bound {
|
||||
GenericBound::Trait(ref typ, ref modifier) => visitor.visit_poly_trait_ref(typ, modifier),
|
||||
GenericBound::Trait(ref typ, ref _modifier) => visitor.visit_poly_trait_ref(typ),
|
||||
GenericBound::Outlives(ref lifetime) => {
|
||||
visitor.visit_lifetime(lifetime, LifetimeCtxt::Bound)
|
||||
}
|
||||
@ -936,7 +922,7 @@ pub fn walk_arm<'a, V: Visitor<'a>>(visitor: &mut V, arm: &'a Arm) {
|
||||
}
|
||||
|
||||
pub fn walk_vis<'a, V: Visitor<'a>>(visitor: &mut V, vis: &'a Visibility) {
|
||||
if let VisibilityKind::Restricted { ref path, id } = vis.kind {
|
||||
if let VisibilityKind::Restricted { ref path, id, shorthand: _ } = vis.kind {
|
||||
visitor.visit_path(path, id);
|
||||
}
|
||||
}
|
||||
|
@ -1536,15 +1536,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||
hir::MatchSource::ForLoopDesugar,
|
||||
));
|
||||
|
||||
let attrs: Vec<_> = e.attrs.iter().map(|a| self.lower_attr(a)).collect();
|
||||
|
||||
// This is effectively `{ let _result = ...; _result }`.
|
||||
// The construct was introduced in #21984 and is necessary to make sure that
|
||||
// temporaries in the `head` expression are dropped and do not leak to the
|
||||
// surrounding scope of the `match` since the `match` is not a terminating scope.
|
||||
//
|
||||
// Also, add the attributes to the outer returned expr node.
|
||||
self.expr_drop_temps_mut(for_span, match_expr, attrs.into())
|
||||
self.expr_drop_temps_mut(for_span, match_expr, e.attrs.clone())
|
||||
}
|
||||
|
||||
/// Desugar `ExprKind::Try` from: `<expr>?` into:
|
||||
|
@ -295,14 +295,14 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
|
||||
self.insert(lifetime.span, lifetime.hir_id, Node::Lifetime(lifetime));
|
||||
}
|
||||
|
||||
fn visit_variant(&mut self, v: &'hir Variant<'hir>, g: &'hir Generics<'hir>, item_id: HirId) {
|
||||
fn visit_variant(&mut self, v: &'hir Variant<'hir>) {
|
||||
self.insert(v.span, v.id, Node::Variant(v));
|
||||
self.with_parent(v.id, |this| {
|
||||
// Register the constructor of this variant.
|
||||
if let Some(ctor_hir_id) = v.data.ctor_hir_id() {
|
||||
this.insert(v.span, ctor_hir_id, Node::Ctor(&v.data));
|
||||
}
|
||||
intravisit::walk_variant(this, v, g, item_id);
|
||||
intravisit::walk_variant(this, v);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,6 @@
|
||||
use super::ResolverAstLoweringExt;
|
||||
use rustc_ast::visit::{self, BoundKind, LifetimeCtxt, Visitor};
|
||||
use rustc_ast::{
|
||||
FnRetTy, GenericBounds, Lifetime, NodeId, PathSegment, PolyTraitRef, TraitBoundModifier, Ty,
|
||||
TyKind,
|
||||
};
|
||||
use rustc_ast::{FnRetTy, GenericBounds, Lifetime, NodeId, PathSegment, PolyTraitRef, Ty, TyKind};
|
||||
use rustc_hir::def::LifetimeRes;
|
||||
use rustc_middle::span_bug;
|
||||
use rustc_middle::ty::ResolverAstLowering;
|
||||
@ -71,10 +68,10 @@ impl<'ast> Visitor<'ast> for LifetimeCollectVisitor<'ast> {
|
||||
visit::walk_path_segment(self, path_span, path_segment);
|
||||
}
|
||||
|
||||
fn visit_poly_trait_ref(&mut self, t: &'ast PolyTraitRef, m: &'ast TraitBoundModifier) {
|
||||
fn visit_poly_trait_ref(&mut self, t: &'ast PolyTraitRef) {
|
||||
self.current_binders.push(t.trait_ref.ref_id);
|
||||
|
||||
visit::walk_poly_trait_ref(self, t, m);
|
||||
visit::walk_poly_trait_ref(self, t);
|
||||
|
||||
self.current_binders.pop();
|
||||
}
|
||||
|
@ -1536,25 +1536,17 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||
visit::walk_param_bound(self, bound)
|
||||
}
|
||||
|
||||
fn visit_poly_trait_ref(&mut self, t: &'a PolyTraitRef, m: &'a TraitBoundModifier) {
|
||||
fn visit_poly_trait_ref(&mut self, t: &'a PolyTraitRef) {
|
||||
self.check_late_bound_lifetime_defs(&t.bound_generic_params);
|
||||
visit::walk_poly_trait_ref(self, t, m);
|
||||
visit::walk_poly_trait_ref(self, t);
|
||||
}
|
||||
|
||||
fn visit_variant_data(&mut self, s: &'a VariantData) {
|
||||
self.with_banned_assoc_ty_bound(|this| visit::walk_struct_def(this, s))
|
||||
}
|
||||
|
||||
fn visit_enum_def(
|
||||
&mut self,
|
||||
enum_definition: &'a EnumDef,
|
||||
generics: &'a Generics,
|
||||
item_id: NodeId,
|
||||
_: Span,
|
||||
) {
|
||||
self.with_banned_assoc_ty_bound(|this| {
|
||||
visit::walk_enum_def(this, enum_definition, generics, item_id)
|
||||
})
|
||||
fn visit_enum_def(&mut self, enum_definition: &'a EnumDef) {
|
||||
self.with_banned_assoc_ty_bound(|this| visit::walk_enum_def(this, enum_definition))
|
||||
}
|
||||
|
||||
fn visit_fn(&mut self, fk: FnKind<'a>, span: Span, id: NodeId) {
|
||||
|
@ -79,9 +79,9 @@ impl<'ast> Visitor<'ast> for NodeCounter {
|
||||
self.count += 1;
|
||||
walk_param_bound(self, bounds)
|
||||
}
|
||||
fn visit_poly_trait_ref(&mut self, t: &PolyTraitRef, m: &TraitBoundModifier) {
|
||||
fn visit_poly_trait_ref(&mut self, t: &PolyTraitRef) {
|
||||
self.count += 1;
|
||||
walk_poly_trait_ref(self, t, m)
|
||||
walk_poly_trait_ref(self, t)
|
||||
}
|
||||
fn visit_variant_data(&mut self, s: &VariantData) {
|
||||
self.count += 1;
|
||||
@ -91,15 +91,9 @@ impl<'ast> Visitor<'ast> for NodeCounter {
|
||||
self.count += 1;
|
||||
walk_field_def(self, s)
|
||||
}
|
||||
fn visit_enum_def(
|
||||
&mut self,
|
||||
enum_definition: &EnumDef,
|
||||
generics: &Generics,
|
||||
item_id: NodeId,
|
||||
_: Span,
|
||||
) {
|
||||
fn visit_enum_def(&mut self, enum_definition: &EnumDef) {
|
||||
self.count += 1;
|
||||
walk_enum_def(self, enum_definition, generics, item_id)
|
||||
walk_enum_def(self, enum_definition)
|
||||
}
|
||||
fn visit_variant(&mut self, v: &Variant) {
|
||||
self.count += 1;
|
||||
|
@ -412,9 +412,9 @@ impl<'a> State<'a> {
|
||||
pub(crate) fn print_visibility(&mut self, vis: &ast::Visibility) {
|
||||
match vis.kind {
|
||||
ast::VisibilityKind::Public => self.word_nbsp("pub"),
|
||||
ast::VisibilityKind::Restricted { ref path, .. } => {
|
||||
ast::VisibilityKind::Restricted { ref path, id: _, shorthand } => {
|
||||
let path = Self::to_string(|s| s.print_path(path, false, 0));
|
||||
if path == "crate" || path == "self" || path == "super" {
|
||||
if shorthand && (path == "crate" || path == "self" || path == "super") {
|
||||
self.word_nbsp(format!("pub({})", path))
|
||||
} else {
|
||||
self.word_nbsp(format!("pub(in {})", path))
|
||||
|
@ -383,16 +383,12 @@ fn find_type_parameters(
|
||||
}
|
||||
|
||||
// Place bound generic params on a stack, to extract them when a type is encountered.
|
||||
fn visit_poly_trait_ref(
|
||||
&mut self,
|
||||
trait_ref: &'a ast::PolyTraitRef,
|
||||
modifier: &'a ast::TraitBoundModifier,
|
||||
) {
|
||||
fn visit_poly_trait_ref(&mut self, trait_ref: &'a ast::PolyTraitRef) {
|
||||
let stack_len = self.bound_generic_params_stack.len();
|
||||
self.bound_generic_params_stack
|
||||
.extend(trait_ref.bound_generic_params.clone().into_iter());
|
||||
|
||||
visit::walk_poly_trait_ref(self, trait_ref, modifier);
|
||||
visit::walk_poly_trait_ref(self, trait_ref);
|
||||
|
||||
self.bound_generic_params_stack.truncate(stack_len);
|
||||
}
|
||||
|
@ -1583,12 +1583,21 @@ fn crt_objects_fallback(sess: &Session, crate_type: CrateType) -> bool {
|
||||
fn add_pre_link_objects(
|
||||
cmd: &mut dyn Linker,
|
||||
sess: &Session,
|
||||
flavor: LinkerFlavor,
|
||||
link_output_kind: LinkOutputKind,
|
||||
self_contained: bool,
|
||||
) {
|
||||
// FIXME: we are currently missing some infra here (per-linker-flavor CRT objects),
|
||||
// so Fuchsia has to be special-cased.
|
||||
let opts = &sess.target;
|
||||
let objects =
|
||||
if self_contained { &opts.pre_link_objects_fallback } else { &opts.pre_link_objects };
|
||||
let empty = Default::default();
|
||||
let objects = if self_contained {
|
||||
&opts.pre_link_objects_fallback
|
||||
} else if !(sess.target.os == "fuchsia" && flavor == LinkerFlavor::Gcc) {
|
||||
&opts.pre_link_objects
|
||||
} else {
|
||||
&empty
|
||||
};
|
||||
for obj in objects.get(&link_output_kind).iter().copied().flatten() {
|
||||
cmd.add_object(&get_object_file_path(sess, obj, self_contained));
|
||||
}
|
||||
@ -1914,7 +1923,7 @@ fn linker_with_args<'a>(
|
||||
// ------------ Object code and libraries, order-dependent ------------
|
||||
|
||||
// Pre-link CRT objects.
|
||||
add_pre_link_objects(cmd, sess, link_output_kind, crt_objects_fallback);
|
||||
add_pre_link_objects(cmd, sess, flavor, link_output_kind, crt_objects_fallback);
|
||||
|
||||
add_linked_symbol_object(
|
||||
cmd,
|
||||
@ -2070,7 +2079,10 @@ fn add_order_independent_options(
|
||||
|
||||
add_link_script(cmd, sess, tmpdir, crate_type);
|
||||
|
||||
if sess.target.os == "fuchsia" && crate_type == CrateType::Executable {
|
||||
if sess.target.os == "fuchsia"
|
||||
&& crate_type == CrateType::Executable
|
||||
&& flavor != LinkerFlavor::Gcc
|
||||
{
|
||||
let prefix = if sess.opts.unstable_opts.sanitizer.contains(SanitizerSet::ADDRESS) {
|
||||
"asan/"
|
||||
} else {
|
||||
|
@ -385,30 +385,17 @@ pub trait Visitor<'v>: Sized {
|
||||
fn visit_poly_trait_ref(&mut self, t: &'v PolyTraitRef<'v>, m: TraitBoundModifier) {
|
||||
walk_poly_trait_ref(self, t, m)
|
||||
}
|
||||
fn visit_variant_data(
|
||||
&mut self,
|
||||
s: &'v VariantData<'v>,
|
||||
_: Symbol,
|
||||
_: &'v Generics<'v>,
|
||||
_parent_id: HirId,
|
||||
_: Span,
|
||||
) {
|
||||
fn visit_variant_data(&mut self, s: &'v VariantData<'v>) {
|
||||
walk_struct_def(self, s)
|
||||
}
|
||||
fn visit_field_def(&mut self, s: &'v FieldDef<'v>) {
|
||||
walk_field_def(self, s)
|
||||
}
|
||||
fn visit_enum_def(
|
||||
&mut self,
|
||||
enum_definition: &'v EnumDef<'v>,
|
||||
generics: &'v Generics<'v>,
|
||||
item_id: HirId,
|
||||
_: Span,
|
||||
) {
|
||||
walk_enum_def(self, enum_definition, generics, item_id)
|
||||
fn visit_enum_def(&mut self, enum_definition: &'v EnumDef<'v>, item_id: HirId) {
|
||||
walk_enum_def(self, enum_definition, item_id)
|
||||
}
|
||||
fn visit_variant(&mut self, v: &'v Variant<'v>, g: &'v Generics<'v>, item_id: HirId) {
|
||||
walk_variant(self, v, g, item_id)
|
||||
fn visit_variant(&mut self, v: &'v Variant<'v>) {
|
||||
walk_variant(self, v)
|
||||
}
|
||||
fn visit_label(&mut self, label: &'v Label) {
|
||||
walk_label(self, label)
|
||||
@ -572,7 +559,7 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) {
|
||||
ItemKind::Enum(ref enum_definition, ref generics) => {
|
||||
visitor.visit_generics(generics);
|
||||
// `visit_enum_def()` takes care of visiting the `Item`'s `HirId`.
|
||||
visitor.visit_enum_def(enum_definition, generics, item.hir_id(), item.span)
|
||||
visitor.visit_enum_def(enum_definition, item.hir_id())
|
||||
}
|
||||
ItemKind::Impl(Impl {
|
||||
unsafety: _,
|
||||
@ -595,13 +582,7 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) {
|
||||
| ItemKind::Union(ref struct_definition, ref generics) => {
|
||||
visitor.visit_generics(generics);
|
||||
visitor.visit_id(item.hir_id());
|
||||
visitor.visit_variant_data(
|
||||
struct_definition,
|
||||
item.ident.name,
|
||||
generics,
|
||||
item.hir_id(),
|
||||
item.span,
|
||||
);
|
||||
visitor.visit_variant_data(struct_definition);
|
||||
}
|
||||
ItemKind::Trait(.., ref generics, bounds, trait_item_refs) => {
|
||||
visitor.visit_id(item.hir_id());
|
||||
@ -649,28 +630,16 @@ pub fn walk_use<'v, V: Visitor<'v>>(visitor: &mut V, path: &'v Path<'v>, hir_id:
|
||||
pub fn walk_enum_def<'v, V: Visitor<'v>>(
|
||||
visitor: &mut V,
|
||||
enum_definition: &'v EnumDef<'v>,
|
||||
generics: &'v Generics<'v>,
|
||||
item_id: HirId,
|
||||
) {
|
||||
visitor.visit_id(item_id);
|
||||
walk_list!(visitor, visit_variant, enum_definition.variants, generics, item_id);
|
||||
walk_list!(visitor, visit_variant, enum_definition.variants);
|
||||
}
|
||||
|
||||
pub fn walk_variant<'v, V: Visitor<'v>>(
|
||||
visitor: &mut V,
|
||||
variant: &'v Variant<'v>,
|
||||
generics: &'v Generics<'v>,
|
||||
parent_item_id: HirId,
|
||||
) {
|
||||
pub fn walk_variant<'v, V: Visitor<'v>>(visitor: &mut V, variant: &'v Variant<'v>) {
|
||||
visitor.visit_ident(variant.ident);
|
||||
visitor.visit_id(variant.id);
|
||||
visitor.visit_variant_data(
|
||||
&variant.data,
|
||||
variant.ident.name,
|
||||
generics,
|
||||
parent_item_id,
|
||||
variant.span,
|
||||
);
|
||||
visitor.visit_variant_data(&variant.data);
|
||||
walk_list!(visitor, visit_anon_const, &variant.disr_expr);
|
||||
}
|
||||
|
||||
|
@ -233,9 +233,9 @@ impl<'a, T: EarlyLintPass> ast_visit::Visitor<'a> for EarlyContextAndPass<'a, T>
|
||||
ast_visit::walk_where_predicate(self, p);
|
||||
}
|
||||
|
||||
fn visit_poly_trait_ref(&mut self, t: &'a ast::PolyTraitRef, m: &'a ast::TraitBoundModifier) {
|
||||
run_early_pass!(self, check_poly_trait_ref, t, m);
|
||||
ast_visit::walk_poly_trait_ref(self, t, m);
|
||||
fn visit_poly_trait_ref(&mut self, t: &'a ast::PolyTraitRef) {
|
||||
run_early_pass!(self, check_poly_trait_ref, t);
|
||||
ast_visit::walk_poly_trait_ref(self, t);
|
||||
}
|
||||
|
||||
fn visit_assoc_item(&mut self, item: &'a ast::AssocItem, ctxt: ast_visit::AssocCtxt) {
|
||||
|
@ -24,7 +24,6 @@ use rustc_hir::intravisit::Visitor;
|
||||
use rustc_middle::hir::nested_filter;
|
||||
use rustc_middle::ty::{self, TyCtxt};
|
||||
use rustc_session::lint::LintPass;
|
||||
use rustc_span::symbol::Symbol;
|
||||
use rustc_span::Span;
|
||||
|
||||
use std::any::Any;
|
||||
@ -194,14 +193,7 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas
|
||||
self.context.cached_typeck_results.set(old_cached_typeck_results);
|
||||
}
|
||||
|
||||
fn visit_variant_data(
|
||||
&mut self,
|
||||
s: &'tcx hir::VariantData<'tcx>,
|
||||
_: Symbol,
|
||||
_: &'tcx hir::Generics<'tcx>,
|
||||
_: hir::HirId,
|
||||
_: Span,
|
||||
) {
|
||||
fn visit_variant_data(&mut self, s: &'tcx hir::VariantData<'tcx>) {
|
||||
lint_callback!(self, check_struct_def, s);
|
||||
hir_visit::walk_struct_def(self, s);
|
||||
}
|
||||
@ -213,15 +205,10 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas
|
||||
})
|
||||
}
|
||||
|
||||
fn visit_variant(
|
||||
&mut self,
|
||||
v: &'tcx hir::Variant<'tcx>,
|
||||
g: &'tcx hir::Generics<'tcx>,
|
||||
item_id: hir::HirId,
|
||||
) {
|
||||
fn visit_variant(&mut self, v: &'tcx hir::Variant<'tcx>) {
|
||||
self.with_lint_attrs(v.id, |cx| {
|
||||
lint_callback!(cx, check_variant, v);
|
||||
hir_visit::walk_variant(cx, v, g, item_id);
|
||||
hir_visit::walk_variant(cx, v);
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -772,14 +772,9 @@ impl<'tcx> intravisit::Visitor<'tcx> for LintLevelMapBuilder<'tcx> {
|
||||
})
|
||||
}
|
||||
|
||||
fn visit_variant(
|
||||
&mut self,
|
||||
v: &'tcx hir::Variant<'tcx>,
|
||||
g: &'tcx hir::Generics<'tcx>,
|
||||
item_id: hir::HirId,
|
||||
) {
|
||||
fn visit_variant(&mut self, v: &'tcx hir::Variant<'tcx>) {
|
||||
self.with_lint_attrs(v.id, |builder| {
|
||||
intravisit::walk_variant(builder, v, g, item_id);
|
||||
intravisit::walk_variant(builder, v);
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -156,8 +156,7 @@ macro_rules! early_lint_methods {
|
||||
fn check_generic_arg(a: &ast::GenericArg);
|
||||
fn check_generic_param(a: &ast::GenericParam);
|
||||
fn check_generics(a: &ast::Generics);
|
||||
fn check_poly_trait_ref(a: &ast::PolyTraitRef,
|
||||
b: &ast::TraitBoundModifier);
|
||||
fn check_poly_trait_ref(a: &ast::PolyTraitRef);
|
||||
fn check_fn(a: rustc_ast::visit::FnKind<'_>, c: Span, d_: ast::NodeId);
|
||||
fn check_trait_item(a: &ast::AssocItem);
|
||||
fn check_impl_item(a: &ast::AssocItem);
|
||||
|
@ -29,7 +29,6 @@ use rustc_middle::mir::visit::Visitor as _;
|
||||
use rustc_middle::mir::{traversal, Body, ConstQualifs, MirPass, MirPhase, Promoted};
|
||||
use rustc_middle::ty::query::Providers;
|
||||
use rustc_middle::ty::{self, TyCtxt, TypeVisitable};
|
||||
use rustc_span::{Span, Symbol};
|
||||
|
||||
#[macro_use]
|
||||
mod pass_manager;
|
||||
@ -159,14 +158,7 @@ fn mir_keys(tcx: TyCtxt<'_>, (): ()) -> FxIndexSet<LocalDefId> {
|
||||
set: &'a mut FxIndexSet<LocalDefId>,
|
||||
}
|
||||
impl<'tcx> Visitor<'tcx> for GatherCtors<'_, 'tcx> {
|
||||
fn visit_variant_data(
|
||||
&mut self,
|
||||
v: &'tcx hir::VariantData<'tcx>,
|
||||
_: Symbol,
|
||||
_: &'tcx hir::Generics<'tcx>,
|
||||
_: hir::HirId,
|
||||
_: Span,
|
||||
) {
|
||||
fn visit_variant_data(&mut self, v: &'tcx hir::VariantData<'tcx>) {
|
||||
if let hir::VariantData::Tuple(_, hir_id) = *v {
|
||||
self.set.insert(self.tcx.hir().local_def_id(hir_id));
|
||||
}
|
||||
|
@ -1295,7 +1295,11 @@ impl<'a> Parser<'a> {
|
||||
self.bump(); // `in`
|
||||
let path = self.parse_path(PathStyle::Mod)?; // `path`
|
||||
self.expect(&token::CloseDelim(Delimiter::Parenthesis))?; // `)`
|
||||
let vis = VisibilityKind::Restricted { path: P(path), id: ast::DUMMY_NODE_ID };
|
||||
let vis = VisibilityKind::Restricted {
|
||||
path: P(path),
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
shorthand: false,
|
||||
};
|
||||
return Ok(Visibility {
|
||||
span: lo.to(self.prev_token.span),
|
||||
kind: vis,
|
||||
@ -1308,7 +1312,11 @@ impl<'a> Parser<'a> {
|
||||
self.bump(); // `(`
|
||||
let path = self.parse_path(PathStyle::Mod)?; // `crate`/`super`/`self`
|
||||
self.expect(&token::CloseDelim(Delimiter::Parenthesis))?; // `)`
|
||||
let vis = VisibilityKind::Restricted { path: P(path), id: ast::DUMMY_NODE_ID };
|
||||
let vis = VisibilityKind::Restricted {
|
||||
path: P(path),
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
shorthand: true,
|
||||
};
|
||||
return Ok(Visibility {
|
||||
span: lo.to(self.prev_token.span),
|
||||
kind: vis,
|
||||
|
@ -2066,14 +2066,9 @@ impl<'tcx> Visitor<'tcx> for CheckAttrVisitor<'tcx> {
|
||||
intravisit::walk_expr(self, expr)
|
||||
}
|
||||
|
||||
fn visit_variant(
|
||||
&mut self,
|
||||
variant: &'tcx hir::Variant<'tcx>,
|
||||
generics: &'tcx hir::Generics<'tcx>,
|
||||
item_id: HirId,
|
||||
) {
|
||||
fn visit_variant(&mut self, variant: &'tcx hir::Variant<'tcx>) {
|
||||
self.check_attributes(variant.id, variant.span, Target::Variant, None);
|
||||
intravisit::walk_variant(self, variant, generics, item_id)
|
||||
intravisit::walk_variant(self, variant)
|
||||
}
|
||||
|
||||
fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) {
|
||||
|
@ -368,14 +368,7 @@ impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> {
|
||||
self.maybe_typeck_results = old_maybe_typeck_results;
|
||||
}
|
||||
|
||||
fn visit_variant_data(
|
||||
&mut self,
|
||||
def: &'tcx hir::VariantData<'tcx>,
|
||||
_: Symbol,
|
||||
_: &hir::Generics<'_>,
|
||||
_: hir::HirId,
|
||||
_: rustc_span::Span,
|
||||
) {
|
||||
fn visit_variant_data(&mut self, def: &'tcx hir::VariantData<'tcx>) {
|
||||
let tcx = self.tcx;
|
||||
let has_repr_c = self.repr_has_repr_c;
|
||||
let has_repr_simd = self.repr_has_repr_simd;
|
||||
|
@ -276,14 +276,9 @@ impl<'v> hir_visit::Visitor<'v> for StatCollector<'v> {
|
||||
hir_visit::walk_field_def(self, s)
|
||||
}
|
||||
|
||||
fn visit_variant(
|
||||
&mut self,
|
||||
v: &'v hir::Variant<'v>,
|
||||
g: &'v hir::Generics<'v>,
|
||||
item_id: hir::HirId,
|
||||
) {
|
||||
fn visit_variant(&mut self, v: &'v hir::Variant<'v>) {
|
||||
self.record("Variant", Id::None, v);
|
||||
hir_visit::walk_variant(self, v, g, item_id)
|
||||
hir_visit::walk_variant(self, v)
|
||||
}
|
||||
|
||||
fn visit_lifetime(&mut self, lifetime: &'v hir::Lifetime) {
|
||||
|
@ -11,7 +11,7 @@ use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
|
||||
use rustc_hir::hir_id::CRATE_HIR_ID;
|
||||
use rustc_hir::intravisit::{self, Visitor};
|
||||
use rustc_hir::{FieldDef, Generics, HirId, Item, ItemKind, TraitRef, Ty, TyKind, Variant};
|
||||
use rustc_hir::{FieldDef, Item, ItemKind, TraitRef, Ty, TyKind, Variant};
|
||||
use rustc_middle::hir::nested_filter;
|
||||
use rustc_middle::middle::privacy::AccessLevels;
|
||||
use rustc_middle::middle::stability::{AllowUnstable, DeprecationEntry, Index};
|
||||
@ -442,7 +442,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
);
|
||||
}
|
||||
|
||||
fn visit_variant(&mut self, var: &'tcx Variant<'tcx>, g: &'tcx Generics<'tcx>, item_id: HirId) {
|
||||
fn visit_variant(&mut self, var: &'tcx Variant<'tcx>) {
|
||||
self.annotate(
|
||||
self.tcx.hir().local_def_id(var.id),
|
||||
var.span,
|
||||
@ -465,7 +465,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
);
|
||||
}
|
||||
|
||||
intravisit::walk_variant(v, var, g, item_id)
|
||||
intravisit::walk_variant(v, var)
|
||||
},
|
||||
)
|
||||
}
|
||||
@ -598,9 +598,9 @@ impl<'tcx> Visitor<'tcx> for MissingStabilityAnnotations<'tcx> {
|
||||
intravisit::walk_impl_item(self, ii);
|
||||
}
|
||||
|
||||
fn visit_variant(&mut self, var: &'tcx Variant<'tcx>, g: &'tcx Generics<'tcx>, item_id: HirId) {
|
||||
fn visit_variant(&mut self, var: &'tcx Variant<'tcx>) {
|
||||
self.check_missing_stability(self.tcx.hir().local_def_id(var.id), var.span);
|
||||
intravisit::walk_variant(self, var, g, item_id);
|
||||
intravisit::walk_variant(self, var);
|
||||
}
|
||||
|
||||
fn visit_field_def(&mut self, s: &'tcx FieldDef<'tcx>) {
|
||||
|
@ -1625,15 +1625,10 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> {
|
||||
intravisit::walk_ty(self, t)
|
||||
}
|
||||
|
||||
fn visit_variant(
|
||||
&mut self,
|
||||
v: &'tcx hir::Variant<'tcx>,
|
||||
g: &'tcx hir::Generics<'tcx>,
|
||||
item_id: hir::HirId,
|
||||
) {
|
||||
fn visit_variant(&mut self, v: &'tcx hir::Variant<'tcx>) {
|
||||
if self.access_levels.is_reachable(self.tcx.hir().local_def_id(v.id)) {
|
||||
self.in_variant = true;
|
||||
intravisit::walk_variant(self, v, g, item_id);
|
||||
intravisit::walk_variant(self, v);
|
||||
self.in_variant = false;
|
||||
}
|
||||
}
|
||||
|
@ -723,7 +723,7 @@ impl<'a: 'ast, 'ast> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast> {
|
||||
self.diagnostic_metadata.current_trait_object = prev;
|
||||
self.diagnostic_metadata.current_type_path = prev_ty;
|
||||
}
|
||||
fn visit_poly_trait_ref(&mut self, tref: &'ast PolyTraitRef, _: &'ast TraitBoundModifier) {
|
||||
fn visit_poly_trait_ref(&mut self, tref: &'ast PolyTraitRef) {
|
||||
let span = tref.span.shrink_to_lo().to(tref.trait_ref.path.span.shrink_to_lo());
|
||||
self.with_generic_param_rib(
|
||||
&tref.bound_generic_params,
|
||||
|
@ -10,6 +10,6 @@ pub fn opts() -> TargetOptions {
|
||||
// for context. (At that time, there was no `-C force-unwind-tables`, so the only solution
|
||||
// was to always emit `uwtable`).
|
||||
base.default_uwtable = true;
|
||||
base.crt_static_respected = false;
|
||||
base.crt_static_respected = true;
|
||||
base
|
||||
}
|
||||
|
@ -1,6 +1,11 @@
|
||||
use crate::spec::{crt_objects, cvs, LinkOutputKind, LinkerFlavor, LldFlavor, TargetOptions};
|
||||
|
||||
pub fn opts() -> TargetOptions {
|
||||
// This mirrors the linker options provided by clang. We presume lld for
|
||||
// now. When using clang as the linker it will supply these options for us,
|
||||
// so we only list them for ld/lld.
|
||||
//
|
||||
// https://github.com/llvm/llvm-project/blob/db9322b2066c55254e7691efeab863f43bfcc084/clang/lib/Driver/ToolChains/Fuchsia.cpp#L31
|
||||
let pre_link_args = TargetOptions::link_args(
|
||||
LinkerFlavor::Ld,
|
||||
&[
|
||||
|
@ -173,13 +173,14 @@ macro_rules! is_raw_eq_comparable {
|
||||
)+};
|
||||
}
|
||||
|
||||
// SAFETY: All the ordinary integer types allow all bit patterns as distinct values
|
||||
// SAFETY: All the ordinary integer types have no padding, and are not pointers.
|
||||
is_raw_eq_comparable!(u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize);
|
||||
|
||||
// SAFETY: bool and char have *niches*, but no *padding*, so this is sound
|
||||
// SAFETY: bool and char have *niches*, but no *padding* (and these are not pointer types), so this
|
||||
// is sound
|
||||
is_raw_eq_comparable!(bool, char);
|
||||
|
||||
// SAFETY: Similarly, the non-zero types have a niche, but no undef,
|
||||
// SAFETY: Similarly, the non-zero types have a niche, but no undef and no pointers,
|
||||
// and they compare like their underlying numeric type.
|
||||
is_raw_eq_comparable!(
|
||||
NonZeroU8,
|
||||
|
@ -2282,7 +2282,8 @@ extern "rust-intrinsic" {
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// It's UB to call this if any of the *bytes* in `*a` or `*b` are uninitialized.
|
||||
/// It's UB to call this if any of the *bytes* in `*a` or `*b` are uninitialized or carry a
|
||||
/// pointer value.
|
||||
/// Note that this is a stricter criterion than just the *values* being
|
||||
/// fully-initialized: if `T` has padding, it's UB to call this intrinsic.
|
||||
///
|
||||
|
@ -1197,7 +1197,6 @@ fn chunks_mut_are_send_and_sync() {
|
||||
use std::slice::{ChunksExactMut, ChunksMut, RChunksExactMut, RChunksMut};
|
||||
use std::sync::MutexGuard;
|
||||
|
||||
#[allow(unused)]
|
||||
fn assert_send_and_sync()
|
||||
where
|
||||
ChunksMut<'static, Cell<i32>>: Send,
|
||||
@ -1210,6 +1209,8 @@ fn chunks_mut_are_send_and_sync() {
|
||||
RChunksExactMut<'static, MutexGuard<'static, u32>>: Sync,
|
||||
{
|
||||
}
|
||||
|
||||
assert_send_and_sync();
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -118,12 +118,15 @@ pub struct Backtrace {
|
||||
pub enum BacktraceStatus {
|
||||
/// Capturing a backtrace is not supported, likely because it's not
|
||||
/// implemented for the current platform.
|
||||
#[stable(feature = "backtrace", since = "1.65.0")]
|
||||
Unsupported,
|
||||
/// Capturing a backtrace has been disabled through either the
|
||||
/// `RUST_LIB_BACKTRACE` or `RUST_BACKTRACE` environment variables.
|
||||
#[stable(feature = "backtrace", since = "1.65.0")]
|
||||
Disabled,
|
||||
/// A backtrace has been captured and the `Backtrace` should print
|
||||
/// reasonable information when rendered.
|
||||
#[stable(feature = "backtrace", since = "1.65.0")]
|
||||
Captured,
|
||||
}
|
||||
|
||||
|
@ -246,6 +246,7 @@
|
||||
#![cfg_attr(bootstrap, feature(let_chains))]
|
||||
#![feature(let_else)]
|
||||
#![feature(linkage)]
|
||||
#![feature(link_cfg)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(must_not_suspend)]
|
||||
#![feature(needs_panic_runtime)]
|
||||
|
@ -295,8 +295,10 @@ pub fn abort_internal() -> ! {
|
||||
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(target_os = "android")] {
|
||||
#[link(name = "dl")]
|
||||
#[link(name = "log")]
|
||||
#[link(name = "dl", kind = "static", modifiers = "-bundle",
|
||||
cfg(target_feature = "crt-static"))]
|
||||
#[link(name = "dl", cfg(not(target_feature = "crt-static")))]
|
||||
#[link(name = "log", cfg(not(target_feature = "crt-static")))]
|
||||
extern "C" {}
|
||||
} else if #[cfg(target_os = "freebsd")] {
|
||||
#[link(name = "execinfo")]
|
||||
|
@ -200,6 +200,9 @@ impl<'a> Iterator for CommandArgs<'a> {
|
||||
fn next(&mut self) -> Option<&'a OsStr> {
|
||||
None
|
||||
}
|
||||
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||
(0, Some(0))
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> ExactSizeIterator for CommandArgs<'a> {}
|
||||
|
@ -13,13 +13,8 @@ fn main() {
|
||||
let has_unwind = build.is_flag_supported("-lunwind").expect("Unable to invoke compiler");
|
||||
|
||||
if has_unwind {
|
||||
println!("cargo:rustc-link-lib=unwind");
|
||||
} else {
|
||||
println!("cargo:rustc-link-lib=gcc");
|
||||
println!("cargo:rustc-cfg=feature=\"system-llvm-libunwind\"");
|
||||
}
|
||||
|
||||
// Android's unwinding library depends on dl_iterate_phdr in `libdl`.
|
||||
println!("cargo:rustc-link-lib=dl");
|
||||
} else if target.contains("freebsd") {
|
||||
println!("cargo:rustc-link-lib=gcc_s");
|
||||
} else if target.contains("netbsd") {
|
||||
|
@ -55,6 +55,26 @@ cfg_if::cfg_if! {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "android")]
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(feature = "llvm-libunwind")] {
|
||||
compile_error!("`llvm-libunwind` is not supported for Android targets");
|
||||
} else if #[cfg(feature = "system-llvm-libunwind")] {
|
||||
#[link(name = "unwind", kind = "static", modifiers = "-bundle", cfg(target_feature = "crt-static"))]
|
||||
#[link(name = "unwind", cfg(not(target_feature = "crt-static")))]
|
||||
extern "C" {}
|
||||
} else {
|
||||
#[link(name = "gcc", kind = "static", modifiers = "-bundle", cfg(target_feature = "crt-static"))]
|
||||
#[link(name = "gcc", cfg(not(target_feature = "crt-static")))]
|
||||
extern "C" {}
|
||||
}
|
||||
}
|
||||
// Android's unwinding library depends on dl_iterate_phdr in `libdl`.
|
||||
#[cfg(target_os = "android")]
|
||||
#[link(name = "dl", kind = "static", modifiers = "-bundle", cfg(target_feature = "crt-static"))]
|
||||
#[link(name = "dl", cfg(not(target_feature = "crt-static")))]
|
||||
extern "C" {}
|
||||
|
||||
// When building with crt-static, we get `gcc_eh` from the `libc` crate, since
|
||||
// glibc needs it, and needs it listed later on the linker command line. We
|
||||
// don't want to duplicate it here.
|
||||
|
@ -66,16 +66,21 @@ TESTS_IN_2 := \
|
||||
src/test/ui \
|
||||
src/tools/linkchecker
|
||||
|
||||
## MSVC native builders
|
||||
|
||||
# these intentionally don't use `$(BOOTSTRAP)` so we can test the shebang on Windows
|
||||
ci-subset-1:
|
||||
$(Q)$(BOOTSTRAP) test --stage 2 $(TESTS_IN_2:%=--exclude %)
|
||||
$(Q)$(CFG_SRC_DIR)/x.py test --stage 2 $(TESTS_IN_2:%=--exclude %)
|
||||
ci-subset-2:
|
||||
$(Q)$(BOOTSTRAP) test --stage 2 $(TESTS_IN_2)
|
||||
$(Q)$(CFG_SRC_DIR)/x.ps1 test --stage 2 $(TESTS_IN_2)
|
||||
|
||||
## MingW native builders
|
||||
|
||||
TESTS_IN_MINGW_2 := \
|
||||
src/test/ui
|
||||
|
||||
ci-mingw-subset-1:
|
||||
$(Q)$(BOOTSTRAP) test --stage 2 $(TESTS_IN_MINGW_2:%=--exclude %)
|
||||
$(Q)$(CFG_SRC_DIR)/x.sh test --stage 2 $(TESTS_IN_MINGW_2:%=--exclude %)
|
||||
ci-mingw-subset-2:
|
||||
$(Q)$(BOOTSTRAP) test --stage 2 $(TESTS_IN_MINGW_2)
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
FROM ubuntu:20.04
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
# NOTE: intentionally installs both python2 and python3 so we can test support for both.
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
g++ \
|
||||
gcc-multilib \
|
||||
@ -10,6 +12,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
curl \
|
||||
ca-certificates \
|
||||
python2.7 \
|
||||
python3.9 \
|
||||
git \
|
||||
cmake \
|
||||
sudo \
|
||||
@ -23,6 +26,14 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
xz-utils \
|
||||
nodejs
|
||||
|
||||
# Install powershell so we can test x.ps1 on Linux
|
||||
RUN apt-get update && \
|
||||
apt-get install -y apt-transport-https software-properties-common && \
|
||||
curl -s "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb" > packages-microsoft-prod.deb && \
|
||||
dpkg -i packages-microsoft-prod.deb && \
|
||||
apt-get update && \
|
||||
apt-get install -y powershell
|
||||
|
||||
COPY scripts/sccache.sh /scripts/
|
||||
RUN sh /scripts/sccache.sh
|
||||
|
||||
@ -33,21 +44,22 @@ ENV RUST_CONFIGURE_ARGS \
|
||||
--enable-llvm-link-shared \
|
||||
--set rust.thin-lto-import-instr-limit=10
|
||||
|
||||
ENV SCRIPT python2.7 ../x.py --stage 2 test --exclude src/tools/tidy && \
|
||||
# NOTE: intentionally uses all of `x.py`, `x.sh`, and `x.ps1` to make sure they all work on Linux.
|
||||
ENV SCRIPT ../x.py --stage 2 test --exclude src/tools/tidy && \
|
||||
# Run the `mir-opt` tests again but this time for a 32-bit target.
|
||||
# This enforces that tests using `// EMIT_MIR_FOR_EACH_BIT_WIDTH` have
|
||||
# both 32-bit and 64-bit outputs updated by the PR author, before
|
||||
# the PR is approved and tested for merging.
|
||||
# It will also detect tests lacking `// EMIT_MIR_FOR_EACH_BIT_WIDTH`,
|
||||
# despite having different output on 32-bit vs 64-bit targets.
|
||||
python2.7 ../x.py --stage 2 test src/test/mir-opt \
|
||||
../x.sh --stage 2 test src/test/mir-opt \
|
||||
--host='' --target=i686-unknown-linux-gnu && \
|
||||
# Run the UI test suite again, but in `--pass=check` mode
|
||||
#
|
||||
# This is intended to make sure that both `--pass=check` continues to
|
||||
# work.
|
||||
#
|
||||
python2.7 ../x.py --stage 2 test src/test/ui --pass=check \
|
||||
../x.ps1 --stage 2 test src/test/ui --pass=check \
|
||||
--host='' --target=i686-unknown-linux-gnu && \
|
||||
# Run tidy at the very end, after all the other tests.
|
||||
python2.7 ../x.py --stage 2 test src/tools/tidy
|
||||
|
@ -1289,14 +1289,9 @@ impl<'a, 'hir, 'tcx> intravisit::Visitor<'hir> for HirCollector<'a, 'hir, 'tcx>
|
||||
});
|
||||
}
|
||||
|
||||
fn visit_variant(
|
||||
&mut self,
|
||||
v: &'hir hir::Variant<'_>,
|
||||
g: &'hir hir::Generics<'_>,
|
||||
item_id: hir::HirId,
|
||||
) {
|
||||
fn visit_variant(&mut self, v: &'hir hir::Variant<'_>) {
|
||||
self.visit_testable(v.ident.to_string(), v.id, v.span, |this| {
|
||||
intravisit::walk_variant(this, v, g, item_id);
|
||||
intravisit::walk_variant(this, v);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -33,27 +33,39 @@ pub(crate) struct HrefContext<'a, 'b, 'c> {
|
||||
|
||||
/// Decorations are represented as a map from CSS class to vector of character ranges.
|
||||
/// Each range will be wrapped in a span with that class.
|
||||
#[derive(Default)]
|
||||
pub(crate) struct DecorationInfo(pub(crate) FxHashMap<&'static str, Vec<(u32, u32)>>);
|
||||
|
||||
/// Highlights `src`, returning the HTML output.
|
||||
pub(crate) fn render_with_highlighting(
|
||||
#[derive(Eq, PartialEq, Clone, Copy)]
|
||||
pub(crate) enum Tooltip {
|
||||
Ignore,
|
||||
CompileFail,
|
||||
ShouldPanic,
|
||||
Edition(Edition),
|
||||
None,
|
||||
}
|
||||
|
||||
/// Highlights `src` as an inline example, returning the HTML output.
|
||||
pub(crate) fn render_example_with_highlighting(
|
||||
src: &str,
|
||||
out: &mut Buffer,
|
||||
class: Option<&str>,
|
||||
tooltip: Tooltip,
|
||||
playground_button: Option<&str>,
|
||||
tooltip: Option<(Option<Edition>, &str)>,
|
||||
edition: Edition,
|
||||
extra_content: Option<Buffer>,
|
||||
href_context: Option<HrefContext<'_, '_, '_>>,
|
||||
decoration_info: Option<DecorationInfo>,
|
||||
) {
|
||||
debug!("highlighting: ================\n{}\n==============", src);
|
||||
if let Some((edition_info, class)) = tooltip {
|
||||
let class = match tooltip {
|
||||
Tooltip::Ignore => " ignore",
|
||||
Tooltip::CompileFail => " compile_fail",
|
||||
Tooltip::ShouldPanic => " should_panic",
|
||||
Tooltip::Edition(_) => " edition",
|
||||
Tooltip::None => "",
|
||||
};
|
||||
|
||||
if tooltip != Tooltip::None {
|
||||
write!(
|
||||
out,
|
||||
"<div class='information'><div class='tooltip {}'{}>ⓘ</div></div>",
|
||||
"<div class='information'><div class='tooltip{}'{}>ⓘ</div></div>",
|
||||
class,
|
||||
if let Some(edition_info) = edition_info {
|
||||
if let Tooltip::Edition(edition_info) = tooltip {
|
||||
format!(" data-edition=\"{}\"", edition_info)
|
||||
} else {
|
||||
String::new()
|
||||
@ -61,20 +73,40 @@ pub(crate) fn render_with_highlighting(
|
||||
);
|
||||
}
|
||||
|
||||
write_header(out, class, extra_content);
|
||||
write_code(out, src, edition, href_context, decoration_info);
|
||||
write_header(out, &format!("rust-example-rendered{}", class), None);
|
||||
write_code(out, src, None, None);
|
||||
write_footer(out, playground_button);
|
||||
}
|
||||
|
||||
fn write_header(out: &mut Buffer, class: Option<&str>, extra_content: Option<Buffer>) {
|
||||
/// Highlights `src` as a macro, returning the HTML output.
|
||||
pub(crate) fn render_macro_with_highlighting(src: &str, out: &mut Buffer) {
|
||||
write_header(out, "macro", None);
|
||||
write_code(out, src, None, None);
|
||||
write_footer(out, None);
|
||||
}
|
||||
|
||||
/// Highlights `src` as a source code page, returning the HTML output.
|
||||
pub(crate) fn render_source_with_highlighting(
|
||||
src: &str,
|
||||
out: &mut Buffer,
|
||||
line_numbers: Buffer,
|
||||
href_context: HrefContext<'_, '_, '_>,
|
||||
decoration_info: DecorationInfo,
|
||||
) {
|
||||
write_header(out, "", Some(line_numbers));
|
||||
write_code(out, src, Some(href_context), Some(decoration_info));
|
||||
write_footer(out, None);
|
||||
}
|
||||
|
||||
fn write_header(out: &mut Buffer, class: &str, extra_content: Option<Buffer>) {
|
||||
write!(out, "<div class=\"example-wrap\">");
|
||||
if let Some(extra) = extra_content {
|
||||
out.push_buffer(extra);
|
||||
}
|
||||
if let Some(class) = class {
|
||||
write!(out, "<pre class=\"rust {}\">", class);
|
||||
} else {
|
||||
if class.is_empty() {
|
||||
write!(out, "<pre class=\"rust\">");
|
||||
} else {
|
||||
write!(out, "<pre class=\"rust {}\">", class);
|
||||
}
|
||||
write!(out, "<code>");
|
||||
}
|
||||
@ -93,7 +125,6 @@ fn write_header(out: &mut Buffer, class: Option<&str>, extra_content: Option<Buf
|
||||
fn write_code(
|
||||
out: &mut Buffer,
|
||||
src: &str,
|
||||
edition: Edition,
|
||||
href_context: Option<HrefContext<'_, '_, '_>>,
|
||||
decoration_info: Option<DecorationInfo>,
|
||||
) {
|
||||
@ -102,7 +133,6 @@ fn write_code(
|
||||
let mut closing_tags: Vec<&'static str> = Vec::new();
|
||||
Classifier::new(
|
||||
&src,
|
||||
edition,
|
||||
href_context.as_ref().map(|c| c.file_span).unwrap_or(DUMMY_SP),
|
||||
decoration_info,
|
||||
)
|
||||
@ -220,7 +250,7 @@ impl<'a> Iterator for TokenIter<'a> {
|
||||
}
|
||||
|
||||
/// Classifies into identifier class; returns `None` if this is a non-keyword identifier.
|
||||
fn get_real_ident_class(text: &str, edition: Edition, allow_path_keywords: bool) -> Option<Class> {
|
||||
fn get_real_ident_class(text: &str, allow_path_keywords: bool) -> Option<Class> {
|
||||
let ignore: &[&str] =
|
||||
if allow_path_keywords { &["self", "Self", "super", "crate"] } else { &["self", "Self"] };
|
||||
if ignore.iter().any(|k| *k == text) {
|
||||
@ -229,7 +259,7 @@ fn get_real_ident_class(text: &str, edition: Edition, allow_path_keywords: bool)
|
||||
Some(match text {
|
||||
"ref" | "mut" => Class::RefKeyWord,
|
||||
"false" | "true" => Class::Bool,
|
||||
_ if Symbol::intern(text).is_reserved(|| edition) => Class::KeyWord,
|
||||
_ if Symbol::intern(text).is_reserved(|| Edition::Edition2021) => Class::KeyWord,
|
||||
_ => return None,
|
||||
})
|
||||
}
|
||||
@ -311,7 +341,6 @@ struct Classifier<'a> {
|
||||
in_attribute: bool,
|
||||
in_macro: bool,
|
||||
in_macro_nonterminal: bool,
|
||||
edition: Edition,
|
||||
byte_pos: u32,
|
||||
file_span: Span,
|
||||
src: &'a str,
|
||||
@ -321,12 +350,7 @@ struct Classifier<'a> {
|
||||
impl<'a> Classifier<'a> {
|
||||
/// Takes as argument the source code to HTML-ify, the rust edition to use and the source code
|
||||
/// file span which will be used later on by the `span_correspondance_map`.
|
||||
fn new(
|
||||
src: &str,
|
||||
edition: Edition,
|
||||
file_span: Span,
|
||||
decoration_info: Option<DecorationInfo>,
|
||||
) -> Classifier<'_> {
|
||||
fn new(src: &str, file_span: Span, decoration_info: Option<DecorationInfo>) -> Classifier<'_> {
|
||||
let tokens = PeekIter::new(TokenIter { src });
|
||||
let decorations = decoration_info.map(Decorations::new);
|
||||
Classifier {
|
||||
@ -334,7 +358,6 @@ impl<'a> Classifier<'a> {
|
||||
in_attribute: false,
|
||||
in_macro: false,
|
||||
in_macro_nonterminal: false,
|
||||
edition,
|
||||
byte_pos: 0,
|
||||
file_span,
|
||||
src,
|
||||
@ -354,7 +377,6 @@ impl<'a> Classifier<'a> {
|
||||
let start = self.byte_pos as usize;
|
||||
let mut pos = start;
|
||||
let mut has_ident = false;
|
||||
let edition = self.edition;
|
||||
|
||||
loop {
|
||||
let mut nb = 0;
|
||||
@ -376,7 +398,7 @@ impl<'a> Classifier<'a> {
|
||||
|
||||
if let Some((None, text)) = self.tokens.peek().map(|(token, text)| {
|
||||
if *token == TokenKind::Ident {
|
||||
let class = get_real_ident_class(text, edition, true);
|
||||
let class = get_real_ident_class(text, true);
|
||||
(class, text)
|
||||
} else {
|
||||
// Doesn't matter which Class we put in here...
|
||||
@ -634,7 +656,7 @@ impl<'a> Classifier<'a> {
|
||||
sink(Highlight::Token { text, class: None });
|
||||
return;
|
||||
}
|
||||
TokenKind::Ident => match get_real_ident_class(text, self.edition, false) {
|
||||
TokenKind::Ident => match get_real_ident_class(text, false) {
|
||||
None => match text {
|
||||
"Option" | "Result" => Class::PreludeTy,
|
||||
"Some" | "None" | "Ok" | "Err" => Class::PreludeVal,
|
||||
|
@ -3,7 +3,6 @@ use crate::html::format::Buffer;
|
||||
use expect_test::expect_file;
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_span::create_default_session_globals_then;
|
||||
use rustc_span::edition::Edition;
|
||||
|
||||
const STYLE: &str = r#"
|
||||
<style>
|
||||
@ -23,7 +22,7 @@ fn test_html_highlighting() {
|
||||
let src = include_str!("fixtures/sample.rs");
|
||||
let html = {
|
||||
let mut out = Buffer::new();
|
||||
write_code(&mut out, src, Edition::Edition2018, None, None);
|
||||
write_code(&mut out, src, None, None);
|
||||
format!("{}<pre><code>{}</code></pre>\n", STYLE, out.into_inner())
|
||||
};
|
||||
expect_file!["fixtures/sample.html"].assert_eq(&html);
|
||||
@ -37,7 +36,7 @@ fn test_dos_backline() {
|
||||
println!(\"foo\");\r\n\
|
||||
}\r\n";
|
||||
let mut html = Buffer::new();
|
||||
write_code(&mut html, src, Edition::Edition2018, None, None);
|
||||
write_code(&mut html, src, None, None);
|
||||
expect_file!["fixtures/dos_line.html"].assert_eq(&html.into_inner());
|
||||
});
|
||||
}
|
||||
@ -51,7 +50,7 @@ let x = super::b::foo;
|
||||
let y = Self::whatever;";
|
||||
|
||||
let mut html = Buffer::new();
|
||||
write_code(&mut html, src, Edition::Edition2018, None, None);
|
||||
write_code(&mut html, src, None, None);
|
||||
expect_file!["fixtures/highlight.html"].assert_eq(&html.into_inner());
|
||||
});
|
||||
}
|
||||
@ -61,7 +60,7 @@ fn test_union_highlighting() {
|
||||
create_default_session_globals_then(|| {
|
||||
let src = include_str!("fixtures/union.rs");
|
||||
let mut html = Buffer::new();
|
||||
write_code(&mut html, src, Edition::Edition2018, None, None);
|
||||
write_code(&mut html, src, None, None);
|
||||
expect_file!["fixtures/union.html"].assert_eq(&html.into_inner());
|
||||
});
|
||||
}
|
||||
@ -75,7 +74,7 @@ let y = 2;";
|
||||
decorations.insert("example", vec![(0, 10)]);
|
||||
|
||||
let mut html = Buffer::new();
|
||||
write_code(&mut html, src, Edition::Edition2018, None, Some(DecorationInfo(decorations)));
|
||||
write_code(&mut html, src, None, Some(DecorationInfo(decorations)));
|
||||
expect_file!["fixtures/decorations.html"].assert_eq(&html.into_inner());
|
||||
});
|
||||
}
|
||||
|
@ -330,34 +330,27 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for CodeBlocks<'_, 'a, I> {
|
||||
});
|
||||
|
||||
let tooltip = if ignore != Ignore::None {
|
||||
Some((None, "ignore"))
|
||||
highlight::Tooltip::Ignore
|
||||
} else if compile_fail {
|
||||
Some((None, "compile_fail"))
|
||||
highlight::Tooltip::CompileFail
|
||||
} else if should_panic {
|
||||
Some((None, "should_panic"))
|
||||
highlight::Tooltip::ShouldPanic
|
||||
} else if explicit_edition {
|
||||
Some((Some(edition), "edition"))
|
||||
highlight::Tooltip::Edition(edition)
|
||||
} else {
|
||||
None
|
||||
highlight::Tooltip::None
|
||||
};
|
||||
|
||||
// insert newline to clearly separate it from the
|
||||
// previous block so we can shorten the html output
|
||||
let mut s = Buffer::new();
|
||||
s.push_str("\n");
|
||||
highlight::render_with_highlighting(
|
||||
|
||||
highlight::render_example_with_highlighting(
|
||||
&text,
|
||||
&mut s,
|
||||
Some(&format!(
|
||||
"rust-example-rendered{}",
|
||||
if let Some((_, class)) = tooltip { format!(" {}", class) } else { String::new() }
|
||||
)),
|
||||
playground_button.as_deref(),
|
||||
tooltip,
|
||||
edition,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
playground_button.as_deref(),
|
||||
);
|
||||
Some(Event::Html(s.into_inner().into()))
|
||||
}
|
||||
@ -1446,6 +1439,8 @@ fn init_id_map() -> FxHashMap<Cow<'static, str>, usize> {
|
||||
map.insert("not-displayed".into(), 1);
|
||||
map.insert("alternative-display".into(), 1);
|
||||
map.insert("search".into(), 1);
|
||||
map.insert("crate-search".into(), 1);
|
||||
map.insert("crate-search-div".into(), 1);
|
||||
// This is the list of IDs used in HTML generated in Rust (including the ones
|
||||
// used in tera template files).
|
||||
map.insert("mainThemeStyle".into(), 1);
|
||||
@ -1453,7 +1448,6 @@ fn init_id_map() -> FxHashMap<Cow<'static, str>, usize> {
|
||||
map.insert("settings-menu".into(), 1);
|
||||
map.insert("help-button".into(), 1);
|
||||
map.insert("main-content".into(), 1);
|
||||
map.insert("crate-search".into(), 1);
|
||||
map.insert("toggle-all-docs".into(), 1);
|
||||
map.insert("all-types".into(), 1);
|
||||
map.insert("default-settings".into(), 1);
|
||||
|
@ -2773,11 +2773,10 @@ fn render_call_locations(w: &mut Buffer, cx: &mut Context<'_>, item: &clean::Ite
|
||||
sources::print_src(
|
||||
w,
|
||||
contents_subset,
|
||||
call_data.edition,
|
||||
file_span,
|
||||
cx,
|
||||
&root_path,
|
||||
Some(highlight::DecorationInfo(decoration_info)),
|
||||
highlight::DecorationInfo(decoration_info),
|
||||
sources::SourceContext::Embedded { offset: line_min },
|
||||
);
|
||||
write!(w, "</div></div>");
|
||||
|
@ -1322,17 +1322,7 @@ fn item_enum(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, e: &clean::
|
||||
|
||||
fn item_macro(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &clean::Macro) {
|
||||
wrap_into_docblock(w, |w| {
|
||||
highlight::render_with_highlighting(
|
||||
&t.source,
|
||||
w,
|
||||
Some("macro"),
|
||||
None,
|
||||
None,
|
||||
it.span(cx.tcx()).inner().edition(),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
);
|
||||
highlight::render_macro_with_highlighting(&t.source, w);
|
||||
});
|
||||
document(w, cx, it, None, HeadingOffset::H2)
|
||||
}
|
||||
|
@ -11,7 +11,6 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_hir::def_id::LOCAL_CRATE;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_session::Session;
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_span::source_map::FileName;
|
||||
|
||||
use std::ffi::OsStr;
|
||||
@ -213,11 +212,10 @@ impl SourceCollector<'_, '_> {
|
||||
print_src(
|
||||
buf,
|
||||
contents,
|
||||
cx.shared.edition(),
|
||||
file_span,
|
||||
cx,
|
||||
&root_path,
|
||||
None,
|
||||
highlight::DecorationInfo::default(),
|
||||
SourceContext::Standalone,
|
||||
)
|
||||
},
|
||||
@ -266,11 +264,10 @@ pub(crate) enum SourceContext {
|
||||
pub(crate) fn print_src(
|
||||
buf: &mut Buffer,
|
||||
s: &str,
|
||||
edition: Edition,
|
||||
file_span: rustc_span::Span,
|
||||
context: &Context<'_>,
|
||||
root_path: &str,
|
||||
decoration_info: Option<highlight::DecorationInfo>,
|
||||
decoration_info: highlight::DecorationInfo,
|
||||
source_context: SourceContext,
|
||||
) {
|
||||
let lines = s.lines().count();
|
||||
@ -289,15 +286,11 @@ pub(crate) fn print_src(
|
||||
}
|
||||
}
|
||||
line_numbers.write_str("</pre>");
|
||||
highlight::render_with_highlighting(
|
||||
highlight::render_source_with_highlighting(
|
||||
s,
|
||||
buf,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
edition,
|
||||
Some(line_numbers),
|
||||
Some(highlight::HrefContext { context, file_span, root_path }),
|
||||
line_numbers,
|
||||
highlight::HrefContext { context, file_span, root_path },
|
||||
decoration_info,
|
||||
);
|
||||
}
|
||||
|
@ -947,18 +947,33 @@ table,
|
||||
height: 100%;
|
||||
}
|
||||
.search-results-title {
|
||||
display: inline;
|
||||
margin-top: 0;
|
||||
white-space: nowrap;
|
||||
/* flex layout allows shrinking the <select> appropriately if it becomes too large */
|
||||
display: inline-flex;
|
||||
max-width: 100%;
|
||||
/* make things look like in a line, despite the fact that we're using a layout
|
||||
with boxes (i.e. from the flex layout) */
|
||||
align-items: baseline;
|
||||
}
|
||||
#search-settings {
|
||||
font-size: 1.5rem;
|
||||
font-weight: 500;
|
||||
margin-bottom: 20px;
|
||||
#crate-search-div {
|
||||
display: inline-block;
|
||||
/* ensures that 100% in properties of #crate-search-div:after
|
||||
are relative to the size of this div */
|
||||
position: relative;
|
||||
/* allows this div (and with it the <select>-element "#crate-search") to be shrunk */
|
||||
min-width: 5em;
|
||||
}
|
||||
#crate-search {
|
||||
min-width: 115px;
|
||||
margin-top: 5px;
|
||||
padding-left: 0.15em;
|
||||
padding: 0;
|
||||
/* keep these two in sync with "@-moz-document url-prefix()" below */
|
||||
padding-left: 4px;
|
||||
padding-right: 23px;
|
||||
/* prevents the <select> from overflowing the containing div in case it's shrunk */
|
||||
max-width: 100%;
|
||||
/* contents can overflow because of max-width limit, then show ellipsis */
|
||||
text-overflow: ellipsis;
|
||||
border: 1px solid;
|
||||
border-radius: 4px;
|
||||
outline: none;
|
||||
@ -966,13 +981,37 @@ table,
|
||||
-moz-appearance: none;
|
||||
-webkit-appearance: none;
|
||||
/* Removes default arrow from firefox */
|
||||
text-indent: 0.01px;
|
||||
background-color: var(--main-background-color);
|
||||
}
|
||||
/* cancel stylistic differences in padding in firefox
|
||||
for "appearance: none"-style (or equivalent) <select>s */
|
||||
@-moz-document url-prefix() {
|
||||
#crate-search {
|
||||
padding-left: 0px; /* == 4px - 4px */
|
||||
padding-right: 19px; /* == 23px - 4px */
|
||||
}
|
||||
}
|
||||
/* pseudo-element for holding the dropdown-arrow image; needs to be a separate thing
|
||||
so that we can apply CSS-filters to change the arrow color in themes */
|
||||
#crate-search-div::after {
|
||||
/* lets clicks through! */
|
||||
pointer-events: none;
|
||||
/* completely covers the underlying div */
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
content: "";
|
||||
background-repeat: no-repeat;
|
||||
background-color: transparent;
|
||||
background-size: 20px;
|
||||
background-position: calc(100% - 1px) 56%;
|
||||
background-position: calc(100% - 2px) 56%;
|
||||
/* image is black color, themes should apply a "filter" property to change the color */
|
||||
background-image: /* AUTOREPLACE: */url("down-arrow.svg");
|
||||
max-width: 100%;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
#crate-search > option {
|
||||
font-size: 1rem;
|
||||
}
|
||||
.search-container {
|
||||
margin-top: 4px;
|
||||
|
@ -182,7 +182,7 @@ details.rustdoc-toggle > summary::before {
|
||||
filter: invert(100%);
|
||||
}
|
||||
|
||||
#crate-search, .search-input {
|
||||
.search-input {
|
||||
background-color: #141920;
|
||||
border-color: #424c57;
|
||||
}
|
||||
@ -191,7 +191,17 @@ details.rustdoc-toggle > summary::before {
|
||||
/* Without the `!important`, the border-color is ignored for `<select>`...
|
||||
It cannot be in the group above because `.search-input` has a different border color on
|
||||
hover. */
|
||||
border-color: #424c57 !important;
|
||||
border-color: #5c6773 !important;
|
||||
}
|
||||
#crate-search-div::after {
|
||||
/* match border-color; uses https://codepen.io/sosuke/pen/Pjoqqp */
|
||||
filter: invert(41%) sepia(12%) saturate(487%) hue-rotate(171deg) brightness(94%) contrast(94%);
|
||||
}
|
||||
#crate-search:hover, #crate-search:focus {
|
||||
border-color: #e0e0e0 !important;
|
||||
}
|
||||
#crate-search-div:hover::after, #crate-search-div:focus-within::after {
|
||||
filter: invert(98%) sepia(12%) saturate(81%) hue-rotate(343deg) brightness(113%) contrast(76%);
|
||||
}
|
||||
|
||||
.search-input {
|
||||
@ -203,20 +213,9 @@ details.rustdoc-toggle > summary::before {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/* Created this empty rule to satisfy the theme checks. */
|
||||
.stab.empty-impl {}
|
||||
.stab.must_implement {}
|
||||
|
||||
.stab.unstable,
|
||||
.stab.deprecated,
|
||||
.stab.portability,
|
||||
.stab.empty-impl,
|
||||
.stab.must_implement {
|
||||
.stab {
|
||||
color: #c5c5c5;
|
||||
background: #314559 !important;
|
||||
border-style: none !important;
|
||||
border-radius: 4px;
|
||||
padding: 3px 6px 3px 6px;
|
||||
}
|
||||
|
||||
.stab.portability > code {
|
||||
|
@ -152,7 +152,7 @@ details.rustdoc-toggle > summary::before {
|
||||
filter: invert(100%);
|
||||
}
|
||||
|
||||
#crate-search, .search-input {
|
||||
.search-input {
|
||||
color: #111;
|
||||
background-color: #f0f0f0;
|
||||
border-color: #f0f0f0;
|
||||
@ -162,7 +162,17 @@ details.rustdoc-toggle > summary::before {
|
||||
/* Without the `!important`, the border-color is ignored for `<select>`...
|
||||
It cannot be in the group above because `.search-input` has a different border color on
|
||||
hover. */
|
||||
border-color: #f0f0f0 !important;
|
||||
border-color: #d2d2d2 !important;
|
||||
}
|
||||
#crate-search-div::after {
|
||||
/* match border-color; uses https://codepen.io/sosuke/pen/Pjoqqp */
|
||||
filter: invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg) brightness(90%) contrast(90%);
|
||||
}
|
||||
#crate-search:hover, #crate-search:focus {
|
||||
border-color: #2196f3 !important;
|
||||
}
|
||||
#crate-search-div:hover::after, #crate-search-div:focus-within::after {
|
||||
filter: invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg) brightness(100%) contrast(91%);
|
||||
}
|
||||
|
||||
.search-input {
|
||||
@ -173,12 +183,12 @@ details.rustdoc-toggle > summary::before {
|
||||
border-color: #008dfd;
|
||||
}
|
||||
|
||||
.stab.empty-impl { background: #FFF5D6; border-color: #FFC600; color: #2f2f2f; }
|
||||
.stab.unstable { background: #FFF5D6; border-color: #FFC600; color: #2f2f2f; }
|
||||
.stab.deprecated { background: #ffc4c4; border-color: #db7b7b; color: #2f2f2f; }
|
||||
.stab.must_implement { background: #F3DFFF; border-color: #b07bdb; color: #2f2f2f; }
|
||||
.stab.portability { background: #F3DFFF; border-color: #b07bdb; color: #2f2f2f; }
|
||||
.stab.portability > code { background: none; }
|
||||
.stab { background: #314559; }
|
||||
|
||||
.stab.portability > code {
|
||||
color: #e6e1cf;
|
||||
background: none;
|
||||
}
|
||||
|
||||
.rightside,
|
||||
.out-of-band {
|
||||
|
@ -144,27 +144,32 @@ details.rustdoc-toggle > summary::before {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
#crate-search, .search-input {
|
||||
.search-input {
|
||||
background-color: white;
|
||||
border-color: #e0e0e0;
|
||||
}
|
||||
|
||||
#crate-search {
|
||||
/* Without the `!important`, the border-color is ignored for `<select>`...
|
||||
It cannot be in the group above because `.search-input` has a different border color on
|
||||
hover. */
|
||||
border-color: #e0e0e0 !important;
|
||||
}
|
||||
#crate-search-div::after {
|
||||
/* match border-color; uses https://codepen.io/sosuke/pen/Pjoqqp */
|
||||
filter: invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg) brightness(114%) contrast(76%);
|
||||
}
|
||||
#crate-search:hover, #crate-search:focus {
|
||||
border-color: #717171 !important;
|
||||
}
|
||||
#crate-search-div:hover::after, #crate-search-div:focus-within::after {
|
||||
filter: invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg) brightness(96%) contrast(93%);
|
||||
}
|
||||
|
||||
.search-input:focus {
|
||||
border-color: #66afe9;
|
||||
}
|
||||
|
||||
.stab.empty-impl { background: #FFF5D6; border-color: #FFC600; }
|
||||
.stab.unstable { background: #FFF5D6; border-color: #FFC600; }
|
||||
.stab.deprecated { background: #ffc4c4; border-color: #db7b7b; }
|
||||
.stab.must_implement { background: #F3DFFF; border-color: #b07bdb; }
|
||||
.stab.portability { background: #F3DFFF; border-color: #b07bdb; }
|
||||
.stab { background: #FFF5D6; border-color: #FFC600; }
|
||||
.stab.portability > code { background: none; }
|
||||
|
||||
.rightside,
|
||||
@ -321,7 +326,7 @@ kbd {
|
||||
|
||||
.popover, .popover::before,
|
||||
#help-button span.top, #help-button span.bottom {
|
||||
border-color: #DDDDDD;
|
||||
border-color: #e0e0e0;
|
||||
}
|
||||
|
||||
#copy-path {
|
||||
|
@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Layer_1" width="128" height="128" enable-background="new 0 0 128 128" version="1.1" viewBox="-30 -20 176 176" xml:space="preserve"><g><line x1="111" x2="64" y1="40.5" y2="87.499" fill="none" stroke="#2F3435" stroke-linecap="square" stroke-miterlimit="10" stroke-width="12"/><line x1="64" x2="17" y1="87.499" y2="40.5" fill="none" stroke="#2F3435" stroke-linecap="square" stroke-miterlimit="10" stroke-width="12"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Layer_1" width="128" height="128" enable-background="new 0 0 128 128" version="1.1" viewBox="-30 -20 176 176" xml:space="preserve"><g><line x1="111" x2="64" y1="40.5" y2="87.499" fill="none" stroke="#000000" stroke-linecap="square" stroke-miterlimit="10" stroke-width="12"/><line x1="64" x2="17" y1="87.499" y2="40.5" fill="none" stroke="#000000" stroke-linecap="square" stroke-miterlimit="10" stroke-width="12"/></g></svg>
|
Before Width: | Height: | Size: 510 B After Width: | Height: | Size: 510 B |
@ -429,9 +429,9 @@ function initSearch(rawSearchIndex) {
|
||||
}
|
||||
const posBefore = parserState.pos;
|
||||
getNextElem(query, parserState, elems, endChar === ">");
|
||||
// This case can be encountered if `getNextElem` encounted a "stop character" right from
|
||||
// the start. For example if you have `,,` or `<>`. In this case, we simply move up the
|
||||
// current position to continue the parsing.
|
||||
// This case can be encountered if `getNextElem` encountered a "stop character" right
|
||||
// from the start. For example if you have `,,` or `<>`. In this case, we simply move up
|
||||
// the current position to continue the parsing.
|
||||
if (posBefore === parserState.pos) {
|
||||
parserState.pos += 1;
|
||||
}
|
||||
@ -581,7 +581,7 @@ function initSearch(rawSearchIndex) {
|
||||
const elem = document.getElementById("crate-search");
|
||||
|
||||
if (elem &&
|
||||
elem.value !== "All crates" &&
|
||||
elem.value !== "all crates" &&
|
||||
hasOwnPropertyRustdoc(rawSearchIndex, elem.value)
|
||||
) {
|
||||
return elem.value;
|
||||
@ -1551,12 +1551,6 @@ function initSearch(rawSearchIndex) {
|
||||
return [displayPath, href];
|
||||
}
|
||||
|
||||
function escape(content) {
|
||||
const h1 = document.createElement("h1");
|
||||
h1.textContent = content;
|
||||
return h1.innerHTML;
|
||||
}
|
||||
|
||||
function pathSplitter(path) {
|
||||
const tmp = "<span>" + path.replace(/::/g, "::</span><span>");
|
||||
if (tmp.endsWith("<span>")) {
|
||||
@ -1710,22 +1704,15 @@ function initSearch(rawSearchIndex) {
|
||||
let crates = "";
|
||||
const crates_list = Object.keys(rawSearchIndex);
|
||||
if (crates_list.length > 1) {
|
||||
crates = " in <select id=\"crate-search\"><option value=\"All crates\">" +
|
||||
"All crates</option>";
|
||||
crates = " in <div id=\"crate-search-div\"><select id=\"crate-search\">" +
|
||||
"<option value=\"all crates\">all crates</option>";
|
||||
for (const c of crates_list) {
|
||||
crates += `<option value="${c}" ${c === filterCrates && "selected"}>${c}</option>`;
|
||||
}
|
||||
crates += "</select>";
|
||||
crates += "</select></div>";
|
||||
}
|
||||
|
||||
let typeFilter = "";
|
||||
if (results.query.typeFilter !== NO_TYPE_FILTER) {
|
||||
typeFilter = " (type: " + escape(itemTypes[results.query.typeFilter]) + ")";
|
||||
}
|
||||
|
||||
let output = "<div id=\"search-settings\">" +
|
||||
`<h1 class="search-results-title">Results for ${escape(results.query.userQuery)}` +
|
||||
`${typeFilter}</h1>${crates}</div>`;
|
||||
let output = `<h1 class="search-results-title">Results${crates}</h1>`;
|
||||
if (results.query.error !== null) {
|
||||
output += `<h3>Query parser error: "${results.query.error}".</h3>`;
|
||||
output += "<div id=\"titles\">" +
|
||||
@ -2245,7 +2232,7 @@ function initSearch(rawSearchIndex) {
|
||||
}
|
||||
|
||||
function updateCrate(ev) {
|
||||
if (ev.target.value === "All crates") {
|
||||
if (ev.target.value === "all crates") {
|
||||
// If we don't remove it from the URL, it'll be picked up again by the search.
|
||||
const params = searchState.getQueryStringParams();
|
||||
const query = searchState.input.value.trim();
|
||||
|
@ -7,14 +7,14 @@ size: (1080, 600)
|
||||
assert: (".stab.deprecated")
|
||||
assert: (".stab.portability")
|
||||
|
||||
// make sure that deprecated and portability are different colours
|
||||
// make sure that deprecated and portability have the right colors
|
||||
assert-css: (
|
||||
".item-table .item-left .stab.deprecated",
|
||||
{ "background-color": "rgb(255, 196, 196)" },
|
||||
{ "background-color": "rgb(255, 245, 214)" },
|
||||
)
|
||||
assert-css: (
|
||||
".item-table .item-left .stab.portability",
|
||||
{ "background-color": "rgb(243, 223, 255)" },
|
||||
{ "background-color": "rgb(255, 245, 214)" },
|
||||
)
|
||||
|
||||
// table like view
|
||||
@ -51,7 +51,7 @@ assert-css: (".item-right.docblock-short", { "padding-left": "32px" })
|
||||
compare-elements-position-near: (
|
||||
"//*[@class='item-left module-item']//a[text()='replaced_function']",
|
||||
".item-left .stab.deprecated",
|
||||
{"y": 1},
|
||||
{"y": 2},
|
||||
)
|
||||
compare-elements-position: (
|
||||
".item-left .stab.deprecated",
|
||||
|
@ -71,7 +71,7 @@ reload:
|
||||
click: "#help-button"
|
||||
assert-css: (
|
||||
"#help-button .popover",
|
||||
{"display": "block", "border-color": "rgb(221, 221, 221)"},
|
||||
{"display": "block", "border-color": "rgb(224, 224, 224)"},
|
||||
)
|
||||
compare-elements-css: ("#help-button .popover", "#help-button .top", ["border-color"])
|
||||
compare-elements-css: ("#help-button .popover", "#help-button .bottom", ["border-color"])
|
||||
|
@ -40,7 +40,7 @@ press-key: "ArrowUp"
|
||||
press-key: "Enter"
|
||||
// Waiting for the search results to appear...
|
||||
wait-for: "#titles"
|
||||
assert-property: ("#crate-search", {"value": "All crates"})
|
||||
assert-property: ("#crate-search", {"value": "all crates"})
|
||||
|
||||
// Checking that the URL parameter is taken into account for crate filtering.
|
||||
goto: file://|DOC_PATH|/test_docs/index.html?search=test&filter-crate=lib2
|
||||
@ -48,8 +48,8 @@ wait-for: "#crate-search"
|
||||
assert-property: ("#crate-search", {"value": "lib2"})
|
||||
assert-false: "#results .externcrate"
|
||||
|
||||
// Checking that the text for the "title" is correct (the "All" comes from the "<select>").
|
||||
assert-text: ("#search-settings", "Results for test in All", STARTS_WITH)
|
||||
// Checking that the text for the "title" is correct (the "all crates" comes from the "<select>").
|
||||
assert-text: (".search-results-title", "Results in all crates", STARTS_WITH)
|
||||
|
||||
// Checking the display of the crate filter.
|
||||
// We start with the light theme.
|
||||
@ -69,15 +69,15 @@ click: "#settings-menu"
|
||||
wait-for: "#settings"
|
||||
click: "#theme-dark"
|
||||
wait-for-css: ("#crate-search", {
|
||||
"border": "1px solid rgb(240, 240, 240)",
|
||||
"color": "rgb(17, 17, 17)",
|
||||
"background-color": "rgb(240, 240, 240)",
|
||||
"border": "1px solid rgb(210, 210, 210)",
|
||||
"color": "rgb(221, 221, 221)",
|
||||
"background-color": "rgb(53, 53, 53)",
|
||||
})
|
||||
|
||||
// And finally we check the ayu theme.
|
||||
click: "#theme-ayu"
|
||||
wait-for-css: ("#crate-search", {
|
||||
"border": "1px solid rgb(66, 76, 87)",
|
||||
"color": "rgb(197, 197, 197)",
|
||||
"background-color": "rgb(20, 25, 32)",
|
||||
"border": "1px solid rgb(92, 103, 115)",
|
||||
"color": "rgb(255, 255, 255)",
|
||||
"background-color": "rgb(15, 20, 25)",
|
||||
})
|
||||
|
@ -4,7 +4,7 @@ size: (900, 1000)
|
||||
write: (".search-input", "test")
|
||||
// To be SURE that the search will be run.
|
||||
press-key: 'Enter'
|
||||
wait-for: "#search-settings"
|
||||
wait-for: "#crate-search"
|
||||
// The width is returned by "getComputedStyle" which returns the exact number instead of the
|
||||
// CSS rule which is "50%"...
|
||||
assert-css: (".search-results div.desc", {"width": "295px"})
|
||||
@ -17,13 +17,9 @@ assert-css: (".search-results div.desc", {"width": "570px"})
|
||||
// To do so we need to update the length of one of its `<option>`.
|
||||
size: (900, 900)
|
||||
|
||||
// First we check the current width and position.
|
||||
assert-css: ("#crate-search", {"width": "218px"})
|
||||
compare-elements-position-near: (
|
||||
"#crate-search",
|
||||
"#search-settings .search-results-title",
|
||||
{"y": 5},
|
||||
)
|
||||
// First we check the current width, height and position.
|
||||
assert-css: ("#crate-search", {"width": "223px"})
|
||||
assert-css: (".search-results-title", {"height": "44px", "width": "336px"})
|
||||
|
||||
// Then we update the text of one of the `<option>`.
|
||||
text: (
|
||||
@ -31,12 +27,8 @@ text: (
|
||||
"sdjfaksdjfaksjdbfkadsbfkjsadbfkdsbkfbsadkjfbkdsabfkadsfkjdsafa",
|
||||
)
|
||||
|
||||
// Then we compare again.
|
||||
assert-css: ("#crate-search", {"width": "640px"})
|
||||
compare-elements-position-near-false: (
|
||||
"#crate-search",
|
||||
"#search-settings .search-results-title",
|
||||
{"y": 5},
|
||||
)
|
||||
// And we check that the `<select>` isn't bigger than its container.
|
||||
// Then we compare again to confirm the height didn't change.
|
||||
assert-css: ("#crate-search", {"width": "527px"})
|
||||
assert-css: (".search-results-title", {"height": "44px", "width": "640px"})
|
||||
// And we check that the `<select>` isn't bigger than its container (".search-results-title").
|
||||
assert-css: ("#search", {"width": "640px"})
|
||||
|
@ -1 +0,0 @@
|
||||
{"artifact":"$TEST_BUILD_DIR/json-multiple/libjson_multiple.rlib","emit":"link"}
|
@ -1 +0,0 @@
|
||||
{"artifact":"$TEST_BUILD_DIR/json-options/libjson_options.rlib","emit":"link"}
|
1
src/test/ui/json/json-multiple.stderr
Normal file
1
src/test/ui/json/json-multiple.stderr
Normal file
@ -0,0 +1 @@
|
||||
{"artifact":"$TEST_BUILD_DIR/json/json-multiple/libjson_multiple.rlib","emit":"link"}
|
1
src/test/ui/json/json-options.stderr
Normal file
1
src/test/ui/json/json-options.stderr
Normal file
@ -0,0 +1 @@
|
||||
{"artifact":"$TEST_BUILD_DIR/json/json-options/libjson_options.rlib","emit":"link"}
|
14
src/test/ui/lowering/issue-96847.rs
Normal file
14
src/test/ui/lowering/issue-96847.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// run-pass
|
||||
|
||||
// Test that this doesn't abort during AST lowering. In #96847 it did abort
|
||||
// because the attribute was being lowered twice.
|
||||
|
||||
#![feature(stmt_expr_attributes)]
|
||||
#![feature(lang_items)]
|
||||
|
||||
fn main() {
|
||||
for _ in [1,2,3] {
|
||||
#![lang="foo"]
|
||||
println!("foo");
|
||||
}
|
||||
}
|
@ -865,8 +865,9 @@ fn test_vis() {
|
||||
assert_eq!(stringify_vis!(pub(crate)), "pub(crate) ");
|
||||
assert_eq!(stringify_vis!(pub(self)), "pub(self) ");
|
||||
assert_eq!(stringify_vis!(pub(super)), "pub(super) ");
|
||||
assert_eq!(stringify_vis!(pub(in self)), "pub(self) ");
|
||||
assert_eq!(stringify_vis!(pub(in super)), "pub(super) ");
|
||||
assert_eq!(stringify_vis!(pub(in crate)), "pub(in crate) ");
|
||||
assert_eq!(stringify_vis!(pub(in self)), "pub(in self) ");
|
||||
assert_eq!(stringify_vis!(pub(in super)), "pub(in super) ");
|
||||
assert_eq!(stringify_vis!(pub(in path::to)), "pub(in path::to) ");
|
||||
assert_eq!(stringify_vis!(pub(in ::path::to)), "pub(in ::path::to) ");
|
||||
assert_eq!(stringify_vis!(pub(in self::path::to)), "pub(in self::path::to) ");
|
||||
|
@ -89,7 +89,7 @@ impl EarlyLintPass for UnusedUnit {
|
||||
}
|
||||
}
|
||||
|
||||
fn check_poly_trait_ref(&mut self, cx: &EarlyContext<'_>, poly: &ast::PolyTraitRef, _: &ast::TraitBoundModifier) {
|
||||
fn check_poly_trait_ref(&mut self, cx: &EarlyContext<'_>, poly: &ast::PolyTraitRef) {
|
||||
let segments = &poly.trait_ref.path.segments;
|
||||
|
||||
if_chain! {
|
||||
|
@ -96,6 +96,8 @@ mod os_impl {
|
||||
|
||||
#[cfg(unix)]
|
||||
pub fn check(path: &Path, bad: &mut bool) {
|
||||
use std::ffi::OsStr;
|
||||
|
||||
const ALLOWED: &[&str] = &["configure"];
|
||||
|
||||
crate::walk_no_read(
|
||||
@ -117,9 +119,9 @@ mod os_impl {
|
||||
},
|
||||
&mut |entry| {
|
||||
let file = entry.path();
|
||||
let filename = file.file_name().unwrap().to_string_lossy();
|
||||
let extensions = [".py", ".sh"];
|
||||
if extensions.iter().any(|e| filename.ends_with(e)) {
|
||||
let extension = file.extension();
|
||||
let scripts = ["py", "sh", "ps1"];
|
||||
if scripts.into_iter().any(|e| extension == Some(OsStr::new(e))) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
28
x.ps1
Executable file
28
x.ps1
Executable file
@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env pwsh
|
||||
|
||||
# See x.sh for why these scripts exist.
|
||||
|
||||
$xpy = Join-Path $PSScriptRoot x.py
|
||||
# Start-Process for some reason splits arguments on spaces. (Isn't powershell supposed to be simpler than bash?)
|
||||
# Double-quote all the arguments so it doesn't do that.
|
||||
$xpy_args = @("""$xpy""")
|
||||
foreach ($arg in $args) {
|
||||
$xpy_args += """$arg"""
|
||||
}
|
||||
|
||||
foreach ($python in "py", "python3", "python", "python2") {
|
||||
# NOTE: this only tests that the command exists in PATH, not that it's actually
|
||||
# executable. The latter is not possible in a portable way, see
|
||||
# https://github.com/PowerShell/PowerShell/issues/12625.
|
||||
if (Get-Command $python -ErrorAction SilentlyContinue) {
|
||||
if ($python -eq "py") {
|
||||
# Use python3, not python2
|
||||
$xpy_args = @("-3") + $xpy_args
|
||||
}
|
||||
$process = Start-Process -NoNewWindow -Wait -PassThru $python $xpy_args
|
||||
Exit $process.ExitCode
|
||||
}
|
||||
}
|
||||
|
||||
Write-Error "${PSCommandPath}: error: did not find python installed"
|
||||
Exit 1
|
30
x.py
30
x.py
@ -1,36 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
#!/usr/bin/env python3
|
||||
# Some systems don't have `python3` in their PATH. This isn't supported by x.py directly;
|
||||
# they should use `x.sh` or `x.ps1` instead.
|
||||
|
||||
# Modern Linux and macOS systems commonly only have a thing called `python3` and
|
||||
# not `python`, while Windows commonly does not have `python3`, so we cannot
|
||||
# directly use python in the shebang and have it consistently work. Instead we
|
||||
# embed some bash to look for a python to run the rest of the script.
|
||||
#
|
||||
# On Windows, `py -3` sometimes works. We need to try it first because `python3`
|
||||
# sometimes tries to launch the app store on Windows.
|
||||
'''':
|
||||
for PYTHON in "py -3" python3 python python2; do
|
||||
if command -v $PYTHON >/dev/null; then
|
||||
exec $PYTHON "$0" "$@"
|
||||
break
|
||||
fi
|
||||
done
|
||||
echo "$0: error: did not find python installed" >&2
|
||||
exit 1
|
||||
'''
|
||||
|
||||
# The rest of this file is Python.
|
||||
#
|
||||
# This file is only a "symlink" to bootstrap.py, all logic should go there.
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# If this is python2, check if python3 is available and re-execute with that
|
||||
# interpreter.
|
||||
# interpreter. Only python3 allows downloading CI LLVM.
|
||||
#
|
||||
# `./x.py` would not normally benefit from this because the bash above tries
|
||||
# python3 before 2, but this matters if someone ran `python x.py` and their
|
||||
# system's `python` is python2.
|
||||
# This matters if someone's system `python` is python2.
|
||||
if sys.version_info.major < 3:
|
||||
try:
|
||||
os.execvp("py", ["py", "-3"] + sys.argv)
|
||||
|
33
x.sh
Executable file
33
x.sh
Executable file
@ -0,0 +1,33 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Modern Linux and macOS systems commonly only have a thing called `python3` and
|
||||
# not `python`, while Windows commonly does not have `python3`, so we cannot
|
||||
# directly use python in the x.py shebang and have it consistently work. Instead we
|
||||
# have a shell script to look for a python to run x.py.
|
||||
|
||||
set -eu
|
||||
|
||||
realpath() {
|
||||
if [ -d "$1" ]; then
|
||||
CDPATH='' command cd "$1" && pwd -P
|
||||
else
|
||||
echo "$(realpath "$(dirname "$1")")/$(basename "$1")"
|
||||
fi
|
||||
}
|
||||
|
||||
xpy=$(dirname "$(realpath "$0")")/x.py
|
||||
|
||||
# On Windows, `py -3` sometimes works. We need to try it first because `python3`
|
||||
# sometimes tries to launch the app store on Windows.
|
||||
for SEARCH_PYTHON in py python3 python python2; do
|
||||
if python=$(command -v $SEARCH_PYTHON) && [ -x "$python" ]; then
|
||||
if [ $SEARCH_PYTHON = py ]; then
|
||||
extra_arg="-3"
|
||||
else
|
||||
extra_arg=""
|
||||
fi
|
||||
exec "$python" $extra_arg "$xpy" "$@"
|
||||
fi
|
||||
done
|
||||
echo "$0: error: did not find python installed" >&2
|
||||
exit 1
|
Loading…
x
Reference in New Issue
Block a user