4

Мы используем protobuf-net для обработки наших потребностей в буфере протокола в приложении C#. Поскольку мы совместно используем наши .proto-файлы с другими, не управляемыми приложениями, мы генерируем наш код из .proto-файлов (не используя первый подход protobuf-net кода). Для того, чтобы оставаться как можно DRY, мы храним много документации по интерфейсу внутри самих файлов .proto. Мы сгенерируем код C# с помощью protogen.exe, вызванного целью создания проекта.Сохранение комментариев proto при создании C# с protobuf-net

Теперь, есть ли способ (автоматически) передать эти комментарии в скомпилированный код C#?

В принципе, учитывая .proto как это:

// This message is used to request a resource from the server 
message GetResource 
{ 
    // The identifier of the requested resource 
    required string resourceId = 1; 
} 

... Я хотел бы что-то вроде этого (IExtensible методы опущенные для удобства чтения):

/// <summary> 
/// This message is used to request a resource from the server 
/// </summary> 
[global::System.Serializable,global::ProtoBuf.ProtoContract([email protected]"GetResource")] 
public partial class GetResource : global::ProtoBuf.IExtensible 
{ 
    public GetResource() {} 

    private string _resourceId; 

    /// <summary> 
    /// The identifier of the requested resource 
    /// [Required] <-- Would be nice... 
    /// </summary> 
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, [email protected]"resourceId", 
    DataFormat = global::ProtoBuf.DataFormat.Default)] 
    public string ResourceId 
    { 
     get { return _resourceId; } 
     set { _resourceId = value; } 
    } 
} 
+0

Насколько я понимаю, это в настоящее время работает с 'protoc' от proto 3.0.0. Itz работает для C# и Java, но не для C++ AFAIKT –

+0

Да, наконец! Работает как шарм. –

ответ

2

В текущее время, я верьте, что ответ «нет». Насколько я знаю, «protoc» (инструмент Google для синтаксического анализа файлов .proto, который используется под капотом) молча отбрасывает комментарии - поэтому нет ничего доступного для чтения. Если пользовательский анализатор был написан, то да, это было бы возможно, но есть также язык двусмысленности, которые применяются комментарии, к которым строки, например:

// this probably relates to resourceId 
required string resourceId = 1; 

required int foo = 2; // but... is this foo? or bar? 
         // and what about this? 

     // what does this relate to? and why? 

// and this? what are the rules? 
required int bar = 3; 

Так 2 разным причинам: на данный момент, нет , Все рассмотренные предложения, хотя ... особенно если они поставляются с настраиваемым парсером, включены :)

Обратите внимание, что AFAIK эта информация отсутствует в большинстве (все?) Реализации по этой причине. Однако я рад, что меня исправили.

+1

Языковая неоднозначность может быть решена путем простого определения конвенции и приклеивания к ней. Я думаю, кто-то должен сделать запрос функции для protoc, чтобы включать комментарии в результат, если он уже не включен в список. Пользовательские парсеры оба раздражают, чтобы писать, и большинство из тех, что я видел, не полностью реализуют синтаксис .proto. – jpa

4

Фактически текущая версия поддерживает комментарии. Он может быть включен с --include_source_info.

Комментарии доступны в descriptor.Location [п] .leading_comments и trailing_comments: https://code.google.com/p/protobuf/source/browse/trunk/src/google/protobuf/descriptor.proto

Я добавил соответствующие свойства Protobuf-нетто класса Расположение:

private string _leading_comments = ""; 
[global::ProtoBuf.ProtoMember(3, IsRequired = false, Name = @"leading_comments", DataFormat = global::ProtoBuf.DataFormat.Default)] 
[global::System.ComponentModel.DefaultValue("")] 
public string leading_comments 
{ 
    get { return _leading_comments; } 
    set { _leading_comments = value; } 
} 

private string _trailing_comments = ""; 
[global::ProtoBuf.ProtoMember(4, IsRequired = false, Name = @"trailing_comments", DataFormat = global::ProtoBuf.DataFormat.Default)] 
[global::System.ComponentModel.DefaultValue("")] 
public string trailing_comments 
{ 
    get { return _trailing_comments; } 
    set { _trailing_comments = value; } 
} 

и добавил - include_source_info для вызова протока (ProtoBuf.CodeGenerator.InputFileLoader)

И места с комментариями были добавлены в генерируемый XML:

<?xml version="1.0" encoding="utf-16"?> 
<FileDescriptorSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <file> 
    <FileDescriptorProto> 
     <name>Test.proto</name> 
     <dependency /> 
     <message_type> 
     <DescriptorProto> 
      <name>Test2</name> 
      <field> 
      <FieldDescriptorProto> 
       <name>IntValue</name> 
       <number>1</number> 
       <type>TYPE_INT32</type> 
      </FieldDescriptorProto> 
      </field> 
      <extension /> 
      <nested_type /> 
      <enum_type /> 
      <extension_range /> 
     </DescriptorProto> 
     </message_type> 
     <enum_type /> 
     <service /> 
     <extension /> 
     <source_code_info> 
     <location> 
... 
     <Location> 
      <path> 
       <int>4</int> 
       <int>0</int> 
       <int>2</int> 
       <int>0</int> 
      </path> 
      <span> 
       <int>1</int> 
       <int>0</int> 
       <int>28</int> 
      </span> 
      <trailing_comments> some comment 
</trailing_comments> 
      </Location> 
... 
      </location> 
     </source_code_info> 
    </FileDescriptorProto> 
    </file> 
</FileDescriptorSet> 

источник .proto:

message Test2{ 
optional int32 IntValue = 1;// some comment 
} 

Но я не силен в XSLT, чтобы обновить ProtoGen/csharp.xslt включать комментарии в CS файл генерируется

+1

добавлен запрос функции для protobuf-net issue racker. https://code.google.com/p/protobuf-net/issues/detail? id = 372 & thanks = 372 & ts = 1366240737 – knst

+0

Интересно, спасибо! Надеюсь, что это будет реализовано в Protobuf-Net. Это было бы отличным дополнением. –

Смежные вопросы