Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
acac6abc
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,发现更多精彩内容 >>
提交
acac6abc
编写于
7月 28, 2011
作者:
G
Graydon Hoare
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Parse, store and print type parameter kind constraints.
上级
1836f59d
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
49 addition
and
7 deletion
+49
-7
src/comp/middle/resolve.rs
src/comp/middle/resolve.rs
+12
-4
src/comp/syntax/ast.rs
src/comp/syntax/ast.rs
+1
-1
src/comp/syntax/parse/parser.rs
src/comp/syntax/parse/parser.rs
+8
-1
src/comp/syntax/print/pprust.rs
src/comp/syntax/print/pprust.rs
+3
-1
src/test/run-pass/type-param-constraints.rs
src/test/run-pass/type-param-constraints.rs
+25
-0
未找到文件。
src/comp/middle/resolve.rs
浏览文件 @
acac6abc
...
...
@@ -710,7 +710,7 @@ fn lookup_in_ty_params(name: &ident, ty_params: &ast::ty_param[]) ->
option
::
t
[
def
]
{
let
i
=
0u
;
for
tp
:
ast
::
ty_param
in
ty_params
{
if
str
::
eq
(
tp
,
name
)
{
ret
some
(
ast
::
def_ty_arg
(
i
));
}
if
str
::
eq
(
tp
.ident
,
name
)
{
ret
some
(
ast
::
def_ty_arg
(
i
));
}
i
+=
1u
;
}
ret
none
[
def
];
...
...
@@ -1215,11 +1215,17 @@ fn mie_span(mie: &mod_index_entry) -> span {
}
fn
check_item
(
e
:
&@
env
,
i
:
&@
ast
::
item
,
x
:
&
(),
v
:
&
vt
[()])
{
fn
typaram_names
(
tps
:
&
ast
::
ty_param
[])
->
ident
[]
{
let
x
:
ast
::
ident
[]
=
~
[];
for
tp
:
ast
::
ty_param
in
tps
{
x
+=
~
[
tp
.ident
]
}
ret
x
;
}
visit
::
visit_item
(
i
,
x
,
v
);
alt
i
.node
{
ast
::
item_fn
(
f
,
ty_params
)
{
check_fn
(
*
e
,
i
.span
,
f
);
ensure_unique
(
*
e
,
i
.span
,
ty_params
,
ident_id
,
"type parameter"
);
ensure_unique
(
*
e
,
i
.span
,
typaram_names
(
ty_params
),
ident_id
,
"type parameter"
);
}
ast
::
item_obj
(
ob
,
ty_params
,
_
)
{
fn
field_name
(
field
:
&
ast
::
obj_field
)
->
ident
{
ret
field
.ident
;
}
...
...
@@ -1227,10 +1233,12 @@ fn check_item(e: &@env, i: &@ast::item, x: &(), v: &vt[()]) {
for
m
:
@
ast
::
method
in
ob
.methods
{
check_fn
(
*
e
,
m
.span
,
m
.node.meth
);
}
ensure_unique
(
*
e
,
i
.span
,
ty_params
,
ident_id
,
"type parameter"
);
ensure_unique
(
*
e
,
i
.span
,
typaram_names
(
ty_params
),
ident_id
,
"type parameter"
);
}
ast
::
item_tag
(
_
,
ty_params
)
{
ensure_unique
(
*
e
,
i
.span
,
ty_params
,
ident_id
,
"type parameter"
);
ensure_unique
(
*
e
,
i
.span
,
typaram_names
(
ty_params
),
ident_id
,
"type parameter"
);
}
_
{
}
}
...
...
src/comp/syntax/ast.rs
浏览文件 @
acac6abc
...
...
@@ -31,7 +31,7 @@ fn path_name_i(idents: &ident[]) -> str { str::connect_ivec(idents, "::") }
const
local_crate
:
crate_num
=
0
;
fn
local_def
(
id
:
node_id
)
->
def_id
{
ret
{
crate
:
local_crate
,
node
:
id
};
}
type
ty_param
=
ident
;
type
ty_param
=
{
ident
:
ident
,
kind
:
kind
}
;
tag
def
{
def_fn
(
def_id
,
purity
);
...
...
src/comp/syntax/parse/parser.rs
浏览文件 @
acac6abc
...
...
@@ -1696,7 +1696,14 @@ fn parse_block_tail(p: &parser, lo: uint) -> ast::blk {
ret
spanned
(
lo
,
hi
,
bloc
);
}
fn
parse_ty_param
(
p
:
&
parser
)
->
ast
::
ty_param
{
ret
parse_ident
(
p
);
}
fn
parse_ty_param
(
p
:
&
parser
)
->
ast
::
ty_param
{
let
k
=
alt
p
.peek
()
{
token
::
TILDE
.
{
p
.bump
();
ast
::
kind_unique
}
token
::
AT
.
{
p
.bump
();
ast
::
kind_shared
}
_
{
ast
::
kind_pinned
}
};
ret
{
ident
:
parse_ident
(
p
),
kind
:
k
};
}
fn
parse_ty_params
(
p
:
&
parser
)
->
ast
::
ty_param
[]
{
let
ty_params
:
ast
::
ty_param
[]
=
~
[];
...
...
src/comp/syntax/print/pprust.rs
浏览文件 @
acac6abc
...
...
@@ -1149,7 +1149,9 @@ fn print_alias(s: &ps, m: ast::mode) {
fn
print_type_params
(
s
:
&
ps
,
params
:
&
ast
::
ty_param
[])
{
if
ivec
::
len
(
params
)
>
0u
{
word
(
s
.s
,
"["
);
fn
printParam
(
s
:
&
ps
,
param
:
&
ast
::
ty_param
)
{
word
(
s
.s
,
param
);
}
fn
printParam
(
s
:
&
ps
,
param
:
&
ast
::
ty_param
)
{
word
(
s
.s
,
param
.ident
);
}
commasep
(
s
,
inconsistent
,
params
,
printParam
);
word
(
s
.s
,
"]"
);
}
...
...
src/test/run-pass/type-param-constraints.rs
0 → 100644
浏览文件 @
acac6abc
fn
p_foo
[
T
](
pinned
:
&
T
)
{
}
fn
s_foo
[
@
T
](
shared
:
&
T
)
{
}
fn
u_foo
[
~
T
](
unique
:
&
T
)
{
}
resource
r
(
i
:
int
)
{
}
fn
main
()
{
// FIXME: passing resources doesn't work?
//p_foo(r(10));
//p_foo(@r(10));
// FIXME: unique boxes not yet supported.
// p_foo(~r(10));
p_foo
(
@
10
);
// p_foo(~10);
p_foo
(
10
);
//s_foo(@r(10));
//s_foo(~r(10));
s_foo
(
@
10
);
//s_foo(~10);
s_foo
(
10
);
//u_foo(~10);
u_foo
(
10
);
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录