Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
32575a04
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
32575a04
编写于
3月 08, 2017
作者:
V
Vadim Petrochenkov
提交者:
Alex Crichton
3月 10, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Give spans to individual path segments in AST
上级
f573db4f
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
60 addition
and
41 deletion
+60
-41
src/librustc_resolve/lib.rs
src/librustc_resolve/lib.rs
+3
-4
src/librustc_resolve/macros.rs
src/librustc_resolve/macros.rs
+4
-1
src/libsyntax/ast.rs
src/libsyntax/ast.rs
+7
-7
src/libsyntax/ext/build.rs
src/libsyntax/ext/build.rs
+12
-7
src/libsyntax/fold.rs
src/libsyntax/fold.rs
+2
-1
src/libsyntax/parse/mod.rs
src/libsyntax/parse/mod.rs
+11
-7
src/libsyntax/parse/parser.rs
src/libsyntax/parse/parser.rs
+18
-11
src/libsyntax/std_inject.rs
src/libsyntax/std_inject.rs
+1
-1
src/libsyntax/test.rs
src/libsyntax/test.rs
+1
-1
src/libsyntax_ext/concat_idents.rs
src/libsyntax_ext/concat_idents.rs
+1
-1
未找到文件。
src/librustc_resolve/lib.rs
浏览文件 @
32575a04
...
...
@@ -3124,11 +3124,10 @@ fn lookup_import_candidates<FilterFn>(&mut self,
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:
...
...
@@ -3148,7 +3147,7 @@ fn lookup_import_candidates<FilterFn>(&mut self,
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
...
...
src/librustc_resolve/macros.rs
浏览文件 @
32575a04
...
...
@@ -110,8 +110,11 @@ fn fold_path(&mut self, mut path: ast::Path) -> ast::Path {
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!
(),
})
}
...
...
src/libsyntax/ast.rs
浏览文件 @
32575a04
...
...
@@ -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
)],
}
}
...
...
@@ -159,6 +159,8 @@ pub fn is_global(&self) -> bool {
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
...
...
@@ -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
,
}
}
...
...
src/libsyntax/ext/build.rs
浏览文件 @
32575a04
...
...
@@ -38,11 +38,11 @@ fn path_all(&self, sp: Span,
fn
qpath
(
&
self
,
self_type
:
P
<
ast
::
Ty
>
,
trait_path
:
ast
::
Path
,
ident
:
ast
::
Ident
)
ident
:
ast
::
Spanned
Ident
)
->
(
ast
::
QSelf
,
ast
::
Path
);
fn
qpath_all
(
&
self
,
self_type
:
P
<
ast
::
Ty
>
,
trait_path
:
ast
::
Path
,
ident
:
ast
::
Ident
,
ident
:
ast
::
Spanned
Ident
,
lifetimes
:
Vec
<
ast
::
Lifetime
>
,
types
:
Vec
<
P
<
ast
::
Ty
>>
,
bindings
:
Vec
<
ast
::
TypeBinding
>
)
...
...
@@ -323,7 +323,7 @@ fn path_all(&self,
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
{
...
...
@@ -333,7 +333,11 @@ fn path_all(&self,
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
,
...
...
@@ -346,7 +350,7 @@ fn path_all(&self,
fn
qpath
(
&
self
,
self_type
:
P
<
ast
::
Ty
>
,
trait_path
:
ast
::
Path
,
ident
:
ast
::
Ident
)
ident
:
ast
::
Spanned
Ident
)
->
(
ast
::
QSelf
,
ast
::
Path
)
{
self
.qpath_all
(
self_type
,
trait_path
,
ident
,
vec!
[],
vec!
[],
vec!
[])
}
...
...
@@ -357,7 +361,7 @@ fn qpath(&self,
fn
qpath_all
(
&
self
,
self_type
:
P
<
ast
::
Ty
>
,
trait_path
:
ast
::
Path
,
ident
:
ast
::
Ident
,
ident
:
ast
::
Spanned
Ident
,
lifetimes
:
Vec
<
ast
::
Lifetime
>
,
types
:
Vec
<
P
<
ast
::
Ty
>>
,
bindings
:
Vec
<
ast
::
TypeBinding
>
)
...
...
@@ -369,7 +373,8 @@ fn qpath_all(&self,
bindings
:
bindings
,
};
path
.segments
.push
(
ast
::
PathSegment
{
identifier
:
ident
,
identifier
:
ident
.node
,
span
:
ident
.span
,
parameters
:
Some
(
P
(
ast
::
PathParameters
::
AngleBracketed
(
parameters
))),
});
...
...
src/libsyntax/fold.rs
浏览文件 @
32575a04
...
...
@@ -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
)
...
...
src/libsyntax/parse/mod.rs
浏览文件 @
32575a04
...
...
@@ -617,13 +617,17 @@ fn sp(a: u32, b: u32) -> Span {
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
(),
...
...
@@ -637,8 +641,8 @@ fn sp(a: u32, b: u32) -> Span {
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
(),
...
...
@@ -744,7 +748,7 @@ fn string_to_tts_1() {
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
(),
...
...
@@ -761,7 +765,7 @@ fn string_to_tts_1() {
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
()})),
...
...
@@ -802,7 +806,7 @@ fn parser_done(p: Parser){
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
)
}),
...
...
@@ -844,7 +848,7 @@ fn parser_done(p: Parser){
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
()})),
...
...
src/libsyntax/parse/parser.rs
浏览文件 @
32575a04
...
...
@@ -27,7 +27,7 @@
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
};
...
...
@@ -1811,7 +1811,7 @@ pub fn parse_path(&mut self, mode: PathStyle) -> PResult<'a, ast::Path> {
};
if
is_global
{
segments
.insert
(
0
,
ast
::
PathSegment
::
crate_root
());
segments
.insert
(
0
,
PathSegment
::
crate_root
());
}
// Assemble the span.
...
...
@@ -1829,11 +1829,12 @@ pub fn parse_path(&mut self, mode: PathStyle) -> PResult<'a, ast::Path> {
/// - `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
();
...
...
@@ -1881,7 +1882,11 @@ pub fn parse_path_segments_without_colons(&mut self) -> PResult<'a, Vec<ast::Pat
};
// 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
)
{
...
...
@@ -1892,15 +1897,16 @@ pub fn parse_path_segments_without_colons(&mut self) -> PResult<'a, Vec<ast::Pat
/// 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
);
}
...
...
@@ -1909,8 +1915,9 @@ pub fn parse_path_segments_with_colons(&mut self) -> PResult<'a, Vec<ast::PathSe
// 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
,
...
...
@@ -1924,7 +1931,7 @@ pub fn parse_path_segments_with_colons(&mut self) -> PResult<'a, Vec<ast::PathSe
}
}
else
{
// Consumed `a::`, go look for `b`
segments
.push
(
identifier
.into
(
));
segments
.push
(
PathSegment
::
from_ident
(
identifier
,
ident_span
));
}
}
}
...
...
@@ -1932,14 +1939,14 @@ pub fn parse_path_segments_with_colons(&mut self) -> PResult<'a, Vec<ast::PathSe
/// 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
()
{
...
...
@@ -5902,7 +5909,7 @@ fn parse_view_path(&mut self) -> PResult<'a, P<ViewPath>> {
// `{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
))
{
...
...
src/libsyntax/std_inject.rs
浏览文件 @
32575a04
...
...
@@ -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
,
})))),
...
...
src/libsyntax/test.rs
浏览文件 @
32575a04
...
...
@@ -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
(),
}
}
...
...
src/libsyntax_ext/concat_idents.rs
浏览文件 @
32575a04
...
...
@@ -61,7 +61,7 @@ impl Result {
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
)],
}
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录