Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
54831f12
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,发现更多精彩内容 >>
提交
54831f12
编写于
9月 25, 2014
作者:
T
Tom Jakubowski
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rustdoc: Render where clauses as appropriate
Fix #16546
上级
5e13d3aa
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
131 addition
and
21 deletion
+131
-21
src/librustdoc/clean/mod.rs
src/librustdoc/clean/mod.rs
+23
-1
src/librustdoc/html/format.rs
src/librustdoc/html/format.rs
+37
-8
src/librustdoc/html/render.rs
src/librustdoc/html/render.rs
+16
-12
src/test/run-make/rustdoc-where/Makefile
src/test/run-make/rustdoc-where/Makefile
+6
-0
src/test/run-make/rustdoc-where/foo.rs
src/test/run-make/rustdoc-where/foo.rs
+26
-0
src/test/run-make/rustdoc-where/verify.sh
src/test/run-make/rustdoc-where/verify.sh
+23
-0
未找到文件。
src/librustdoc/clean/mod.rs
浏览文件 @
54831f12
...
...
@@ -641,11 +641,27 @@ fn clean(&self, cx: &DocContext) -> Option<Lifetime> {
}
}
#[deriving(Clone,
Encodable,
Decodable,
PartialEq)]
pub
struct
WherePredicate
{
pub
name
:
String
,
pub
bounds
:
Vec
<
TyParamBound
>
}
impl
Clean
<
WherePredicate
>
for
ast
::
WherePredicate
{
fn
clean
(
&
self
,
cx
:
&
DocContext
)
->
WherePredicate
{
WherePredicate
{
name
:
self
.ident
.clean
(
cx
),
bounds
:
self
.bounds
.clean
(
cx
)
}
}
}
// maybe use a Generic enum and use ~[Generic]?
#[deriving(Clone,
Encodable,
Decodable,
PartialEq)]
pub
struct
Generics
{
pub
lifetimes
:
Vec
<
Lifetime
>
,
pub
type_params
:
Vec
<
TyParam
>
,
pub
where_predicates
:
Vec
<
WherePredicate
>
}
impl
Clean
<
Generics
>
for
ast
::
Generics
{
...
...
@@ -653,6 +669,7 @@ fn clean(&self, cx: &DocContext) -> Generics {
Generics
{
lifetimes
:
self
.lifetimes
.clean
(
cx
),
type_params
:
self
.ty_params
.clean
(
cx
),
where_predicates
:
self
.where_clause.predicates
.clean
(
cx
)
}
}
}
...
...
@@ -663,6 +680,7 @@ fn clean(&self, cx: &DocContext) -> Generics {
Generics
{
type_params
:
me
.types
.get_slice
(
space
)
.to_vec
()
.clean
(
cx
),
lifetimes
:
me
.regions
.get_slice
(
space
)
.to_vec
()
.clean
(
cx
),
where_predicates
:
vec!
[]
}
}
}
...
...
@@ -1260,7 +1278,9 @@ fn clean(&self, cx: &DocContext) -> Type {
ty
::
ty_bare_fn
(
ref
fty
)
=>
BareFunction
(
box
BareFunctionDecl
{
fn_style
:
fty
.fn_style
,
generics
:
Generics
{
lifetimes
:
Vec
::
new
(),
type_params
:
Vec
::
new
()
lifetimes
:
Vec
::
new
(),
type_params
:
Vec
::
new
(),
where_predicates
:
Vec
::
new
()
},
decl
:
(
ast_util
::
local_def
(
0
),
&
fty
.sig
)
.clean
(
cx
),
abi
:
fty
.abi
.to_string
(),
...
...
@@ -1670,6 +1690,7 @@ fn clean(&self, cx: &DocContext) -> BareFunctionDecl {
generics
:
Generics
{
lifetimes
:
self
.lifetimes
.clean
(
cx
),
type_params
:
Vec
::
new
(),
where_predicates
:
Vec
::
new
()
},
decl
:
self
.decl
.clean
(
cx
),
abi
:
self
.abi
.to_string
(),
...
...
@@ -2172,6 +2193,7 @@ fn clean(&self, cx: &DocContext) -> Item {
generics
:
Generics
{
lifetimes
:
Vec
::
new
(),
type_params
:
Vec
::
new
(),
where_predicates
:
Vec
::
new
()
},
}),
visibility
:
None
,
...
...
src/librustdoc/html/format.rs
浏览文件 @
54831f12
...
...
@@ -44,6 +44,11 @@
pub
struct
Stability
<
'a
>
(
pub
&
'a
Option
<
clean
::
Stability
>
);
/// Wrapper struct for emitting the stability level concisely.
pub
struct
ConciseStability
<
'a
>
(
pub
&
'a
Option
<
clean
::
Stability
>
);
/// Wrapper struct for emitting a where clause from Generics.
pub
struct
WhereClause
<
'a
>
(
pub
&
'a
clean
::
Generics
);
/// Wrapper struct for emitting type parameter bounds.
struct
TyParamBounds
<
'a
>
(
pub
&
'a
[
clean
::
TyParamBound
]);
impl
VisSpace
{
pub
fn
get
(
&
self
)
->
Option
<
ast
::
Visibility
>
{
...
...
@@ -57,6 +62,19 @@ pub fn get(&self) -> ast::FnStyle {
}
}
impl
<
'a
>
fmt
::
Show
for
TyParamBounds
<
'a
>
{
fn
fmt
(
&
self
,
f
:
&
mut
fmt
::
Formatter
)
->
fmt
::
Result
{
let
&
TyParamBounds
(
bounds
)
=
self
;
for
(
i
,
bound
)
in
bounds
.iter
()
.enumerate
()
{
if
i
>
0
{
try!
(
f
.write
(
" + "
.as_bytes
()));
}
try!
(
write!
(
f
,
"{}"
,
*
bound
));
}
Ok
(())
}
}
impl
fmt
::
Show
for
clean
::
Generics
{
fn
fmt
(
&
self
,
f
:
&
mut
fmt
::
Formatter
)
->
fmt
::
Result
{
if
self
.lifetimes
.len
()
==
0
&&
self
.type_params
.len
()
==
0
{
return
Ok
(())
}
...
...
@@ -73,7 +91,6 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if
self
.lifetimes
.len
()
>
0
{
try!
(
f
.write
(
", "
.as_bytes
()));
}
for
(
i
,
tp
)
in
self
.type_params
.iter
()
.enumerate
()
{
if
i
>
0
{
try!
(
f
.write
(
", "
.as_bytes
()))
...
...
@@ -81,13 +98,7 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!
(
f
.write
(
tp
.name
.as_bytes
()));
if
tp
.bounds
.len
()
>
0
{
try!
(
f
.write
(
": "
.as_bytes
()));
for
(
i
,
bound
)
in
tp
.bounds
.iter
()
.enumerate
()
{
if
i
>
0
{
try!
(
f
.write
(
" + "
.as_bytes
()));
}
try!
(
write!
(
f
,
"{}"
,
*
bound
));
}
try!
(
write!
(
f
,
": {}"
,
TyParamBounds
(
tp
.bounds
.as_slice
())));
}
match
tp
.default
{
...
...
@@ -101,6 +112,24 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
}
}
impl
<
'a
>
fmt
::
Show
for
WhereClause
<
'a
>
{
fn
fmt
(
&
self
,
f
:
&
mut
fmt
::
Formatter
)
->
fmt
::
Result
{
let
&
WhereClause
(
gens
)
=
self
;
if
gens
.where_predicates
.len
()
==
0
{
return
Ok
(());
}
try!
(
f
.write
(
" where "
.as_bytes
()));
for
(
i
,
pred
)
in
gens
.where_predicates
.iter
()
.enumerate
()
{
if
i
>
0
{
try!
(
f
.write
(
", "
.as_bytes
()));
}
let
bounds
=
pred
.bounds
.as_slice
();
try!
(
write!
(
f
,
"{}: {}"
,
pred
.name
,
TyParamBounds
(
bounds
)));
}
Ok
(())
}
}
impl
fmt
::
Show
for
clean
::
Lifetime
{
fn
fmt
(
&
self
,
f
:
&
mut
fmt
::
Formatter
)
->
fmt
::
Result
{
try!
(
f
.write
(
self
.get_ref
()
.as_bytes
()));
...
...
src/librustdoc/html/render.rs
浏览文件 @
54831f12
...
...
@@ -56,7 +56,7 @@
use
doctree
;
use
fold
::
DocFolder
;
use
html
::
format
::{
VisSpace
,
Method
,
FnStyleSpace
,
MutableSpace
,
Stability
};
use
html
::
format
::{
ConciseStability
};
use
html
::
format
::{
ConciseStability
,
WhereClause
};
use
html
::
highlight
;
use
html
::
item_type
::{
ItemType
,
shortty
};
use
html
::
item_type
;
...
...
@@ -1609,11 +1609,12 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fn
item_function
(
w
:
&
mut
fmt
::
Formatter
,
it
:
&
clean
::
Item
,
f
:
&
clean
::
Function
)
->
fmt
::
Result
{
try!
(
write!
(
w
,
"<pre class='rust fn'>{vis}{fn_style}fn
\
{name}{generics}{decl}</pre>"
,
{name}{generics}{decl}
{where_clause}
</pre>"
,
vis
=
VisSpace
(
it
.visibility
),
fn_style
=
FnStyleSpace
(
f
.fn_style
),
name
=
it
.name
.get_ref
()
.as_slice
(),
generics
=
f
.generics
,
where_clause
=
WhereClause
(
&
f
.generics
),
decl
=
f
.decl
));
document
(
w
,
it
)
}
...
...
@@ -1630,11 +1631,12 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
}
// Output the trait definition
try!
(
write!
(
w
,
"<pre class='rust trait'>{}trait {}{}{} "
,
try!
(
write!
(
w
,
"<pre class='rust trait'>{}trait {}{}{}
{}
"
,
VisSpace
(
it
.visibility
),
it
.name
.get_ref
()
.as_slice
(),
t
.generics
,
bounds
));
bounds
,
WhereClause
(
&
t
.generics
)));
let
required
=
t
.items
.iter
()
.filter
(|
m
|
{
match
**
m
{
...
...
@@ -1718,9 +1720,9 @@ fn trait_item(w: &mut fmt::Formatter, m: &clean::TraitMethod)
match
cache
.implementors
.find
(
&
it
.def_id
)
{
Some
(
implementors
)
=>
{
for
i
in
implementors
.iter
()
{
try!
(
writeln!
(
w
,
"<li>{}<code>impl{} {} for {}</code></li>"
,
try!
(
writeln!
(
w
,
"<li>{}<code>impl{} {} for {}
{}
</code></li>"
,
ConciseStability
(
&
i
.stability
),
i
.generics
,
i
.trait_
,
i
.for_
));
i
.generics
,
i
.trait_
,
i
.for_
,
WhereClause
(
&
i
.generics
)
));
}
}
None
=>
{}
...
...
@@ -1746,7 +1748,7 @@ fn fun(w: &mut fmt::Formatter, it: &clean::Item, fn_style: ast::FnStyle,
g
:
&
clean
::
Generics
,
selfty
:
&
clean
::
SelfTy
,
d
:
&
clean
::
FnDecl
)
->
fmt
::
Result
{
write!
(
w
,
"{}fn <a href='#{ty}.{name}' class='fnname'>{name}</a>
\
{generics}{decl}"
,
{generics}{decl}
{where_clause}
"
,
match
fn_style
{
ast
::
UnsafeFn
=>
"unsafe "
,
_
=>
""
,
...
...
@@ -1754,7 +1756,8 @@ fn fun(w: &mut fmt::Formatter, it: &clean::Item, fn_style: ast::FnStyle,
ty
=
shortty
(
it
),
name
=
it
.name
.get_ref
()
.as_slice
(),
generics
=
*
g
,
decl
=
Method
(
selfty
,
d
))
decl
=
Method
(
selfty
,
d
),
where_clause
=
WhereClause
(
g
))
}
match
meth
.inner
{
clean
::
TyMethodItem
(
ref
m
)
=>
{
...
...
@@ -1809,10 +1812,11 @@ fn item_struct(w: &mut fmt::Formatter, it: &clean::Item,
fn
item_enum
(
w
:
&
mut
fmt
::
Formatter
,
it
:
&
clean
::
Item
,
e
:
&
clean
::
Enum
)
->
fmt
::
Result
{
try!
(
write!
(
w
,
"<pre class='rust enum'>{}enum {}{}"
,
try!
(
write!
(
w
,
"<pre class='rust enum'>{}enum {}{}
{}
"
,
VisSpace
(
it
.visibility
),
it
.name
.get_ref
()
.as_slice
(),
e
.generics
));
e
.generics
,
WhereClause
(
&
e
.generics
)));
if
e
.variants
.len
()
==
0
&&
!
e
.variants_stripped
{
try!
(
write!
(
w
,
" {{}}"
));
}
else
{
...
...
@@ -1916,7 +1920,7 @@ fn render_struct(w: &mut fmt::Formatter, it: &clean::Item,
if
structhead
{
"struct "
}
else
{
""
},
it
.name
.get_ref
()
.as_slice
()));
match
g
{
Some
(
g
)
=>
try!
(
write!
(
w
,
"{}
"
,
*
g
)),
Some
(
g
)
=>
try!
(
write!
(
w
,
"{}
{}"
,
*
g
,
WhereClause
(
g
)
)),
None
=>
{}
}
match
ty
{
...
...
@@ -2008,7 +2012,7 @@ fn render_impl(w: &mut fmt::Formatter, i: &Impl) -> fmt::Result {
Some
(
ref
ty
)
=>
try!
(
write!
(
w
,
"{} for "
,
*
ty
)),
None
=>
{}
}
try!
(
write!
(
w
,
"{}
</code></h3>"
,
i
.impl_.for_
));
try!
(
write!
(
w
,
"{}
{}</code></h3>"
,
i
.impl_.for_
,
WhereClause
(
&
i
.impl_.generics
)
));
match
i
.dox
{
Some
(
ref
dox
)
=>
{
try!
(
write!
(
w
,
"<div class='docblock'>{}</div>"
,
...
...
src/test/run-make/rustdoc-where/Makefile
0 → 100644
浏览文件 @
54831f12
-include
../tools.mk
all
:
verify.sh foo.rs
$(HOST_RPATH_ENV)
$(RUSTDOC)
-w
html
-o
$(TMPDIR)
/doc foo.rs
cp
verify.sh
$(TMPDIR)
$(
call
RUN,verify.sh
)
$(TMPDIR)
src/test/run-make/rustdoc-where/foo.rs
0 → 100644
浏览文件 @
54831f12
// Copyright 2014 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.
pub
trait
MyTrait
{}
pub
struct
Alpha
<
A
>
where
A
:
MyTrait
;
pub
trait
Bravo
<
B
>
where
B
:
MyTrait
{}
pub
fn
charlie
<
C
>
()
where
C
:
MyTrait
{}
pub
struct
Delta
<
D
>
;
impl
<
D
>
Delta
<
D
>
where
D
:
MyTrait
{
pub
fn
delta
()
{}
}
pub
struct
Echo
<
E
>
;
impl
<
E
>
MyTrait
for
Echo
<
E
>
where
E
:
MyTrait
{}
pub
enum
Foxtrot
<
F
>
{}
impl
<
F
>
MyTrait
for
Foxtrot
<
F
>
where
F
:
MyTrait
{}
src/test/run-make/rustdoc-where/verify.sh
0 → 100755
浏览文件 @
54831f12
#!/bin/bash
set
-e
# $1 is the TMPDIR
DOC
=
$1
/doc/foo
grep
"Alpha.*where.*A:.*MyTrait"
$DOC
/struct.Alpha.html
>
/dev/null
echo
"Alpha"
grep
"Bravo.*where.*B:.*MyTrait"
$DOC
/trait.Bravo.html
>
/dev/null
echo
"Bravo"
grep
"charlie.*where.*C:.*MyTrait"
$DOC
/fn.charlie.html
>
/dev/null
echo
"Charlie"
grep
"impl.*Delta.*where.*D:.*MyTrait"
$DOC
/struct.Delta.html
>
/dev/null
echo
"Delta"
grep
"impl.*MyTrait.*for.*Echo.*where.*E:.*MyTrait"
$DOC
/struct.Echo.html
>
/dev/null
echo
"Echo"
grep
"impl.*MyTrait.*for.*Foxtrot.*where.*F:.*MyTrait"
$DOC
/enum.Foxtrot.html
>
/dev/null
echo
"Foxtrot"
# check "Implementors" section of MyTrait
grep
"impl.*MyTrait.*for.*Echo.*where.*E:.*MyTrait"
$DOC
/trait.MyTrait.html
>
/dev/null
grep
"impl.*MyTrait.*for.*Foxtrot.*where.*F:.*MyTrait"
$DOC
/trait.MyTrait.html
>
/dev/null
echo
"Implementors OK"
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录