Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
11195676
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,发现更多精彩内容 >>
提交
11195676
编写于
11月 08, 2016
作者:
J
Jeffrey Seyfried
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Elimite `$crate` before invokng custom derives.
上级
b46ce08d
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
31 addition
and
2 deletion
+31
-2
src/librustc_resolve/macros.rs
src/librustc_resolve/macros.rs
+28
-1
src/libsyntax/ext/base.rs
src/libsyntax/ext/base.rs
+2
-0
src/libsyntax_ext/deriving/custom.rs
src/libsyntax_ext/deriving/custom.rs
+1
-1
未找到文件。
src/librustc_resolve/macros.rs
浏览文件 @
11195676
...
...
@@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use
{
Module
,
Resolver
};
use
{
Module
,
ModuleKind
,
Resolver
};
use
build_reduced_graph
::
BuildReducedGraphVisitor
;
use
rustc
::
hir
::
def_id
::{
CRATE_DEF_INDEX
,
DefIndex
};
use
rustc
::
hir
::
map
::{
self
,
DefCollector
};
...
...
@@ -21,7 +21,9 @@
use
syntax
::
ext
::
expand
::
Expansion
;
use
syntax
::
ext
::
hygiene
::
Mark
;
use
syntax
::
ext
::
tt
::
macro_rules
;
use
syntax
::
fold
::
Folder
;
use
syntax
::
parse
::
token
::
intern
;
use
syntax
::
ptr
::
P
;
use
syntax
::
util
::
lev_distance
::
find_best_match_for_name
;
use
syntax_pos
::
Span
;
...
...
@@ -97,6 +99,31 @@ fn get_module_scope(&mut self, id: ast::NodeId) -> Mark {
mark
}
fn
eliminate_crate_var
(
&
mut
self
,
item
:
P
<
ast
::
Item
>
)
->
P
<
ast
::
Item
>
{
struct
EliminateCrateVar
<
'b
,
'a
:
'b
>
(
&
'b
mut
Resolver
<
'a
>
);
impl
<
'a
,
'b
>
Folder
for
EliminateCrateVar
<
'a
,
'b
>
{
fn
fold_path
(
&
mut
self
,
mut
path
:
ast
::
Path
)
->
ast
::
Path
{
let
ident
=
path
.segments
[
0
]
.identifier
;
if
&
ident
.name
.as_str
()
==
"$crate"
{
path
.global
=
true
;
let
module
=
self
.0
.resolve_crate_var
(
ident
.ctxt
);
if
module
.is_local
()
{
path
.segments
.remove
(
0
);
}
else
{
path
.segments
[
0
]
.identifier
=
match
module
.kind
{
ModuleKind
::
Def
(
_
,
name
)
=>
ast
::
Ident
::
with_empty_ctxt
(
name
),
_
=>
unreachable!
(),
};
}
}
path
}
}
EliminateCrateVar
(
self
)
.fold_item
(
item
)
.expect_one
(
""
)
}
fn
visit_expansion
(
&
mut
self
,
mark
:
Mark
,
expansion
:
&
Expansion
)
{
let
invocation
=
self
.invocations
[
&
mark
];
self
.collect_def_ids
(
invocation
,
expansion
);
...
...
src/libsyntax/ext/base.rs
浏览文件 @
11195676
...
...
@@ -517,6 +517,7 @@ pub enum SyntaxExtension {
pub
trait
Resolver
{
fn
next_node_id
(
&
mut
self
)
->
ast
::
NodeId
;
fn
get_module_scope
(
&
mut
self
,
id
:
ast
::
NodeId
)
->
Mark
;
fn
eliminate_crate_var
(
&
mut
self
,
item
:
P
<
ast
::
Item
>
)
->
P
<
ast
::
Item
>
;
fn
visit_expansion
(
&
mut
self
,
mark
:
Mark
,
expansion
:
&
Expansion
);
fn
add_macro
(
&
mut
self
,
scope
:
Mark
,
def
:
ast
::
MacroDef
,
export
:
bool
);
...
...
@@ -539,6 +540,7 @@ pub enum Determinacy {
impl
Resolver
for
DummyResolver
{
fn
next_node_id
(
&
mut
self
)
->
ast
::
NodeId
{
ast
::
DUMMY_NODE_ID
}
fn
get_module_scope
(
&
mut
self
,
_
id
:
ast
::
NodeId
)
->
Mark
{
Mark
::
root
()
}
fn
eliminate_crate_var
(
&
mut
self
,
item
:
P
<
ast
::
Item
>
)
->
P
<
ast
::
Item
>
{
item
}
fn
visit_expansion
(
&
mut
self
,
_
invoc
:
Mark
,
_
expansion
:
&
Expansion
)
{}
fn
add_macro
(
&
mut
self
,
_
scope
:
Mark
,
_
def
:
ast
::
MacroDef
,
_
export
:
bool
)
{}
...
...
src/libsyntax_ext/deriving/custom.rs
浏览文件 @
11195676
...
...
@@ -73,7 +73,7 @@ fn expand(&self,
// Mark attributes as known, and used.
MarkAttrs
(
&
self
.attrs
)
.visit_item
(
&
item
);
let
input
=
__
internal
::
new_token_stream
(
item
.clone
(
));
let
input
=
__
internal
::
new_token_stream
(
ecx
.resolver
.eliminate_crate_var
(
item
.clone
()
));
let
res
=
__
internal
::
set_parse_sess
(
&
ecx
.parse_sess
,
||
{
let
inner
=
self
.inner
;
panic
::
catch_unwind
(
panic
::
AssertUnwindSafe
(||
inner
(
input
)))
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录