Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
9fdaa948
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,发现更多精彩内容 >>
提交
9fdaa948
编写于
7月 02, 2014
作者:
J
John Clements
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
move RenameList to mtwt, add new_renames abstraction
上级
f126eacd
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
40 addition
and
23 deletion
+40
-23
src/libsyntax/ext/base.rs
src/libsyntax/ext/base.rs
+2
-4
src/libsyntax/ext/expand.rs
src/libsyntax/ext/expand.rs
+2
-5
src/libsyntax/ext/mtwt.rs
src/libsyntax/ext/mtwt.rs
+36
-14
未找到文件。
src/libsyntax/ext/base.rs
浏览文件 @
9fdaa948
...
...
@@ -19,6 +19,7 @@
use
parse
::
token
;
use
parse
::
token
::{
InternedString
,
intern
,
str_to_ident
};
use
util
::
small_vector
::
SmallVector
;
use
ext
::
mtwt
;
use
std
::
collections
::
HashMap
;
use
std
::
gc
::{
Gc
,
GC
};
...
...
@@ -273,7 +274,7 @@ pub struct BlockInfo {
// should macros escape from this scope?
pub
macros_escape
:
bool
,
// what are the pending renames?
pub
pending_renames
:
RenameList
,
pub
pending_renames
:
mtwt
::
RenameList
,
}
impl
BlockInfo
{
...
...
@@ -285,9 +286,6 @@ pub fn new() -> BlockInfo {
}
}
// a list of ident->name renamings
pub
type
RenameList
=
Vec
<
(
ast
::
Ident
,
Name
)
>
;
// The base map of methods for expanding syntax extension
// AST nodes into full ASTs
pub
fn
syntax_expander_table
()
->
SyntaxEnv
{
...
...
src/libsyntax/ext/expand.rs
浏览文件 @
9fdaa948
...
...
@@ -844,17 +844,14 @@ fn expand_pat(p: Gc<ast::Pat>, fld: &mut MacroExpander) -> Gc<ast::Pat> {
// to every identifier, including both bindings and varrefs
// (and lots of things that will turn out to be neither)
pub
struct
IdentRenamer
<
'a
>
{
renames
:
&
'a
m
ut
RenameList
,
renames
:
&
'a
m
twt
::
RenameList
,
}
impl
<
'a
>
Folder
for
IdentRenamer
<
'a
>
{
fn
fold_ident
(
&
mut
self
,
id
:
Ident
)
->
Ident
{
let
new_ctxt
=
self
.renames
.iter
()
.fold
(
id
.ctxt
,
|
ctxt
,
&
(
from
,
to
)|
{
mtwt
::
new_rename
(
from
,
to
,
ctxt
)
});
Ident
{
name
:
id
.name
,
ctxt
:
new_ctxt
,
ctxt
:
mtwt
::
new_renames
(
self
.renames
,
id
.ctxt
)
,
}
}
}
...
...
src/libsyntax/ext/mtwt.rs
浏览文件 @
9fdaa948
...
...
@@ -54,38 +54,51 @@ pub enum SyntaxContext_ {
IllegalCtxt
}
/// A list of ident->name renamings
pub
type
RenameList
=
Vec
<
(
Ident
,
Name
)
>
;
/// Extend a syntax context with a given mark
pub
fn
new_mark
(
m
:
Mrk
,
tail
:
SyntaxContext
)
->
SyntaxContext
{
with_sctable
(|
table
|
new_mark_internal
(
m
,
tail
,
table
))
pub
fn
new_mark
(
m
:
Mrk
,
ctxt
:
SyntaxContext
)
->
SyntaxContext
{
with_sctable
(|
table
|
new_mark_internal
(
m
,
ctxt
,
table
))
}
// Extend a syntax context with a given mark and
table
fn
new_mark_internal
(
m
:
Mrk
,
tail
:
SyntaxContext
,
table
:
&
SCTable
)
->
SyntaxContext
{
let
key
=
(
tail
,
m
);
// Extend a syntax context with a given mark and
sctable (explicit memoization)
fn
new_mark_internal
(
m
:
Mrk
,
ctxt
:
SyntaxContext
,
table
:
&
SCTable
)
->
SyntaxContext
{
let
key
=
(
ctxt
,
m
);
let
new_ctxt
=
|
_
:
&
(
SyntaxContext
,
Mrk
)|
idx_push
(
&
mut
*
table
.table
.borrow_mut
(),
Mark
(
m
,
tail
));
idx_push
(
&
mut
*
table
.table
.borrow_mut
(),
Mark
(
m
,
ctxt
));
*
table
.mark_memo
.borrow_mut
()
.find_or_insert_with
(
key
,
new_ctxt
)
}
/// Extend a syntax context with a given rename
pub
fn
new_rename
(
id
:
Ident
,
to
:
Name
,
tail
:
SyntaxContext
)
->
SyntaxContext
{
with_sctable
(|
table
|
new_rename_internal
(
id
,
to
,
tail
,
table
))
ctxt
:
SyntaxContext
)
->
SyntaxContext
{
with_sctable
(|
table
|
new_rename_internal
(
id
,
to
,
ctxt
,
table
))
}
// Extend a syntax context with a given rename and sctable
// Extend a syntax context with a given rename and sctable
(explicit memoization)
fn
new_rename_internal
(
id
:
Ident
,
to
:
Name
,
tail
:
SyntaxContext
,
ctxt
:
SyntaxContext
,
table
:
&
SCTable
)
->
SyntaxContext
{
let
key
=
(
tail
,
id
,
to
);
let
key
=
(
ctxt
,
id
,
to
);
let
new_ctxt
=
|
_
:
&
(
SyntaxContext
,
Ident
,
Mrk
)|
idx_push
(
&
mut
*
table
.table
.borrow_mut
(),
Rename
(
id
,
to
,
tail
));
idx_push
(
&
mut
*
table
.table
.borrow_mut
(),
Rename
(
id
,
to
,
ctxt
));
*
table
.rename_memo
.borrow_mut
()
.find_or_insert_with
(
key
,
new_ctxt
)
}
/// Apply a list of renamings to a context
// if these rename lists get long, it would make sense
// to consider memoizing this fold. This may come up
// when we add hygiene to item names.
pub
fn
new_renames
(
renames
:
&
RenameList
,
ctxt
:
SyntaxContext
)
->
SyntaxContext
{
renames
.iter
()
.fold
(
ctxt
,
|
ctxt
,
&
(
from
,
to
)|
{
new_rename
(
from
,
to
,
ctxt
)
})
}
/// Fetch the SCTable from TLS, create one if it doesn't yet exist.
pub
fn
with_sctable
<
T
>
(
op
:
|
&
SCTable
|
->
T
)
->
T
{
local_data_key!
(
sctable_key
:
Rc
<
SCTable
>
)
...
...
@@ -263,9 +276,9 @@ fn xor_push(marks: &mut Vec<Mrk>, mark: Mrk) {
#[cfg(test)]
mod
tests
{
use
ast
::
*
;
use
ast
::
{
EMPTY_CTXT
,
Ident
,
Mrk
,
Name
,
SyntaxContext
}
;
use
super
::{
resolve
,
xor_push
,
new_mark_internal
,
new_sctable_internal
};
use
super
::{
new_rename_internal
,
marksof_internal
,
resolve_internal
};
use
super
::{
new_rename_internal
,
new_renames
,
marksof_internal
,
resolve_internal
};
use
super
::{
SCTable
,
EmptyCtxt
,
Mark
,
Rename
,
IllegalCtxt
};
use
std
::
collections
::
HashMap
;
...
...
@@ -480,4 +493,13 @@ fn resolve_table_hashing_tests() {
resolve_internal
(
id
(
30
,
EMPTY_CTXT
),
&
mut
t
,
&
mut
rt
);
assert_eq!
(
rt
.len
(),
2
);
}
#[test]
fn
new_resolves_test
()
{
let
renames
=
vec!
((
Ident
{
name
:
23
,
ctxt
:
EMPTY_CTXT
},
24
),
(
Ident
{
name
:
29
,
ctxt
:
EMPTY_CTXT
},
29
));
let
new_ctxt1
=
new_renames
(
&
renames
,
EMPTY_CTXT
);
assert_eq!
(
resolve
(
Ident
{
name
:
23
,
ctxt
:
new_ctxt1
}),
24
);
assert_eq!
(
resolve
(
Ident
{
name
:
29
,
ctxt
:
new_ctxt1
}),
29
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录