Документирование Кода F#
В классе C# с одним конструктором я могу добавить сводную XML-документацию класса и XML-документацию конструктора:
///<summary>
///This class will solve all your problems
///</summary>
public class Awesome
{
/// <summary>
/// Initializes a new instance of the <see cref="Awesome"/> class.
/// </summary>
/// <param name="sauce">The secret sauce.</param>
public Awesome(string sauce)
{
//...implementation elided for security purposes
}
}
Как сделать то же самое с эквивалентным классом F#, чтобы сгенерированная документация была такой же?
type Awesome(sauce: string) =
//...implementation elided for security purposes
Уточнение: я знаю, что стандартные теги XML-документации могут использоваться в F#. Мой вопрос заключается в том, как добавить их в приведенный выше фрагмент кода, чтобы и тип, и конструктор были задокументированы.
4 ответа:
Я посмотрел на источник открытого компилятора F# и думаю, что Dr_Asik прав-нет способа документировать неявный конструктор с помощью XML - комментария. Узел, представляющий неявный конструктор в AST (см.
ImplicitCtor
вast.fs
Здесь ) не содержит поля для построения XML-документации (представленного в виде типаPreXmlDoc
).Вы все еще можете документировать все публичные API - вам нужно будет использовать метод, который Dr_Asik упоминал и неявный конструктор в виде
private
. Я согласен, что это немного некрасиво, но я думаю, что это более удобно, чем не использовать неявные конструкторы:type MyType private(a:int, u:unit) = /// <summary>Creates MyType</summary> /// <param name="a">Parameter A</param> new(a:int) = MyType(a, ())
Я добавил фиктивный параметр
u
в неявный конструктор, чтобы его можно было вызвать из открытого конструктора. В любом случае, я думаю, что это следует рассматривать как языковую ошибку, и поэтому я бы предложил сообщить об этомfsbugs
вmicrosoft
dotcom
.Кроме того, я думаю, что XML-документация в основном полезна в качестве источника данных для IntelliSense (который все еще нуждается в документации для конструктора, хотя), и я создал некоторые альтернативные инструменты F#, которые позволяют создавать учебники и документацию, написав файл скрипта F# со специальными комментариями с помощью Markdown (есть запись в блоге об этом) - так что вы можете рассматривать это как полезное дополнение к стандартному инструменту XML.
Точно так же, как и в C#: http://msdn.microsoft.com/en-us/library/dd233217.aspx
Если вы не ставите никаких тегов, F# предполагает, что это "summary":
/// This is the documentation type MyType() = ....
... эквивалентно
/// <summary>This is the documentation</summary> type MyType() = ...
Если вы хотите документировать конструктор, вам придется объявить его явно. Насколько мне известно, нет никакого способа, чтобы документ первичного конструктора.
/// [Type summary goes here] type MyType(a : int) = let m_a = a /// [Parameterless constructor documentation here] new() = MyType(0)
Нет способа документировать неявный конструктор с комментарием XML внутри исходного файла F# (.файловая система). Одним из обходных путей является явное объявление конструктора (см. ответ доктора асика). Другой способ-поместить XML-комментарии в файл подписи F# (.fsi).
Файл.ФС:
module File type Awesome(sauce: string) = member x.Sauce = sauce
Файл.fsi
module File type Awesome = class /// Implicit constructor summary for the Awesome type new : sauce:string -> Awesome member Sauce : string end
XML-документация для этой сборки теперь будет содержать правильное резюме:
<member name="M:File.Awesome.#ctor(System.String)"> <summary> Implicit constructor summary for the Awesome type </summary> </member>
Это действительно досадная проблема. Еще одно решение, которое я использовал, - это не полагаться на первичный конструктор:
/// Documentation type. type Awesome = val sauce : string /// <summary>Documentation constructor.</summary> /// <param name="sauce">Sauce. Lots of it.</param> new (sauce) = { sauce = sauce }
Более подробно, но никаких дополнительных файлов или частных конструкторов не требуется...