Подтвердить что ты не робот

Документирование кода F #

В классе С# с единственным конструктором я могу добавить XML-документацию по 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 #. Мой вопрос заключается в том, как добавить их к приведенному выше фрагменту, чтобы документировать как тип, так и конструктор.

4b9b3361

Ответ 1

Я посмотрел источник компилятора F # с открытым исходным кодом, и я думаю, что Dr_Asik прав - нет способа документировать неявный конструктор с комментарием XML. node, который представляет неявный конструктор в 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 dot com.

Как и в стороне, я думаю, что XML-документация в основном полезна как источник данных для IntelliSense (которая все еще нуждается в документации для конструктора), и я создал несколько альтернативных инструментов F #, которые позволяют создавать учебные пособия и документацию, F # script со специальными комментариями с помощью Markdown (есть сообщение в блоге об этом) - так что вы можете считать это полезным дополнением к стандартным инструментам XML.

Ответ 2

Точно так же, как в С#: 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() = ...

Если вы хотите документировать конструктор, вам придется объявить его явно. AFAIK нет способа документировать основной конструктор.

/// [Type summary goes here]
type MyType(a : int) =
    let m_a = a
    /// [Parameterless constructor documentation here]
    new() = MyType(0)

Ответ 3

Невозможно документировать неявный конструктор с комментарием XML в исходном файле F # (.fs). Один из способов - явно объявить конструктор (см. Ответ д-ра Асика). Другой - помещать ваши комментарии XML в файл подписи F # (.fsi).

File.fs:

module File

type Awesome(sauce: string) =
    member x.Sauce = sauce

File.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>

Ответ 4

Это действительно раздражающая проблема. Другое решение, которое я использовал, заключается в том, чтобы не полагаться на первичный конструктор:

/// Documentation type.
type Awesome =
    val sauce : string
    /// <summary>Documentation constructor.</summary>
    /// <param name="sauce">Sauce. Lots of it.</param>
    new (sauce) = { sauce = sauce }

Более подробные, но не нужны дополнительные файлы или частные конструкторы...