Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
866a5b1c
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,发现更多精彩内容 >>
提交
866a5b1c
编写于
7月 02, 2013
作者:
M
Michael Woerister
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Added support for struct-like enum variants in middle::ty::enum_variants().
上级
ab34864a
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
39 addition
and
18 deletion
+39
-18
src/librustc/middle/ty.rs
src/librustc/middle/ty.rs
+39
-18
未找到文件。
src/librustc/middle/ty.rs
浏览文件 @
866a5b1c
...
...
@@ -3816,41 +3816,62 @@ pub fn enum_variants(cx: ctxt, id: ast::def_id) -> @~[VariantInfo] {
},
_
)
=>
{
let
mut
disr_val
=
-
1
;
@
enum_definition
.variants
.iter
()
.transform
(|
variant
|
{
let
ctor_ty
=
node_id_to_type
(
cx
,
variant
.node.id
);
match
variant
.node.kind
{
ast
::
tuple_variant_kind
(
ref
args
)
=>
{
let
ctor_ty
=
node_id_to_type
(
cx
,
variant
.node.id
);
let
arg_tys
=
{
if
args
.len
()
>
0u
{
ty_fn_args
(
ctor_ty
)
.map
(|
a
|
*
a
)
}
else
{
let
arg_tys
=
if
args
.len
()
>
0u
{
ty_fn_args
(
ctor_ty
)
.map
(|
a
|
*
a
)
}
else
{
~
[]
}
};
}
;
match
variant
.node.disr_expr
{
Some
(
ex
)
=>
{
disr_val
=
match
const_eval
::
eval_const_expr
(
cx
,
ex
)
{
const_eval
::
const_int
(
val
)
=>
val
as
int
,
_
=>
cx
.sess
.bug
(
"
tag
_variants: bad disr expr"
)
_
=>
cx
.sess
.bug
(
"
enum
_variants: bad disr expr"
)
}
}
_
=>
disr_val
+=
1
}
@
VariantInfo_
{
args
:
arg_tys
,
ctor_ty
:
ctor_ty
,
name
:
variant
.node.name
,
id
:
ast_util
::
local_def
(
variant
.node.id
),
disr_val
:
disr_val
,
vis
:
variant
.node.vis
@
VariantInfo_
{
args
:
arg_tys
,
ctor_ty
:
ctor_ty
,
name
:
variant
.node.name
,
id
:
ast_util
::
local_def
(
variant
.node.id
),
disr_val
:
disr_val
,
vis
:
variant
.node.vis
}
}
ast
::
struct_variant_kind
(
_
)
=>
{
fail
!
(
"struct variant kinds unimpl in enum_variants"
)
},
ast
::
struct_variant_kind
(
struct_def
)
=>
{
let
arg_tys
=
// Is this check needed for structs too, or are they always guaranteed
// to have a valid constructor function?
if
struct_def
.fields
.len
()
>
0
{
ty_fn_args
(
ctor_ty
)
.map
(|
a
|
*
a
)
}
else
{
~
[]
};
assert
!
(
variant
.node.disr_expr
.is_none
());
disr_val
+=
1
;
@
VariantInfo_
{
args
:
arg_tys
,
ctor_ty
:
ctor_ty
,
name
:
variant
.node.name
,
id
:
ast_util
::
local_def
(
variant
.node.id
),
disr_val
:
disr_val
,
vis
:
variant
.node.vis
}
}
}
})
.collect
()
}
_
=>
cx
.sess
.bug
(
"
tag
_variants: id not bound to an enum"
)
_
=>
cx
.sess
.bug
(
"
enum
_variants: id not bound to an enum"
)
}
};
cx
.enum_var_cache
.insert
(
id
,
result
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录