-
Notifications
You must be signed in to change notification settings - Fork 65
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Issue #3 and #4: Add field documentation and annotation #6
Changes from 7 commits
411c8e6
7d187d1
4084261
6093af4
911dbc8
3981c19
3e44fb6
2d8d4b0
5aafce7
3d032ea
95b6673
6e17dc2
2528d99
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -128,12 +128,18 @@ enum Fields { | |
|
||
/// Defines a struct field. | ||
#[derive(Debug, Clone)] | ||
struct Field { | ||
pub struct Field { | ||
/// Field name | ||
name: String, | ||
|
||
/// Field type | ||
ty: Type, | ||
|
||
/// Field documentation | ||
documentation: String, | ||
|
||
/// Field annotation | ||
annotation: String, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this probably should be a |
||
} | ||
|
||
/// Defines an associated type. | ||
|
@@ -582,6 +588,16 @@ impl Struct { | |
self | ||
} | ||
|
||
/// Push a named field to the struct. | ||
/// | ||
/// A struct can either set named fields with this function or tuple fields | ||
/// with `push_tuple_field`, but not both. | ||
pub fn push_field(&mut self, field: Field) -> &mut Self | ||
{ | ||
self.fields.push_named(field); | ||
self | ||
} | ||
|
||
/// Add a named field to the struct. | ||
/// | ||
/// A struct can either set named fields with this function or tuple fields | ||
|
@@ -1073,31 +1089,63 @@ impl AssociatedType { | |
} | ||
} | ||
|
||
// ===== impl Field ===== | ||
|
||
impl Field { | ||
/// Return a field definition with the provided name and type | ||
pub fn new<T>(name: &str, ty: T) -> Self | ||
where T: Into<Type>, | ||
{ | ||
Field { | ||
name: name.into(), | ||
ty: ty.into(), | ||
documentation: String::new(), | ||
annotation: String::new(), | ||
} | ||
} | ||
|
||
/// Set field's documentation. | ||
pub fn with_documentation(&mut self, documentation: &str) -> &mut Self { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Would you mind naming this There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure! Done in 2d8d4b0. |
||
self.documentation = documentation.into(); | ||
self | ||
} | ||
|
||
/// Set field's annotation. | ||
pub fn with_annotation(&mut self, annotation: &str) -> &mut Self { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you name this There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done in 5aafce7. |
||
self.annotation = annotation.into(); | ||
self | ||
} | ||
} | ||
|
||
// ===== impl Fields ===== | ||
|
||
impl Fields { | ||
fn named<T>(&mut self, name: &str, ty: T) -> &mut Self | ||
where T: Into<Type>, | ||
fn push_named(&mut self, field: Field) -> &mut Self | ||
{ | ||
match *self { | ||
Fields::Empty => { | ||
*self = Fields::Named(vec![Field { | ||
name: name.to_string(), | ||
ty: ty.into(), | ||
}]); | ||
*self = Fields::Named(vec![field]); | ||
} | ||
Fields::Named(ref mut fields) => { | ||
fields.push(Field { | ||
name: name.to_string(), | ||
ty: ty.into(), | ||
}); | ||
fields.push(field); | ||
} | ||
_ => panic!("field list is named"), | ||
} | ||
}; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think that this semicolon is needed. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hum! interesting. I though the match would return... Fixed in 95b6673. |
||
|
||
self | ||
} | ||
|
||
fn named<T>(&mut self, name: &str, ty: T) -> &mut Self | ||
where T: Into<Type>, | ||
{ | ||
self.push_named(Field { | ||
name: name.to_string(), | ||
ty: ty.into(), | ||
documentation: String::new(), | ||
annotation: String::new(), | ||
}) | ||
} | ||
|
||
fn tuple<T>(&mut self, ty: T) -> &mut Self | ||
where T: Into<Type>, | ||
{ | ||
|
@@ -1121,6 +1169,12 @@ impl Fields { | |
|
||
fmt.block(|fmt| { | ||
for f in fields { | ||
if !f.documentation.is_empty() { | ||
write!(fmt, "/// {}\n", f.documentation)?; | ||
} | ||
if !f.annotation.is_empty() { | ||
write!(fmt, "{}\n", f.annotation)?; | ||
} | ||
write!(fmt, "{}: ", f.name)?; | ||
f.ty.fmt(fmt)?; | ||
write!(fmt, ",\n")?; | ||
|
@@ -1196,6 +1250,8 @@ impl Impl { | |
self.assoc_tys.push(Field { | ||
name: name.to_string(), | ||
ty: ty.into(), | ||
documentation: String::new(), | ||
annotation: String::new(), | ||
}); | ||
|
||
self | ||
|
@@ -1340,6 +1396,11 @@ impl Function { | |
self.args.push(Field { | ||
name: name.to_string(), | ||
ty: ty.into(), | ||
// While a `Field` is used here, both `documentation` | ||
// and `annotation` does not make sense for function arguments. | ||
// Simply use empty strings. | ||
documentation: String::new(), | ||
annotation: String::new(), | ||
}); | ||
|
||
self | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Documentation strings are tricky. Reading the diff, it looks like only a single doc string line is supported. I'm not sure what the best option would be to support multi lines. Either "\n" could be detected in the documentation string and then it all gets formatted, or
documentation
could be aVec<String>
.Thoughts"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How about different functions? Have
doc()
take aVec<String>
to stay the same asannotation()
and add something likedoc_with_newlines()
which takes aString
.