Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
2d759046
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,发现更多精彩内容 >>
提交
2d759046
编写于
9月 02, 2016
作者:
J
Jeffrey Seyfried
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Implement stackless placeholder expansion.
上级
d76bf3ed
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
22 addition
and
8 deletion
+22
-8
src/libsyntax/ext/expand.rs
src/libsyntax/ext/expand.rs
+15
-4
src/libsyntax/ext/placeholders.rs
src/libsyntax/ext/placeholders.rs
+7
-4
未找到文件。
src/libsyntax/ext/expand.rs
浏览文件 @
2d759046
...
...
@@ -26,7 +26,6 @@
use
tokenstream
::
TokenTree
;
use
util
::
small_vector
::
SmallVector
;
use
std
::
collections
::
HashMap
;
use
std
::
mem
;
use
std
::
path
::
PathBuf
;
use
std
::
rc
::
Rc
;
...
...
@@ -182,10 +181,11 @@ fn expand_crate(&mut self, mut krate: ast::Crate) -> ast::Crate {
// Fully expand all the invocations in `expansion`.
fn
expand
(
&
mut
self
,
expansion
:
Expansion
)
->
Expansion
{
self
.cx.recursion_count
=
0
;
let
(
expansion
,
mut
invocations
)
=
self
.collect_invocations
(
expansion
);
invocations
.reverse
();
let
mut
expansions
=
HashMap
::
new
()
;
let
mut
expansions
=
vec!
[
vec!
[(
0
,
expansion
)]]
;
while
let
Some
(
invoc
)
=
invocations
.pop
()
{
let
Invocation
{
mark
,
module
,
depth
,
backtrace
,
..
}
=
invoc
;
self
.cx.syntax_env.current_module
=
module
;
...
...
@@ -198,13 +198,24 @@ fn expand(&mut self, expansion: Expansion) -> Expansion {
self
.cx.recursion_count
=
depth
+
1
;
let
(
expansion
,
new_invocations
)
=
self
.collect_invocations
(
expansion
);
expansions
.insert
(
mark
.as_u32
(),
expansion
);
if
expansions
.len
()
==
depth
{
expansions
.push
(
Vec
::
new
());
}
expansions
[
depth
]
.push
((
mark
.as_u32
(),
expansion
));
if
!
self
.single_step
{
invocations
.extend
(
new_invocations
.into_iter
()
.rev
());
}
}
expansion
.fold_with
(
&
mut
PlaceholderExpander
::
new
(
expansions
))
let
mut
placeholder_expander
=
PlaceholderExpander
::
new
();
while
let
Some
(
expansions
)
=
expansions
.pop
()
{
for
(
mark
,
expansion
)
in
expansions
.into_iter
()
.rev
()
{
let
expansion
=
expansion
.fold_with
(
&
mut
placeholder_expander
);
placeholder_expander
.add
(
mark
,
expansion
);
}
}
placeholder_expander
.remove
(
0
)
}
fn
collect_invocations
(
&
mut
self
,
expansion
:
Expansion
)
->
(
Expansion
,
Vec
<
Invocation
>
)
{
...
...
src/libsyntax/ext/placeholders.rs
浏览文件 @
2d759046
...
...
@@ -74,15 +74,18 @@ pub struct PlaceholderExpander {
}
impl
PlaceholderExpander
{
pub
fn
new
(
expansions
:
HashMap
<
ast
::
NodeId
,
Expansion
>
)
->
Self
{
pub
fn
new
()
->
Self
{
PlaceholderExpander
{
expansions
:
expansions
,
expansions
:
HashMap
::
new
()
,
}
}
pub
fn
add
(
&
mut
self
,
id
:
ast
::
NodeId
,
expansion
:
Expansion
)
{
self
.expansions
.insert
(
id
,
expansion
);
}
pub
fn
remove
(
&
mut
self
,
id
:
ast
::
NodeId
)
->
Expansion
{
let
expansion
=
self
.expansions
.remove
(
&
id
)
.unwrap
();
expansion
.fold_with
(
self
)
self
.expansions
.remove
(
&
id
)
.unwrap
()
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录