Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
8a64cf7
Fix suggestion span error with a line containing non-ASCIIs
sinkuu Feb 25, 2017
53d3c89
Dont bug! on user error
bjorn3 Feb 28, 2017
54a1c8b
Fix indentation in region infer docs
bjorn3 Feb 28, 2017
2a40918
Syntax highlighting in region infer docs
bjorn3 Feb 28, 2017
be49671
Improve a bit more
bjorn3 Feb 28, 2017
90e94d9
Syntax highlight and note about current rust in infer docs
bjorn3 Feb 28, 2017
9b31784
save-analysis: only index path references once
Mar 8, 2017
0aceb99
save-analysis: index extern blocks
Mar 8, 2017
c4275c2
rustc_trans: don't emit ZST allocas that are only assigned to.
eddyb Mar 8, 2017
df60044
rustc_trans: avoid a separate entry BB if START_BLOCK has no backedges.
eddyb Mar 8, 2017
2719b84
Give spans to individual path segments in AST
petrochenkov Mar 8, 2017
7cfe20c
resolve: Use path segment spans in smart_resolve_path
petrochenkov Mar 8, 2017
79a7ee8
fix UB in repr(packed) tests
TimNN Mar 8, 2017
c51a39d
Removed RustFMT changes
jdhorwitz Mar 8, 2017
edf5dc6
Box docs: no allocation is done for ZSTs.
Mar 9, 2017
14e9313
emit !align attributes on stores of operand pairs
arielb1 Mar 9, 2017
8062cfb
Implement placement-in protocol for and `VecDeque`
Mar 9, 2017
84d1f6a
Do not bother creating StorageLive for TyNever
nagisa Mar 8, 2017
4078b25
Clean up rustdoc css
GuillaumeGomez Mar 9, 2017
26faee0
Rollup merge of #40092 - sinkuu:fix_suggestion_index, r=pnkfelix
Mar 9, 2017
270cde9
Rollup merge of #40146 - bjorn3:few-infer-changes, r=pnkfelix
Mar 9, 2017
55de547
Rollup merge of #40278 - GuillaumeGomez:css-cleanup, r=frewsxcv
Mar 9, 2017
cb1d4c9
Rollup merge of #40312 - jdhorwitz:papercut, r=steveklabnik
Mar 9, 2017
d042c51
Rollup merge of #40348 - nrc:save-extern-fn, r=eddyb
Mar 9, 2017
72fc6d4
Rollup merge of #40367 - eddyb:naked-cruft, r=nagisa
Mar 9, 2017
a1b148e
Rollup merge of #40369 - petrochenkov:segspan, r=eddyb
Mar 9, 2017
7e710c5
Rollup merge of #40372 - nagisa:never-drop, r=eddyb
Mar 9, 2017
b933fc6
Rollup merge of #40373 - TimNN:test-ub-packed, r=arielb1
Mar 9, 2017
e63f4a6
Rollup merge of #40379 - clarcharr:box_docs, r=brson
Mar 9, 2017
0f9c735
Rollup merge of #40385 - arielb1:packed-again, r=eddyb
Mar 9, 2017
cf2165a
Rollup merge of #40389 - F001:placementVecDeque, r=nagisa
Mar 9, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Give spans to individual path segments in AST
  • Loading branch information
petrochenkov committed Mar 8, 2017
commit 2719b8493f4e9c47067ef09000ca0d182c12ef87
7 changes: 3 additions & 4 deletions src/librustc_resolve/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3124,11 +3124,10 @@ impl<'a> Resolver<'a> {
if ident.name == lookup_name && ns == namespace {
if filter_fn(name_binding.def()) {
// create the path
let span = name_binding.span;
let mut segms = path_segments.clone();
segms.push(ident.into());
segms.push(ast::PathSegment::from_ident(ident, name_binding.span));
let path = Path {
span: span,
span: name_binding.span,
segments: segms,
};
// the entity is accessible in the following cases:
Expand All @@ -3148,7 +3147,7 @@ impl<'a> Resolver<'a> {
if let Some(module) = name_binding.module() {
// form the path
let mut path_segments = path_segments.clone();
path_segments.push(ident.into());
path_segments.push(ast::PathSegment::from_ident(ident, name_binding.span));

if !in_module_is_extern || name_binding.vis == ty::Visibility::Public {
// add the module to the lookup
Expand Down
5 changes: 4 additions & 1 deletion src/librustc_resolve/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,11 @@ impl<'a> base::Resolver for Resolver<'a> {
path.segments[0].identifier.name = keywords::CrateRoot.name();
let module = self.0.resolve_crate_var(ident.ctxt);
if !module.is_local() {
let span = path.segments[0].span;
path.segments.insert(1, match module.kind {
ModuleKind::Def(_, name) => ast::Ident::with_empty_ctxt(name).into(),
ModuleKind::Def(_, name) => ast::PathSegment::from_ident(
ast::Ident::with_empty_ctxt(name), span
),
_ => unreachable!(),
})
}
Expand Down
14 changes: 7 additions & 7 deletions src/libsyntax/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ impl Path {
pub fn from_ident(s: Span, identifier: Ident) -> Path {
Path {
span: s,
segments: vec![identifier.into()],
segments: vec![PathSegment::from_ident(identifier, s)],
}
}

Expand All @@ -159,6 +159,8 @@ impl Path {
pub struct PathSegment {
/// The identifier portion of this path segment.
pub identifier: Ident,
/// Span of the segment identifier.
pub span: Span,

/// Type/lifetime parameters attached to this path. They come in
/// two flavors: `Path<A,B,C>` and `Path(A,B) -> C`. Note that
Expand All @@ -170,16 +172,14 @@ pub struct PathSegment {
pub parameters: Option<P<PathParameters>>,
}

impl From<Ident> for PathSegment {
fn from(id: Ident) -> Self {
PathSegment { identifier: id, parameters: None }
}
}

impl PathSegment {
pub fn from_ident(ident: Ident, span: Span) -> Self {
PathSegment { identifier: ident, span: span, parameters: None }
}
pub fn crate_root() -> Self {
PathSegment {
identifier: keywords::CrateRoot.ident(),
span: DUMMY_SP,
parameters: None,
}
}
Expand Down
19 changes: 12 additions & 7 deletions src/libsyntax/ext/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,11 @@ pub trait AstBuilder {

fn qpath(&self, self_type: P<ast::Ty>,
trait_path: ast::Path,
ident: ast::Ident)
ident: ast::SpannedIdent)
-> (ast::QSelf, ast::Path);
fn qpath_all(&self, self_type: P<ast::Ty>,
trait_path: ast::Path,
ident: ast::Ident,
ident: ast::SpannedIdent,
lifetimes: Vec<ast::Lifetime>,
types: Vec<P<ast::Ty>>,
bindings: Vec<ast::TypeBinding>)
Expand Down Expand Up @@ -323,7 +323,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
segments.push(ast::PathSegment::crate_root());
}

segments.extend(idents.into_iter().map(Into::into));
segments.extend(idents.into_iter().map(|i| ast::PathSegment::from_ident(i, sp)));
let parameters = if lifetimes.is_empty() && types.is_empty() && bindings.is_empty() {
None
} else {
Expand All @@ -333,7 +333,11 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
bindings: bindings,
})))
};
segments.push(ast::PathSegment { identifier: last_identifier, parameters: parameters });
segments.push(ast::PathSegment {
identifier: last_identifier,
span: sp,
parameters: parameters
});
ast::Path {
span: sp,
segments: segments,
Expand All @@ -346,7 +350,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
fn qpath(&self,
self_type: P<ast::Ty>,
trait_path: ast::Path,
ident: ast::Ident)
ident: ast::SpannedIdent)
-> (ast::QSelf, ast::Path) {
self.qpath_all(self_type, trait_path, ident, vec![], vec![], vec![])
}
Expand All @@ -357,7 +361,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
fn qpath_all(&self,
self_type: P<ast::Ty>,
trait_path: ast::Path,
ident: ast::Ident,
ident: ast::SpannedIdent,
lifetimes: Vec<ast::Lifetime>,
types: Vec<P<ast::Ty>>,
bindings: Vec<ast::TypeBinding>)
Expand All @@ -369,7 +373,8 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
bindings: bindings,
};
path.segments.push(ast::PathSegment {
identifier: ident,
identifier: ident.node,
span: ident.span,
parameters: Some(P(ast::PathParameters::AngleBracketed(parameters))),
});

Expand Down
3 changes: 2 additions & 1 deletion src/libsyntax/fold.rs
Original file line number Diff line number Diff line change
Expand Up @@ -434,8 +434,9 @@ pub fn noop_fold_usize<T: Folder>(i: usize, _: &mut T) -> usize {

pub fn noop_fold_path<T: Folder>(Path { segments, span }: Path, fld: &mut T) -> Path {
Path {
segments: segments.move_map(|PathSegment {identifier, parameters}| PathSegment {
segments: segments.move_map(|PathSegment {identifier, span, parameters}| PathSegment {
identifier: fld.fold_ident(identifier),
span: fld.new_span(span),
parameters: parameters.map(|ps| ps.map(|ps| fld.fold_path_parameters(ps))),
}),
span: fld.new_span(span)
Expand Down
18 changes: 11 additions & 7 deletions src/libsyntax/parse/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -617,13 +617,17 @@ mod tests {
Span {lo: BytePos(a), hi: BytePos(b), expn_id: NO_EXPANSION}
}

fn str2seg(s: &str, lo: u32, hi: u32) -> ast::PathSegment {
ast::PathSegment::from_ident(Ident::from_str(s), sp(lo, hi))
}

#[test] fn path_exprs_1() {
assert!(string_to_expr("a".to_string()) ==
P(ast::Expr{
id: ast::DUMMY_NODE_ID,
node: ast::ExprKind::Path(None, ast::Path {
span: sp(0, 1),
segments: vec![Ident::from_str("a").into()],
segments: vec![str2seg("a", 0, 1)],
}),
span: sp(0, 1),
attrs: ThinVec::new(),
Expand All @@ -637,8 +641,8 @@ mod tests {
node: ast::ExprKind::Path(None, ast::Path {
span: sp(0, 6),
segments: vec![ast::PathSegment::crate_root(),
Ident::from_str("a").into(),
Ident::from_str("b").into()]
str2seg("a", 2, 3),
str2seg("b", 5, 6)]
}),
span: sp(0, 6),
attrs: ThinVec::new(),
Expand Down Expand Up @@ -744,7 +748,7 @@ mod tests {
id: ast::DUMMY_NODE_ID,
node:ast::ExprKind::Path(None, ast::Path{
span: sp(7, 8),
segments: vec![Ident::from_str("d").into()],
segments: vec![str2seg("d", 7, 8)],
}),
span:sp(7,8),
attrs: ThinVec::new(),
Expand All @@ -761,7 +765,7 @@ mod tests {
id: ast::DUMMY_NODE_ID,
node: ast::ExprKind::Path(None, ast::Path {
span:sp(0,1),
segments: vec![Ident::from_str("b").into()],
segments: vec![str2seg("b", 0, 1)],
}),
span: sp(0,1),
attrs: ThinVec::new()})),
Expand Down Expand Up @@ -802,7 +806,7 @@ mod tests {
ty: P(ast::Ty{id: ast::DUMMY_NODE_ID,
node: ast::TyKind::Path(None, ast::Path{
span:sp(10,13),
segments: vec![Ident::from_str("i32").into()],
segments: vec![str2seg("i32", 10, 13)],
}),
span:sp(10,13)
}),
Expand Down Expand Up @@ -844,7 +848,7 @@ mod tests {
node: ast::ExprKind::Path(None,
ast::Path{
span:sp(17,18),
segments: vec![Ident::from_str("b").into()],
segments: vec![str2seg("b", 17, 18)],
}),
span: sp(17,18),
attrs: ThinVec::new()})),
Expand Down
29 changes: 18 additions & 11 deletions src/libsyntax/parse/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ use ast::Local;
use ast::MacStmtStyle;
use ast::Mac_;
use ast::{MutTy, Mutability};
use ast::{Pat, PatKind};
use ast::{Pat, PatKind, PathSegment};
use ast::{PolyTraitRef, QSelf};
use ast::{Stmt, StmtKind};
use ast::{VariantData, StructField};
Expand Down Expand Up @@ -1811,7 +1811,7 @@ impl<'a> Parser<'a> {
};

if is_global {
segments.insert(0, ast::PathSegment::crate_root());
segments.insert(0, PathSegment::crate_root());
}

// Assemble the span.
Expand All @@ -1829,11 +1829,12 @@ impl<'a> Parser<'a> {
/// - `a::b<T,U>::c<V,W>`
/// - `a::b<T,U>::c(V) -> W`
/// - `a::b<T,U>::c(V)`
pub fn parse_path_segments_without_colons(&mut self) -> PResult<'a, Vec<ast::PathSegment>> {
pub fn parse_path_segments_without_colons(&mut self) -> PResult<'a, Vec<PathSegment>> {
let mut segments = Vec::new();
loop {
// First, parse an identifier.
let identifier = self.parse_path_segment_ident()?;
let ident_span = self.prev_span;

if self.check(&token::ModSep) && self.look_ahead(1, |t| *t == token::Lt) {
self.bump();
Expand Down Expand Up @@ -1881,7 +1882,11 @@ impl<'a> Parser<'a> {
};

// Assemble and push the result.
segments.push(ast::PathSegment { identifier: identifier, parameters: parameters });
segments.push(PathSegment {
identifier: identifier,
span: ident_span,
parameters: parameters
});

// Continue only if we see a `::`
if !self.eat(&token::ModSep) {
Expand All @@ -1892,15 +1897,16 @@ impl<'a> Parser<'a> {

/// Examples:
/// - `a::b::<T,U>::c`
pub fn parse_path_segments_with_colons(&mut self) -> PResult<'a, Vec<ast::PathSegment>> {
pub fn parse_path_segments_with_colons(&mut self) -> PResult<'a, Vec<PathSegment>> {
let mut segments = Vec::new();
loop {
// First, parse an identifier.
let identifier = self.parse_path_segment_ident()?;
let ident_span = self.prev_span;

// If we do not see a `::`, stop.
if !self.eat(&token::ModSep) {
segments.push(identifier.into());
segments.push(PathSegment::from_ident(identifier, ident_span));
return Ok(segments);
}

Expand All @@ -1909,8 +1915,9 @@ impl<'a> Parser<'a> {
// Consumed `a::b::<`, go look for types
let (lifetimes, types, bindings) = self.parse_generic_args()?;
self.expect_gt()?;
segments.push(ast::PathSegment {
segments.push(PathSegment {
identifier: identifier,
span: ident_span,
parameters: ast::AngleBracketedParameterData {
lifetimes: lifetimes,
types: types,
Expand All @@ -1924,22 +1931,22 @@ impl<'a> Parser<'a> {
}
} else {
// Consumed `a::`, go look for `b`
segments.push(identifier.into());
segments.push(PathSegment::from_ident(identifier, ident_span));
}
}
}

/// Examples:
/// - `a::b::c`
pub fn parse_path_segments_without_types(&mut self)
-> PResult<'a, Vec<ast::PathSegment>> {
-> PResult<'a, Vec<PathSegment>> {
let mut segments = Vec::new();
loop {
// First, parse an identifier.
let identifier = self.parse_path_segment_ident()?;

// Assemble and push the result.
segments.push(identifier.into());
segments.push(PathSegment::from_ident(identifier, self.prev_span));

// If we do not see a `::` or see `::{`/`::*`, stop.
if !self.check(&token::ModSep) || self.is_import_coupler() {
Expand Down Expand Up @@ -5902,7 +5909,7 @@ impl<'a> Parser<'a> {
// `{foo, bar}`, `::{foo, bar}`, `*`, or `::*`.
self.eat(&token::ModSep);
let prefix = ast::Path {
segments: vec![ast::PathSegment::crate_root()],
segments: vec![PathSegment::crate_root()],
span: mk_sp(lo, self.span.hi),
};
let view_path_kind = if self.eat(&token::BinOp(token::Star)) {
Expand Down
2 changes: 1 addition & 1 deletion src/libsyntax/std_inject.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ pub fn maybe_inject_crates_ref(sess: &ParseSess,
vis: ast::Visibility::Inherited,
node: ast::ItemKind::Use(P(codemap::dummy_spanned(ast::ViewPathGlob(ast::Path {
segments: ["{{root}}", name, "prelude", "v1"].into_iter().map(|name| {
ast::Ident::from_str(name).into()
ast::PathSegment::from_ident(ast::Ident::from_str(name), DUMMY_SP)
}).collect(),
span: span,
})))),
Expand Down
2 changes: 1 addition & 1 deletion src/libsyntax/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -580,7 +580,7 @@ fn nospan<T>(t: T) -> codemap::Spanned<T> {
fn path_node(ids: Vec<Ident>) -> ast::Path {
ast::Path {
span: DUMMY_SP,
segments: ids.into_iter().map(Into::into).collect(),
segments: ids.into_iter().map(|id| ast::PathSegment::from_ident(id, DUMMY_SP)).collect(),
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/libsyntax_ext/concat_idents.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ pub fn expand_syntax_ext<'cx>(cx: &'cx mut ExtCtxt,
fn path(&self) -> ast::Path {
ast::Path {
span: self.span,
segments: vec![self.ident.into()],
segments: vec![ast::PathSegment::from_ident(self.ident, self.span)],
}
}
}
Expand Down