Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
f004079d
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,发现更多精彩内容 >>
提交
f004079d
编写于
8月 03, 2015
作者:
J
Jared Roesch
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Actually commit tests
上级
89d401f6
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
127 addition
and
1 deletion
+127
-1
src/libsyntax/ext/expand.rs
src/libsyntax/ext/expand.rs
+1
-1
src/test/compile-fail/type-macros-fail.rs
src/test/compile-fail/type-macros-fail.rs
+21
-0
src/test/run-pass/type-macros-hlist.rs
src/test/run-pass/type-macros-hlist.rs
+86
-0
src/test/run-pass/type-macros-simple.rs
src/test/run-pass/type-macros-simple.rs
+19
-0
未找到文件。
src/libsyntax/ext/expand.rs
浏览文件 @
f004079d
...
...
@@ -1580,7 +1580,7 @@ pub fn expand_type(t: P<ast::Ty>, fld: &mut MacroExpander) -> P<ast::Ty> {
&
fld
.cx.parse_sess.span_diagnostic
,
"type_macros"
,
t
.span
,
"type macros are experimental (see
tracking issue:
27336)"
);
"type macros are experimental (see
issue: #
27336)"
);
t
}
}
...
...
src/test/compile-fail/type-macros-fail.rs
0 → 100644
浏览文件 @
f004079d
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
macro_rules!
Id
{
{
$T:tt
}
=>
$T
}
struct
Foo
<
T
>
{
x
:
Id!
(
T
)
}
fn
main
()
{
let
foo
=
Foo
{
x
:
i32
};
}
src/test/run-pass/type-macros-hlist.rs
0 → 100644
浏览文件 @
f004079d
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(type_macros)]
use
std
::
ops
::
*
;
#[derive(Copy,
Clone,
Debug,
Eq,
Ord,
PartialEq,
PartialOrd)]
struct
Nil
;
// empty HList
#[derive(Copy,
Clone,
Debug,
Eq,
Ord,
PartialEq,
PartialOrd)]
struct
Cons
<
H
,
T
:
HList
>
(
H
,
T
);
// cons cell of HList
// trait to classify valid HLists
trait
HList
{}
impl
HList
for
Nil
{}
impl
<
H
,
T
:
HList
>
HList
for
Cons
<
H
,
T
>
{}
// term-level macro for HLists
macro_rules!
hlist
{
{}
=>
{
Nil
};
{
$head:expr
}
=>
{
Cons
(
$head
,
Nil
)
};
{
$head:expr
,
$
(
$tail:expr
),
*
}
=>
{
Cons
(
$head
,
hlist!
(
$
(
$tail
),
*
))
};
}
// type-level macro for HLists
macro_rules!
HList
{
{}
=>
{
Nil
};
{
$head:ty
}
=>
{
Cons
<
$head
,
Nil
>
};
{
$head:ty
,
$
(
$tail:ty
),
*
}
=>
{
Cons
<
$head
,
HList!
(
$
(
$tail
),
*
)
>
};
}
// nil case for HList append
impl
<
Ys
:
HList
>
Add
<
Ys
>
for
Nil
{
type
Output
=
Ys
;
fn
add
(
self
,
rhs
:
Ys
)
->
Ys
{
rhs
}
}
// cons case for HList append
impl
<
Rec
:
HList
+
Sized
,
X
,
Xs
:
HList
,
Ys
:
HList
>
Add
<
Ys
>
for
Cons
<
X
,
Xs
>
where
Xs
:
Add
<
Ys
,
Output
=
Rec
>
,
{
type
Output
=
Cons
<
X
,
Rec
>
;
fn
add
(
self
,
rhs
:
Ys
)
->
Cons
<
X
,
Rec
>
{
Cons
(
self
.0
,
self
.1
+
rhs
)
}
}
// type macro Expr allows us to expand the + operator appropriately
macro_rules!
Expr
{
{
(
$
(
$LHS:tt
)
+
)
}
=>
{
Expr!
(
$
(
$LHS
)
+
)
};
{
HList
!
[
$
(
$LHS:tt
)
*
]
+
$
(
$RHS:tt
)
+
}
=>
{
<
Expr!
(
HList!
[
$
(
$LHS
)
*
])
as
Add
<
Expr!
(
$
(
$RHS
)
+
)
>>
::
Output
};
{
$LHS:tt
+
$
(
$RHS:tt
)
+
}
=>
{
<
Expr!
(
$LHS
)
as
Add
<
Expr!
(
$
(
$RHS
)
+
)
>>
::
Output
};
{
$LHS:ty
}
=>
{
$LHS
};
}
// test demonstrating term level `xs + ys` and type level `Expr!(Xs + Ys)`
fn
main
()
{
fn
aux
<
Xs
:
HList
,
Ys
:
HList
>
(
xs
:
Xs
,
ys
:
Ys
)
->
Expr!
(
Xs
+
Ys
)
where
Xs
:
Add
<
Ys
>
{
xs
+
ys
}
let
xs
:
HList!
[
&
str
,
bool
,
Vec
<
u64
>
]
=
hlist!
[
"foo"
,
false
,
vec!
[]];
let
ys
:
HList!
[
u64
,
[
u8
;
3
],
()]
=
hlist!
[
0
,
[
0
,
1
,
2
],
()];
// demonstrate recursive expansion of Expr!
let
zs
:
Expr!
((
HList!
[
&
str
]
+
HList!
[
bool
]
+
HList!
[
Vec
<
u64
>
])
+
(
HList!
[
u64
]
+
HList!
[[
u8
;
3
],
()])
+
HList!
[])
=
aux
(
xs
,
ys
);
assert_eq!
(
zs
,
hlist!
[
"foo"
,
false
,
vec!
[],
0
,
[
0
,
1
,
2
],
()])
}
src/test/run-pass/type-macros-simple.rs
0 → 100644
浏览文件 @
f004079d
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(type_macros)]
macro_rules!
Tuple
{
{
$A:ty
,
$B:ty
}
=>
{
(
$A
,
$B
)
}
}
fn
main
()
{
let
x
:
Tuple!
(
i32
,
i32
)
=
(
1
,
2
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录