diff --git a/tonic-build/src/client.rs b/tonic-build/src/client.rs index ff8eeaf..a104eb7 100644 --- a/tonic-build/src/client.rs +++ b/tonic-build/src/client.rs @@ -1,3 +1,4 @@ +use crate::generate_doc_comments; use proc_macro2::TokenStream; use prost_build::{Method, Service}; use quote::{format_ident, quote}; @@ -8,8 +9,10 @@ pub(crate) fn generate(service: &Service, proto: &str) -> TokenStream { let methods = generate_methods(service, proto); let connect = generate_connect(&service_ident); + let service_doc = generate_doc_comments(&service.comments.leading); quote! { + #service_doc pub struct #service_ident { inner: tonic::client::Grpc, } @@ -75,6 +78,8 @@ fn generate_methods(service: &Service, proto: &str) -> TokenStream { service.package, service.proto_name, method.proto_name ); + stream.extend(generate_doc_comments(&method.comments.leading)); + let method = match (method.client_streaming, method.server_streaming) { (false, false) => generate_unary(method, &proto, path), (false, true) => generate_server_streaming(method, &proto, path), diff --git a/tonic-build/src/lib.rs b/tonic-build/src/lib.rs index 936af5f..0995814 100644 --- a/tonic-build/src/lib.rs +++ b/tonic-build/src/lib.rs @@ -25,8 +25,9 @@ //! } //! ``` -use proc_macro2::TokenStream; +use proc_macro2::{TokenStream, Delimiter, Group, Ident, Literal, Punct, Spacing, Span}; use prost_build::Config; +use quote::TokenStreamExt; #[cfg(feature = "rustfmt")] use std::process::Command; @@ -199,3 +200,28 @@ impl prost_build::ServiceGenerator for ServiceGenerator { } } } + +// Generate a singular line of a doc comment +fn generate_doc_comment(comment: &str, stream: &mut TokenStream) { + let mut doc_stream = TokenStream::new(); + + doc_stream.append(Ident::new("doc", Span::call_site())); + doc_stream.append(Punct::new('=', Spacing::Alone)); + doc_stream.append(Literal::string(&comment)); + + let group = Group::new(Delimiter::Bracket, doc_stream); + + stream.append(Punct::new('#', Spacing::Alone)); + stream.append(group); +} + +// Generate a larger doc comment composed of many lines of doc comments +fn generate_doc_comments>(comments: &[T]) -> TokenStream { + let mut stream = TokenStream::new(); + + for comment in comments { + generate_doc_comment(comment.as_ref(), &mut stream); + } + + stream +} diff --git a/tonic-build/src/service.rs b/tonic-build/src/service.rs index a605ca5..4099fc2 100644 --- a/tonic-build/src/service.rs +++ b/tonic-build/src/service.rs @@ -1,3 +1,4 @@ +use crate::generate_doc_comments; use proc_macro2::{Span, TokenStream}; use prost_build::{Method, Service}; use quote::quote; @@ -10,10 +11,12 @@ pub(crate) fn generate(service: &Service, proto_path: &str) -> TokenStream { let server_service = quote::format_ident!("{}ServerSvc", service.name); let server_trait = quote::format_ident!("{}", service.name); let generated_trait = generate_trait(service, proto_path, server_trait.clone()); + let service_doc = generate_doc_comments(&service.comments.leading); quote! { #generated_trait + #service_doc #[derive(Clone, Debug)] pub struct #server_make_service { inner: Arc,