Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
35eb088a
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,发现更多精彩内容 >>
提交
35eb088a
编写于
11月 05, 2010
作者:
P
Patrick Walton
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rustc: Implement function types
上级
91b1885b
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
60 addition
and
1 deletion
+60
-1
src/comp/front/ast.rs
src/comp/front/ast.rs
+1
-0
src/comp/front/parser.rs
src/comp/front/parser.rs
+43
-0
src/comp/middle/fold.rs
src/comp/middle/fold.rs
+16
-1
未找到文件。
src/comp/front/ast.rs
浏览文件 @
35eb088a
...
...
@@ -130,6 +130,7 @@
ty_box
(
@
ty
);
ty_vec
(
@
ty
);
ty_tup
(
vec
[
tup
(
bool
/* mutability */
,
@
ty
)]);
ty_fn
(
vec
[
rec
(
mode
mode
,
@
ty
ty
)],
@
ty
);
// TODO: effect
ty_path
(
path
,
option
.t
[
def
]);
}
...
...
src/comp/front/parser.rs
浏览文件 @
35eb088a
...
...
@@ -108,6 +108,45 @@ fn spanned[T](&span lo, &span hi, &T node) -> ast.spanned[T] {
ret
tup
(
mut
,
parse_ty
(
p
));
}
impure
fn
parse_ty_fn
(
parser
p
)
->
ast
.ty_
{
impure
fn
parse_fn_input_ty
(
parser
p
)
->
rec
(
ast
.mode
mode
,
@
ast
.ty
ty
)
{
auto
mode
;
if
(
p
.peek
()
==
token
.BINOP
(
token
.AND
))
{
p
.bump
();
mode
=
ast
.alias
;
}
else
{
mode
=
ast
.val
;
}
auto
t
=
parse_ty
(
p
);
alt
(
p
.peek
())
{
case
(
token
.IDENT
(
_
))
{
p
.bump
();
/* ignore the param name */
}
case
(
_
)
{
/* no param name present */
}
}
ret
rec
(
mode
=
mode
,
ty
=
t
);
}
auto
lo
=
p
.get_span
();
expect
(
p
,
token
.FN
);
auto
f
=
parse_fn_input_ty
;
// FIXME: trans_const_lval bug
auto
inputs
=
parse_seq
[
rec
(
ast
.mode
mode
,
@
ast
.ty
ty
)](
token
.LPAREN
,
token
.RPAREN
,
some
(
token
.COMMA
),
f
,
p
);
let
@
ast
.ty
output
;
if
(
p
.peek
()
==
token
.RARROW
)
{
p
.bump
();
output
=
parse_ty
(
p
);
}
else
{
output
=
@
spanned
(
lo
,
inputs
.span
,
ast
.ty_nil
);
}
ret
ast
.ty_fn
(
inputs
.node
,
output
);
}
impure
fn
parse_ty
(
parser
p
)
->
@
ast
.ty
{
auto
lo
=
p
.get_span
();
let
ast
.ty_
t
;
...
...
@@ -135,6 +174,10 @@ fn spanned[T](&span lo, &span hi, &T node) -> ast.spanned[T] {
t
=
ast
.ty_tup
(
elems
.node
);
}
case
(
token
.FN
)
{
t
=
parse_ty_fn
(
p
);
}
case
(
_
)
{
p
.err
(
"expecting type"
);
t
=
ast
.ty_nil
;
...
...
src/comp/middle/fold.rs
浏览文件 @
35eb088a
...
...
@@ -46,8 +46,12 @@
(
fn
(
&
ENV
e
,
&
span
sp
,
vec
[
tup
(
bool
,
@
ty
)]
elts
)
->
@
ty
)
fold_ty_tup
,
(
fn
(
&
ENV
e
,
&
span
sp
,
vec
[
rec
(
ast
.mode
mode
,
@
ty
ty
)]
inputs
,
@
ty
output
)
->
@
ty
)
fold_ty_fn
,
(
fn
(
&
ENV
e
,
&
span
sp
,
ast
.path
p
,
&
option
.t
[
def
]
d
)
->
@
ty
)
fold_ty_path
,
&
option
.t
[
def
]
d
)
->
@
ty
)
fold_ty_path
,
// Expr folds.
(
fn
(
&
ENV
e
,
&
span
sp
,
...
...
@@ -226,6 +230,10 @@ fn fold_ty[ENV](&ENV env, ast_fold[ENV] fld, @ty t) -> @ty {
}
ret
fld
.fold_ty_path
(
env_
,
t
.span
,
path
,
ref_opt
);
}
case
(
ast
.ty_fn
(
?
inputs
,
?
output
))
{
ret
fld
.fold_ty_fn
(
env_
,
t
.span
,
inputs
,
output
);
}
}
}
...
...
@@ -567,6 +575,12 @@ fn identity_fold_ty_tup[ENV](&ENV env, &span sp, vec[tup(bool,@ty)] elts)
ret
@
respan
(
sp
,
ast
.ty_tup
(
elts
));
}
fn
identity_fold_ty_fn
[
ENV
](
&
ENV
env
,
&
span
sp
,
vec
[
rec
(
ast
.mode
mode
,
@
ty
ty
)]
inputs
,
@
ty
output
)
->
@
ty
{
ret
@
respan
(
sp
,
ast
.ty_fn
(
inputs
,
output
));
}
fn
identity_fold_ty_path
[
ENV
](
&
ENV
env
,
&
span
sp
,
ast
.path
p
,
&
option
.t
[
def
]
d
)
->
@
ty
{
ret
@
respan
(
sp
,
ast
.ty_path
(
p
,
d
));
...
...
@@ -785,6 +799,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
fold_ty_box
=
bind
identity_fold_ty_box
[
ENV
](
_
,
_
,
_
),
fold_ty_vec
=
bind
identity_fold_ty_vec
[
ENV
](
_
,
_
,
_
),
fold_ty_tup
=
bind
identity_fold_ty_tup
[
ENV
](
_
,
_
,
_
),
fold_ty_fn
=
bind
identity_fold_ty_fn
[
ENV
](
_
,
_
,
_
,
_
),
fold_ty_path
=
bind
identity_fold_ty_path
[
ENV
](
_
,
_
,
_
,
_
),
fold_expr_vec
=
bind
identity_fold_expr_vec
[
ENV
](
_
,
_
,
_
,
_
),
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录