Skip to content

Commit baae274

Browse files
committed
Use Span instead of SyntaxContext in Ident
1 parent 48fa6f9 commit baae274

File tree

23 files changed

+146
-93
lines changed

23 files changed

+146
-93
lines changed

src/libproc_macro/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1097,7 +1097,7 @@ impl TokenTree {
10971097
}).into();
10981098
},
10991099
self::TokenTree::Term(tt) => {
1100-
let ident = ast::Ident { name: tt.sym, ctxt: tt.span.0.ctxt() };
1100+
let ident = ast::Ident::new(tt.sym, tt.span.0);
11011101
let sym_str = tt.sym.as_str();
11021102
let token =
11031103
if sym_str.starts_with("'") { Lifetime(ident) }

src/librustc/hir/lowering.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,7 @@ impl<'a> LoweringContext<'a> {
909909

910910
fn lower_ident(&mut self, ident: Ident) -> Name {
911911
let ident = ident.modern();
912-
if ident.ctxt == SyntaxContext::empty() {
912+
if ident.span.ctxt() == SyntaxContext::empty() {
913913
return ident.name;
914914
}
915915
*self.name_map
@@ -2089,10 +2089,7 @@ impl<'a> LoweringContext<'a> {
20892089
name: self.lower_ident(match f.ident {
20902090
Some(ident) => ident,
20912091
// FIXME(jseyfried) positional field hygiene
2092-
None => Ident {
2093-
name: Symbol::intern(&index.to_string()),
2094-
ctxt: f.span.ctxt(),
2095-
},
2092+
None => Ident::new(Symbol::intern(&index.to_string()), f.span),
20962093
}),
20972094
vis: self.lower_visibility(&f.vis, None),
20982095
ty: self.lower_ty(&f.ty, ImplTraitContext::Disallowed),

src/librustc/ich/impls_hir.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ impl<'a> HashStable<StableHashingContext<'a>> for ast::Ident {
655655
hasher: &mut StableHasher<W>) {
656656
let ast::Ident {
657657
ref name,
658-
ctxt: _ // Ignore this
658+
span: _ // Ignore this
659659
} = *self;
660660

661661
name.hash_stable(hcx, hasher);

src/librustc/ty/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2088,8 +2088,8 @@ impl<'a, 'gcx, 'tcx> VariantDef {
20882088
return Some(index);
20892089
}
20902090
let mut ident = name.to_ident();
2091-
while ident.ctxt != SyntaxContext::empty() {
2092-
ident.ctxt.remove_mark();
2091+
while ident.span.ctxt() != SyntaxContext::empty() {
2092+
ident.span.remove_mark();
20932093
if let Some(field) = self.fields.iter().position(|f| f.name.to_ident() == ident) {
20942094
return Some(field);
20952095
}
@@ -2558,7 +2558,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
25582558
LOCAL_CRATE => self.hir.definitions().expansion(scope.index),
25592559
_ => Mark::root(),
25602560
};
2561-
let scope = match ident.ctxt.adjust(expansion) {
2561+
let scope = match ident.span.adjust(expansion) {
25622562
Some(macro_def) => self.hir.definitions().macro_def_scope(macro_def),
25632563
None if block == DUMMY_NODE_ID => DefId::local(CRATE_DEF_INDEX), // Dummy DefId
25642564
None => self.hir.get_module_parent(block),

src/librustc_driver/pretty.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,11 +466,11 @@ impl<'a> PrinterSupport for HygieneAnnotation<'a> {
466466
impl<'a> pprust::PpAnn for HygieneAnnotation<'a> {
467467
fn post(&self, s: &mut pprust::State, node: pprust::AnnNode) -> io::Result<()> {
468468
match node {
469-
pprust::NodeIdent(&ast::Ident { name, ctxt }) => {
469+
pprust::NodeIdent(&ast::Ident { name, span }) => {
470470
s.s.space()?;
471471
// FIXME #16420: this doesn't display the connections
472472
// between syntax contexts
473-
s.synth_comment(format!("{}{:?}", name.as_u32(), ctxt))
473+
s.synth_comment(format!("{}{:?}", name.as_u32(), span.ctxt()))
474474
}
475475
pprust::NodeName(&name) => {
476476
s.s.space()?;

src/librustc_privacy/lib.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ use rustc::util::nodemap::NodeSet;
3535
use syntax::ast::{self, CRATE_NODE_ID, Ident};
3636
use syntax::symbol::keywords;
3737
use syntax_pos::Span;
38-
use syntax_pos::hygiene::SyntaxContext;
3938

4039
use std::cmp;
4140
use std::mem::replace;
@@ -495,11 +494,11 @@ struct NamePrivacyVisitor<'a, 'tcx: 'a> {
495494
impl<'a, 'tcx> NamePrivacyVisitor<'a, 'tcx> {
496495
// Checks that a field in a struct constructor (expression or pattern) is accessible.
497496
fn check_field(&mut self,
498-
use_ctxt: SyntaxContext, // Syntax context of the field name at the use site
497+
use_ctxt: Span, // Syntax context of the field name at the use site
499498
span: Span, // Span of the field pattern, e.g. `x: 0`
500499
def: &'tcx ty::AdtDef, // Definition of the struct or enum
501500
field: &'tcx ty::FieldDef) { // Definition of the field
502-
let ident = Ident { ctxt: use_ctxt.modern(), ..keywords::Invalid.ident() };
501+
let ident = Ident::new(keywords::Invalid.name(), use_ctxt.modern());
503502
let def_id = self.tcx.adjust_ident(ident, def.did, self.current_item).1;
504503
if !def.is_enum() && !field.vis.is_accessible_from(def_id, self.tcx) {
505504
struct_span_err!(self.tcx.sess, span, E0451, "field `{}` of {} `{}` is private",
@@ -573,14 +572,14 @@ impl<'a, 'tcx> Visitor<'tcx> for NamePrivacyVisitor<'a, 'tcx> {
573572
for variant_field in &variant.fields {
574573
let field = fields.iter().find(|f| f.name.node == variant_field.name);
575574
let (use_ctxt, span) = match field {
576-
Some(field) => (field.name.node.to_ident().ctxt, field.span),
577-
None => (base.span.ctxt(), base.span),
575+
Some(field) => (field.name.node.to_ident().span, field.span),
576+
None => (base.span, base.span),
578577
};
579578
self.check_field(use_ctxt, span, adt, variant_field);
580579
}
581580
} else {
582581
for field in fields {
583-
let use_ctxt = field.name.node.to_ident().ctxt;
582+
let use_ctxt = field.name.node.to_ident().span;
584583
let field_def = variant.field_named(field.name.node);
585584
self.check_field(use_ctxt, field.span, adt, field_def);
586585
}
@@ -599,7 +598,7 @@ impl<'a, 'tcx> Visitor<'tcx> for NamePrivacyVisitor<'a, 'tcx> {
599598
let adt = self.tables.pat_ty(pat).ty_adt_def().unwrap();
600599
let variant = adt.variant_of_def(def);
601600
for field in fields {
602-
let use_ctxt = field.node.name.to_ident().ctxt;
601+
let use_ctxt = field.node.name.to_ident().span;
603602
let field_def = variant.field_named(field.node.name);
604603
self.check_field(use_ctxt, field.span, adt, field_def);
605604
}

src/librustc_resolve/build_reduced_graph.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ impl<'a> Resolver<'a> {
157157

158158
// Disallow `use $crate;`
159159
if source.name == keywords::DollarCrate.name() && path.segments.len() == 1 {
160-
let crate_root = self.resolve_crate_root(source.ctxt, true);
160+
let crate_root = self.resolve_crate_root(source.span.ctxt(), true);
161161
let crate_name = match crate_root.kind {
162162
ModuleKind::Def(_, name) => name,
163163
ModuleKind::Block(..) => unreachable!(),

src/librustc_resolve/lib.rs

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1912,10 +1912,11 @@ impl<'a> Resolver<'a> {
19121912
path_span: Span)
19131913
-> Option<LexicalScopeBinding<'a>> {
19141914
if ns == TypeNS {
1915-
ident.ctxt = if ident.name == keywords::SelfType.name() {
1916-
SyntaxContext::empty() // FIXME(jseyfried) improve `Self` hygiene
1915+
ident.span = if ident.name == keywords::SelfType.name() {
1916+
// FIXME(jseyfried) improve `Self` hygiene
1917+
ident.span.with_ctxt(SyntaxContext::empty())
19171918
} else {
1918-
ident.ctxt.modern()
1919+
ident.span.modern()
19191920
}
19201921
}
19211922

@@ -1931,10 +1932,10 @@ impl<'a> Resolver<'a> {
19311932

19321933
module = match self.ribs[ns][i].kind {
19331934
ModuleRibKind(module) => module,
1934-
MacroDefinition(def) if def == self.macro_def(ident.ctxt) => {
1935+
MacroDefinition(def) if def == self.macro_def(ident.span.ctxt()) => {
19351936
// If an invocation of this macro created `ident`, give up on `ident`
19361937
// and switch to `ident`'s source from the macro definition.
1937-
ident.ctxt.remove_mark();
1938+
ident.span.remove_mark();
19381939
continue
19391940
}
19401941
_ => continue,
@@ -1954,9 +1955,9 @@ impl<'a> Resolver<'a> {
19541955
}
19551956
}
19561957

1957-
ident.ctxt = ident.ctxt.modern();
1958+
ident.span = ident.span.modern();
19581959
loop {
1959-
module = unwrap_or!(self.hygienic_lexical_parent(module, &mut ident.ctxt), break);
1960+
module = unwrap_or!(self.hygienic_lexical_parent(module, &mut ident.span), break);
19601961
let orig_current_module = self.current_module;
19611962
self.current_module = module; // Lexical resolutions can never be a privacy error.
19621963
let result = self.resolve_ident_in_module_unadjusted(
@@ -1980,10 +1981,10 @@ impl<'a> Resolver<'a> {
19801981
}
19811982
}
19821983

1983-
fn hygienic_lexical_parent(&mut self, mut module: Module<'a>, ctxt: &mut SyntaxContext)
1984+
fn hygienic_lexical_parent(&mut self, mut module: Module<'a>, span: &mut Span)
19841985
-> Option<Module<'a>> {
1985-
if !module.expansion.is_descendant_of(ctxt.outer()) {
1986-
return Some(self.macro_def_scope(ctxt.remove_mark()));
1986+
if !module.expansion.is_descendant_of(span.ctxt().outer()) {
1987+
return Some(self.macro_def_scope(span.remove_mark()));
19871988
}
19881989

19891990
if let ModuleKind::Block(..) = module.kind {
@@ -1995,7 +1996,7 @@ impl<'a> Resolver<'a> {
19951996
let parent_expansion = parent.expansion.modern();
19961997
if module_expansion.is_descendant_of(parent_expansion) &&
19971998
parent_expansion != module_expansion {
1998-
return if parent_expansion.is_descendant_of(ctxt.outer()) {
1999+
return if parent_expansion.is_descendant_of(span.ctxt().outer()) {
19992000
Some(parent)
20002001
} else {
20012002
None
@@ -2016,9 +2017,9 @@ impl<'a> Resolver<'a> {
20162017
record_used: bool,
20172018
span: Span)
20182019
-> Result<&'a NameBinding<'a>, Determinacy> {
2019-
ident.ctxt = ident.ctxt.modern();
2020+
ident.span = ident.span.modern();
20202021
let orig_current_module = self.current_module;
2021-
if let Some(def) = ident.ctxt.adjust(module.expansion) {
2022+
if let Some(def) = ident.span.adjust(module.expansion) {
20222023
self.current_module = self.macro_def_scope(def);
20232024
}
20242025
let result = self.resolve_ident_in_module_unadjusted(
@@ -2108,8 +2109,8 @@ impl<'a> Resolver<'a> {
21082109
// If an invocation of this macro created `ident`, give up on `ident`
21092110
// and switch to `ident`'s source from the macro definition.
21102111
MacroDefinition(def) => {
2111-
if def == self.macro_def(ident.ctxt) {
2112-
ident.ctxt.remove_mark();
2112+
if def == self.macro_def(ident.span.ctxt()) {
2113+
ident.span.remove_mark();
21132114
}
21142115
}
21152116
_ => {
@@ -2873,7 +2874,7 @@ impl<'a> Resolver<'a> {
28732874
}
28742875
if path.len() == 1 && this.self_type_is_available(span) {
28752876
if let Some(candidate) = this.lookup_assoc_candidate(ident.node, ns, is_expected) {
2876-
let self_is_available = this.self_value_is_available(path[0].node.ctxt, span);
2877+
let self_is_available = this.self_value_is_available(path[0].node.span, span);
28772878
match candidate {
28782879
AssocSuggestion::Field => {
28792880
err.span_suggestion(span, "try",
@@ -3084,9 +3085,9 @@ impl<'a> Resolver<'a> {
30843085
if let Some(LexicalScopeBinding::Def(def)) = binding { def != Def::Err } else { false }
30853086
}
30863087

3087-
fn self_value_is_available(&mut self, ctxt: SyntaxContext, span: Span) -> bool {
3088-
let ident = Ident { name: keywords::SelfValue.name(), ctxt: ctxt };
3089-
let binding = self.resolve_ident_in_lexical_scope(ident, ValueNS, false, span);
3088+
fn self_value_is_available(&mut self, self_span: Span, path_span: Span) -> bool {
3089+
let ident = Ident::new(keywords::SelfValue.name(), self_span);
3090+
let binding = self.resolve_ident_in_lexical_scope(ident, ValueNS, false, path_span);
30903091
if let Some(LexicalScopeBinding::Def(def)) = binding { def != Def::Err } else { false }
30913092
}
30923093

@@ -3219,11 +3220,11 @@ impl<'a> Resolver<'a> {
32193220
let name = ident.node.name;
32203221

32213222
if i == 0 && ns == TypeNS && name == keywords::SelfValue.name() {
3222-
let mut ctxt = ident.node.ctxt.modern();
3223+
let mut ctxt = ident.node.span.ctxt().modern();
32233224
module = Some(self.resolve_self(&mut ctxt, self.current_module));
32243225
continue
32253226
} else if allow_super && ns == TypeNS && name == keywords::Super.name() {
3226-
let mut ctxt = ident.node.ctxt.modern();
3227+
let mut ctxt = ident.node.span.ctxt().modern();
32273228
let self_module = match i {
32283229
0 => self.resolve_self(&mut ctxt, self.current_module),
32293230
_ => module.unwrap(),
@@ -3245,11 +3246,11 @@ impl<'a> Resolver<'a> {
32453246
(i == 1 && name == keywords::Crate.name() &&
32463247
path[0].node.name == keywords::CrateRoot.name()) {
32473248
// `::a::b` or `::crate::a::b`
3248-
module = Some(self.resolve_crate_root(ident.node.ctxt, false));
3249+
module = Some(self.resolve_crate_root(ident.node.span.ctxt(), false));
32493250
continue
32503251
} else if i == 0 && name == keywords::DollarCrate.name() {
32513252
// `$crate::a::b`
3252-
module = Some(self.resolve_crate_root(ident.node.ctxt, true));
3253+
module = Some(self.resolve_crate_root(ident.node.span.ctxt(), true));
32533254
continue
32543255
} else if i == 1 && !token::is_path_segment_keyword(ident.node) {
32553256
let prev_name = path[0].node.name;
@@ -3771,12 +3772,12 @@ impl<'a> Resolver<'a> {
37713772
}
37723773
}
37733774

3774-
ident.ctxt = ident.ctxt.modern();
3775+
ident.span = ident.span.modern();
37753776
let mut search_module = self.current_module;
37763777
loop {
37773778
self.get_traits_in_module_containing_item(ident, ns, search_module, &mut found_traits);
37783779
search_module =
3779-
unwrap_or!(self.hygienic_lexical_parent(search_module, &mut ident.ctxt), break);
3780+
unwrap_or!(self.hygienic_lexical_parent(search_module, &mut ident.span), break);
37803781
}
37813782

37823783
if let Some(prelude) = self.prelude {
@@ -3808,7 +3809,7 @@ impl<'a> Resolver<'a> {
38083809
for &(trait_name, binding) in traits.as_ref().unwrap().iter() {
38093810
let module = binding.module().unwrap();
38103811
let mut ident = ident;
3811-
if ident.ctxt.glob_adjust(module.expansion, binding.span.ctxt().modern()).is_none() {
3812+
if ident.span.glob_adjust(module.expansion, binding.span.ctxt().modern()).is_none() {
38123813
continue
38133814
}
38143815
if self.resolve_ident_in_module_unadjusted(module, ident, ns, false, false, module.span)

src/librustc_resolve/macros.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ impl<'a> base::Resolver for Resolver<'a> {
140140
let ident = path.segments[0].identifier;
141141
if ident.name == keywords::DollarCrate.name() {
142142
path.segments[0].identifier.name = keywords::CrateRoot.name();
143-
let module = self.0.resolve_crate_root(ident.ctxt, true);
143+
let module = self.0.resolve_crate_root(ident.span.ctxt(), true);
144144
if !module.is_local() {
145145
let span = path.segments[0].span;
146146
path.segments.insert(1, match module.kind {
@@ -534,7 +534,7 @@ impl<'a> Resolver<'a> {
534534
}
535535

536536
module = match module {
537-
Some(module) => self.hygienic_lexical_parent(module, &mut ident.ctxt),
537+
Some(module) => self.hygienic_lexical_parent(module, &mut ident.span),
538538
None => return potential_illegal_shadower,
539539
}
540540
}

src/librustc_resolve/resolve_imports.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ impl<'a> Resolver<'a> {
238238
}
239239
let module = unwrap_or!(directive.imported_module.get(), return Err(Undetermined));
240240
let (orig_current_module, mut ident) = (self.current_module, ident.modern());
241-
match ident.ctxt.glob_adjust(module.expansion, directive.span.ctxt().modern()) {
241+
match ident.span.glob_adjust(module.expansion, directive.span.ctxt().modern()) {
242242
Some(Some(def)) => self.current_module = self.macro_def_scope(def),
243243
Some(None) => {}
244244
None => continue,
@@ -398,7 +398,7 @@ impl<'a> Resolver<'a> {
398398
// Define `binding` in `module`s glob importers.
399399
for directive in module.glob_importers.borrow_mut().iter() {
400400
let mut ident = ident.modern();
401-
let scope = match ident.ctxt.reverse_glob_adjust(module.expansion,
401+
let scope = match ident.span.reverse_glob_adjust(module.expansion,
402402
directive.span.ctxt().modern()) {
403403
Some(Some(def)) => self.macro_def_scope(def),
404404
Some(None) => directive.parent,
@@ -623,7 +623,7 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> {
623623
"crate root imports need to be explicitly named: \
624624
`use crate as name;`".to_string()));
625625
} else {
626-
Some(self.resolve_crate_root(source.ctxt.modern(), false))
626+
Some(self.resolve_crate_root(source.span.ctxt().modern(), false))
627627
}
628628
} else if is_extern && !token::is_path_segment_keyword(source) {
629629
let crate_id =
@@ -860,7 +860,7 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> {
860860
resolution.borrow().binding().map(|binding| (ident, binding))
861861
}).collect::<Vec<_>>();
862862
for ((mut ident, ns), binding) in bindings {
863-
let scope = match ident.ctxt.reverse_glob_adjust(module.expansion,
863+
let scope = match ident.span.reverse_glob_adjust(module.expansion,
864864
directive.span.ctxt().modern()) {
865865
Some(Some(def)) => self.macro_def_scope(def),
866866
Some(None) => self.current_module,

0 commit comments

Comments
 (0)