Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
42f6608f
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,发现更多精彩内容 >>
提交
42f6608f
编写于
1月 04, 2012
作者:
M
Marijn Haverbeke
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add visit_ty_params to visit.rs
And use it to make typechecking of bounds less error-prone.
上级
e11d2071
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
22 addition
and
28 deletion
+22
-28
src/comp/middle/typeck.rs
src/comp/middle/typeck.rs
+6
-21
src/comp/syntax/visit.rs
src/comp/syntax/visit.rs
+16
-7
未找到文件。
src/comp/middle/typeck.rs
浏览文件 @
42f6608f
...
...
@@ -1514,7 +1514,7 @@ fn lookup_method(fcx: @fn_ctxt, isc: resolve::iscopes,
ty
::
bound_iface
(
t
)
{
let
(
iid
,
tps
)
=
alt
ty
::
struct
(
tcx
,
t
)
{
ty
::
ty_iface
(
i
,
tps
)
{
(
i
,
tps
)
}
_
{
ret
none
;
}
_
{
cont
;
}
};
let
ifce_methods
=
ty
::
iface_methods
(
tcx
,
iid
);
alt
vec
::
position_pred
(
*
ifce_methods
,
{|
m
|
m
.ident
==
name
})
{
...
...
@@ -2765,15 +2765,12 @@ fn check_item(ccx: @crate_ctxt, it: @ast::item) {
alt
it
.node
{
ast
::
item_const
(
_
,
e
)
{
check_const
(
ccx
,
it
.span
,
e
,
it
.id
);
}
ast
::
item_fn
(
decl
,
tps
,
body
)
{
check_ty_params
(
ccx
,
tps
);
check_fn
(
ccx
,
ast
::
proto_bare
,
decl
,
body
,
it
.id
,
none
);
}
ast
::
item_res
(
decl
,
tps
,
body
,
dtor_id
,
_
)
{
check_ty_params
(
ccx
,
tps
);
check_fn
(
ccx
,
ast
::
proto_bare
,
decl
,
body
,
dtor_id
,
none
);
}
ast
::
item_obj
(
ob
,
tps
,
_
)
{
check_ty_params
(
ccx
,
tps
);
// We're entering an object, so gather up the info we need.
ccx
.self_infos
+=
[
self_obj
(
ob
.fields
,
ccx
.tcx.tcache
.get
(
local_def
(
it
.id
))
.ty
)];
...
...
@@ -2783,10 +2780,8 @@ fn check_item(ccx: @crate_ctxt, it: @ast::item) {
vec
::
pop
(
ccx
.self_infos
);
}
ast
::
item_impl
(
tps
,
ifce
,
ty
,
ms
)
{
check_ty_params
(
ccx
,
tps
);
ccx
.self_infos
+=
[
self_impl
(
ast_ty_to_ty
(
ccx
.tcx
,
m_check
,
ty
))];
let
my_methods
=
vec
::
map
(
ms
,
{|
m
|
check_ty_params
(
ccx
,
m
.tps
);
check_method
(
ccx
,
m
);
ty_of_method
(
ccx
.tcx
,
m_check
,
m
)
});
...
...
@@ -2821,20 +2816,10 @@ fn check_item(ccx: @crate_ctxt, it: @ast::item) {
_
{}
}
}
ast
::
item_iface
(
tps
,
_
)
|
ast
::
item_ty
(
_
,
tps
)
|
ast
::
item_tag
(
_
,
tps
)
{
check_ty_params
(
ccx
,
tps
);
}
_
{
/* nothing to do */
}
}
}
fn
check_native_item
(
ccx
:
@
crate_ctxt
,
it
:
@
ast
::
native_item
)
{
alt
it
.node
{
ast
::
native_item_fn
(
_
,
tps
)
{
check_ty_params
(
ccx
,
tps
);
}
_
{}
}
}
fn
check_ty_params
(
ccx
:
@
crate_ctxt
,
tps
:
[
ast
::
ty_param
])
{
for
tp
in
tps
{
let
i
=
0u
;
...
...
@@ -3100,11 +3085,11 @@ fn check_crate(tcx: ty::ctxt, impl_map: resolve::impl_map,
method_map
:
std
::
map
::
new_int_hash
(),
dict_map
:
std
::
map
::
new_int_hash
(),
tcx
:
tcx
};
let
visit
=
visit
::
mk_simple_visitor
(
@
{
visit
_item
:
bind
check_item
(
ccx
,
_
),
visit_native_item
:
bind
check_native_item
(
ccx
,
_
)
with
*
visit
::
default_simple_visitor
()
});
let
visit
=
visit
::
mk_simple_visitor
(
@
{
visit_item
:
bind
check_item
(
ccx
,
_
),
visit_ty_params
:
bind
check_ty_params
(
ccx
,
_
)
with
*
visit
::
default_simple_visitor
(
)
});
visit
::
visit_crate
(
*
crate
,
(),
visit
);
check_for_main_fn
(
tcx
,
crate
);
tcx
.sess
.abort_if_errors
();
...
...
src/comp/syntax/visit.rs
浏览文件 @
42f6608f
...
...
@@ -52,6 +52,7 @@ fn tps_of_fn(fk: fn_kind) -> [ty_param] {
visit_decl
:
fn
@
(
@
decl
,
E
,
vt
<
E
>
),
visit_expr
:
fn
@
(
@
expr
,
E
,
vt
<
E
>
),
visit_ty
:
fn
@
(
@
ty
,
E
,
vt
<
E
>
),
visit_ty_params
:
fn
@
([
ty_param
],
E
,
vt
<
E
>
),
visit_constr
:
fn
@
(
@
path
,
span
,
node_id
,
E
,
vt
<
E
>
),
visit_fn
:
fn
@
(
fn_kind
,
fn_decl
,
blk
,
span
,
node_id
,
E
,
vt
<
E
>
)};
...
...
@@ -68,6 +69,7 @@ fn default_visitor<E>() -> visitor<E> {
visit_decl
:
bind
visit_decl
::
<
E
>
(
_
,
_
,
_
),
visit_expr
:
bind
visit_expr
::
<
E
>
(
_
,
_
,
_
),
visit_ty
:
bind
skip_ty
::
<
E
>
(
_
,
_
,
_
),
visit_ty_params
:
bind
visit_ty_params
::
<
E
>
(
_
,
_
,
_
),
visit_constr
:
bind
visit_constr
::
<
E
>
(
_
,
_
,
_
,
_
,
_
),
visit_fn
:
bind
visit_fn
::
<
E
>
(
_
,
_
,
_
,
_
,
_
,
_
,
_
)};
}
...
...
@@ -113,19 +115,19 @@ fn visit_item<E>(i: @item, e: E, v: vt<E>) {
for
vi
:
@
view_item
in
nm
.view_items
{
v
.visit_view_item
(
vi
,
e
,
v
);
}
for
ni
:
@
native_item
in
nm
.items
{
v
.visit_native_item
(
ni
,
e
,
v
);
}
}
item_ty
(
t
,
tps
)
{
v
.visit_ty
(
t
,
e
,
v
);
visit_ty_params
(
tps
,
e
,
v
);
}
item_ty
(
t
,
tps
)
{
v
.visit_ty
(
t
,
e
,
v
);
v
.v
isit_ty_params
(
tps
,
e
,
v
);
}
item_res
(
decl
,
tps
,
body
,
dtor_id
,
_
)
{
v
.visit_fn
(
fk_res
(
i
.ident
,
tps
),
decl
,
body
,
i
.span
,
dtor_id
,
e
,
v
);
}
item_tag
(
variants
,
tps
)
{
visit_ty_params
(
tps
,
e
,
v
);
v
.v
isit_ty_params
(
tps
,
e
,
v
);
for
vr
:
variant
in
variants
{
for
va
:
variant_arg
in
vr
.node.args
{
v
.visit_ty
(
va
.ty
,
e
,
v
);
}
}
}
item_obj
(
ob
,
tps
,
_
)
{
visit_ty_params
(
tps
,
e
,
v
);
v
.v
isit_ty_params
(
tps
,
e
,
v
);
for
f
:
obj_field
in
ob
.fields
{
v
.visit_ty
(
f
.ty
,
e
,
v
);
}
for
m
:
@
method
in
ob
.methods
{
v
.visit_fn
(
fk_method
(
m
.ident
,
m
.tps
),
m
.decl
,
m
.body
,
m
.span
,
...
...
@@ -133,7 +135,7 @@ fn visit_item<E>(i: @item, e: E, v: vt<E>) {
}
}
item_impl
(
tps
,
ifce
,
ty
,
methods
)
{
visit_ty_params
(
tps
,
e
,
v
);
v
.v
isit_ty_params
(
tps
,
e
,
v
);
alt
ifce
{
some
(
ty
)
{
v
.visit_ty
(
ty
,
e
,
v
);
}
_
{}
}
v
.visit_ty
(
ty
,
e
,
v
);
for
m
in
methods
{
...
...
@@ -142,7 +144,7 @@ fn visit_item<E>(i: @item, e: E, v: vt<E>) {
}
}
item_iface
(
tps
,
methods
)
{
visit_ty_params
(
tps
,
e
,
v
);
v
.v
isit_ty_params
(
tps
,
e
,
v
);
for
m
in
methods
{
for
a
in
m
.decl.inputs
{
v
.visit_ty
(
a
.ty
,
e
,
v
);
}
v
.visit_ty
(
m
.decl.output
,
e
,
v
);
...
...
@@ -217,7 +219,7 @@ fn visit_pat<E>(p: @pat, e: E, v: vt<E>) {
fn
visit_native_item
<
E
>
(
ni
:
@
native_item
,
e
:
E
,
v
:
vt
<
E
>
)
{
alt
ni
.node
{
native_item_fn
(
fd
,
tps
)
{
visit_ty_params
(
tps
,
e
,
v
);
v
.v
isit_ty_params
(
tps
,
e
,
v
);
visit_fn_decl
(
fd
,
e
,
v
);
}
native_item_ty
.
{
}
...
...
@@ -246,7 +248,7 @@ fn visit_fn_decl<E>(fd: fn_decl, e: E, v: vt<E>) {
fn
visit_fn
<
E
>
(
fk
:
fn_kind
,
decl
:
fn_decl
,
body
:
blk
,
_
sp
:
span
,
_
id
:
node_id
,
e
:
E
,
v
:
vt
<
E
>
)
{
visit_fn_decl
(
decl
,
e
,
v
);
visit_ty_params
(
tps_of_fn
(
fk
),
e
,
v
);
v
.v
isit_ty_params
(
tps_of_fn
(
fk
),
e
,
v
);
v
.visit_block
(
body
,
e
,
v
);
}
...
...
@@ -414,6 +416,7 @@ fn visit_arm<E>(a: arm, e: E, v: vt<E>) {
visit_decl
:
fn
@
(
@
decl
),
visit_expr
:
fn
@
(
@
expr
),
visit_ty
:
fn
@
(
@
ty
),
visit_ty_params
:
fn
@
([
ty_param
]),
visit_constr
:
fn
@
(
@
path
,
span
,
node_id
),
visit_fn
:
fn
@
(
fn_kind
,
fn_decl
,
blk
,
span
,
node_id
)};
...
...
@@ -432,6 +435,7 @@ fn default_simple_visitor() -> simple_visitor {
visit_decl
:
fn
(
_
d
:
@
decl
)
{
},
visit_expr
:
fn
(
_
e
:
@
expr
)
{
},
visit_ty
:
simple_ignore_ty
,
visit_ty_params
:
fn
(
_
ps
:
[
ty_param
])
{},
visit_constr
:
fn
(
_
p
:
@
path
,
_
sp
:
span
,
_
id
:
node_id
)
{
},
visit_fn
:
fn
(
_
fk
:
fn_kind
,
_
d
:
fn_decl
,
_
b
:
blk
,
_
sp
:
span
,
_
id
:
node_id
)
{
}
...
...
@@ -488,6 +492,10 @@ fn v_ty(f: fn@(@ty), ty: @ty, &&e: (), v: vt<()>) {
f
(
ty
);
visit_ty
(
ty
,
e
,
v
);
}
fn
v_ty_params
(
f
:
fn
@
([
ty_param
]),
ps
:
[
ty_param
],
&&
e
:
(),
v
:
vt
<
()
>
)
{
f
(
ps
);
visit_ty_params
(
ps
,
e
,
v
);
}
fn
v_constr
(
f
:
fn
@
(
@
path
,
span
,
node_id
),
pt
:
@
path
,
sp
:
span
,
id
:
node_id
,
&&
e
:
(),
v
:
vt
<
()
>
)
{
f
(
pt
,
sp
,
id
);
...
...
@@ -517,6 +525,7 @@ fn v_fn(f: fn@(fn_kind, fn_decl, blk, span, node_id),
visit_decl
:
bind
v_decl
(
v
.visit_decl
,
_
,
_
,
_
),
visit_expr
:
bind
v_expr
(
v
.visit_expr
,
_
,
_
,
_
),
visit_ty
:
visit_ty
,
visit_ty_params
:
bind
v_ty_params
(
v
.visit_ty_params
,
_
,
_
,
_
),
visit_constr
:
bind
v_constr
(
v
.visit_constr
,
_
,
_
,
_
,
_
,
_
),
visit_fn
:
bind
v_fn
(
v
.visit_fn
,
_
,
_
,
_
,
_
,
_
,
_
,
_
)
});
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录