Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
e9e8514c
R
Rust
项目概览
int
/
Rust
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
e9e8514c
编写于
5月 22, 2018
作者:
N
Niko Matsakis
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add `Span` information into `Qself`
上级
d034ae53
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
57 addition
and
10 deletion
+57
-10
src/librustc_resolve/lib.rs
src/librustc_resolve/lib.rs
+21
-0
src/libsyntax/ast.rs
src/libsyntax/ast.rs
+5
-0
src/libsyntax/ext/build.rs
src/libsyntax/ext/build.rs
+1
-0
src/libsyntax/fold.rs
src/libsyntax/fold.rs
+9
-3
src/libsyntax/parse/parser.rs
src/libsyntax/parse/parser.rs
+21
-7
未找到文件。
src/librustc_resolve/lib.rs
浏览文件 @
e9e8514c
...
...
@@ -3139,6 +3139,17 @@ fn resolve_qpath(&mut self,
span
:
Span
,
global_by_default
:
bool
)
->
Option
<
PathResolution
>
{
debug!
(
"resolve_qpath(id={:?}, qself={:?}, path={:?},
\
ns={:?}, span={:?}, global_by_default={:?})"
,
id
,
qself
,
path
,
ns
,
span
,
global_by_default
,
);
if
let
Some
(
qself
)
=
qself
{
if
qself
.position
==
0
{
// FIXME: Create some fake resolution that can't possibly be a type.
...
...
@@ -3231,6 +3242,15 @@ fn resolve_path(
let
mut
allow_super
=
true
;
let
mut
second_binding
=
None
;
debug!
(
"resolve_path(path={:?}, opt_ns={:?}, record_used={:?}, path_span={:?}, crate_lint={:?})"
,
path
,
opt_ns
,
record_used
,
path_span
,
crate_lint
,
);
for
(
i
,
&
ident
)
in
path
.iter
()
.enumerate
()
{
debug!
(
"resolve_path ident {} {:?}"
,
i
,
ident
);
let
is_last
=
i
==
path
.len
()
-
1
;
...
...
@@ -4454,6 +4474,7 @@ pub enum MakeGlobMap {
No
,
}
#[derive(Debug)]
enum
CrateLint
{
/// Do not issue the lint
No
,
...
...
src/libsyntax/ast.rs
浏览文件 @
e9e8514c
...
...
@@ -1211,6 +1211,11 @@ pub enum ExprKind {
#[derive(Clone,
PartialEq,
Eq,
RustcEncodable,
RustcDecodable,
Hash,
Debug)]
pub
struct
QSelf
{
pub
ty
:
P
<
Ty
>
,
/// The span of `a::b::Trait` in a path like `<Vec<T> as
/// a::b::Trait>::AssociatedItem`; in the case where `position ==
/// 0`, this is an empty span.
pub
path_span
:
Span
,
pub
position
:
usize
}
...
...
src/libsyntax/ext/build.rs
浏览文件 @
e9e8514c
...
...
@@ -373,6 +373,7 @@ fn qpath_all(&self,
(
ast
::
QSelf
{
ty
:
self_type
,
path_span
:
path
.span
,
position
:
path
.segments
.len
()
-
1
},
path
)
}
...
...
src/libsyntax/fold.rs
浏览文件 @
e9e8514c
...
...
@@ -390,9 +390,10 @@ pub fn noop_fold_ty<T: Folder>(t: P<Ty>, fld: &mut T) -> P<Ty> {
TyKind
::
Tup
(
tys
)
=>
TyKind
::
Tup
(
tys
.move_map
(|
ty
|
fld
.fold_ty
(
ty
))),
TyKind
::
Paren
(
ty
)
=>
TyKind
::
Paren
(
fld
.fold_ty
(
ty
)),
TyKind
::
Path
(
qself
,
path
)
=>
{
let
qself
=
qself
.map
(|
QSelf
{
ty
,
position
}|
{
let
qself
=
qself
.map
(|
QSelf
{
ty
,
p
ath_span
,
p
osition
}|
{
QSelf
{
ty
:
fld
.fold_ty
(
ty
),
path_span
:
fld
.new_span
(
path_span
),
position
,
}
});
...
...
@@ -1131,7 +1132,11 @@ pub fn noop_fold_pat<T: Folder>(p: P<Pat>, folder: &mut T) -> P<Pat> {
}
PatKind
::
Path
(
opt_qself
,
pth
)
=>
{
let
opt_qself
=
opt_qself
.map
(|
qself
|
{
QSelf
{
ty
:
folder
.fold_ty
(
qself
.ty
),
position
:
qself
.position
}
QSelf
{
ty
:
folder
.fold_ty
(
qself
.ty
),
path_span
:
folder
.new_span
(
qself
.path_span
),
position
:
qself
.position
,
}
});
PatKind
::
Path
(
opt_qself
,
folder
.fold_path
(
pth
))
}
...
...
@@ -1292,9 +1297,10 @@ pub fn noop_fold_expr<T: Folder>(Expr {id, node, span, attrs}: Expr, folder: &mu
lim
)
}
ExprKind
::
Path
(
qself
,
path
)
=>
{
let
qself
=
qself
.map
(|
QSelf
{
ty
,
position
}|
{
let
qself
=
qself
.map
(|
QSelf
{
ty
,
p
ath_span
,
p
osition
}|
{
QSelf
{
ty
:
folder
.fold_ty
(
ty
),
path_span
:
folder
.new_span
(
path_span
),
position
,
}
});
...
...
src/libsyntax/parse/parser.rs
浏览文件 @
e9e8514c
...
...
@@ -1715,8 +1715,11 @@ fn maybe_recover_from_bad_qpath<T: RecoverQPath>(&mut self, base: T, allow_recov
self
.parse_path_segments
(
&
mut
segments
,
T
::
PATH_STYLE
,
true
)
?
;
let
span
=
ty
.span
.to
(
self
.prev_span
);
let
recovered
=
base
.to_recovered
(
Some
(
QSelf
{
ty
,
position
:
0
}),
ast
::
Path
{
segments
,
span
});
let
path_span
=
span
.to
(
span
);
// use an empty path since `position` == 0
let
recovered
=
base
.to_recovered
(
Some
(
QSelf
{
ty
,
path_span
,
position
:
0
}),
ast
::
Path
{
segments
,
span
},
);
self
.diagnostic
()
.struct_span_err
(
span
,
"missing angle brackets in associated item path"
)
...
...
@@ -1905,21 +1908,32 @@ pub fn parse_path_segment_ident(&mut self) -> PResult<'a, ast::Ident> {
/// `qualified_path = <type [as trait_ref]>::path`
///
/// # Examples
/// `<T>::default`
/// `<T as U>::a`
/// `<T as U>::F::a<S>` (without disambiguator)
/// `<T as U>::F::a::<S>` (with disambiguator)
fn
parse_qpath
(
&
mut
self
,
style
:
PathStyle
)
->
PResult
<
'a
,
(
QSelf
,
ast
::
Path
)
>
{
let
lo
=
self
.prev_span
;
let
ty
=
self
.parse_ty
()
?
;
let
mut
path
=
if
self
.eat_keyword
(
keywords
::
As
)
{
self
.parse_path
(
PathStyle
::
Type
)
?
// `path` will contain the prefix of the path up to the `>`,
// if any (e.g., `U` in the `<T as U>::*` examples
// above). `path_span` has the span of that path, or an empty
// span in the case of something like `<T>::Bar`.
let
(
mut
path
,
path_span
);
if
self
.eat_keyword
(
keywords
::
As
)
{
let
path_lo
=
self
.span
;
path
=
self
.parse_path
(
PathStyle
::
Type
)
?
;
path_span
=
path_lo
.to
(
self
.prev_span
);
}
else
{
ast
::
Path
{
segments
:
Vec
::
new
(),
span
:
syntax_pos
::
DUMMY_SP
}
};
path
=
ast
::
Path
{
segments
:
Vec
::
new
(),
span
:
syntax_pos
::
DUMMY_SP
};
path_span
=
self
.span
.to
(
self
.span
);
}
self
.expect
(
&
token
::
Gt
)
?
;
self
.expect
(
&
token
::
ModSep
)
?
;
let
qself
=
QSelf
{
ty
,
position
:
path
.segments
.len
()
};
let
qself
=
QSelf
{
ty
,
p
ath_span
,
p
osition
:
path
.segments
.len
()
};
self
.parse_path_segments
(
&
mut
path
.segments
,
style
,
true
)
?
;
Ok
((
qself
,
ast
::
Path
{
segments
:
path
.segments
,
span
:
lo
.to
(
self
.prev_span
)
}))
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录