Skip to content

Conversation

@romamihalich
Copy link

Summary

Found some issues in C# doc generation and decided to fix it.
Number 4. of changes list fixes #181.

Changes

1. Fix "returns" insertion

1.1 Method returning void

Not insert if void. Currently checks for first child in ret.return_statement, but it's not enough, because it modifiers like public, static etc can be put before return type.

before:

class TestClass
{
   /// <summary>
   /// 
   /// </summary>
   /// <param name="p1"></param>
   /// <returns></returns>
   public void TestMethod(int p1)
   {
   }
}

after:

class TestClass
{
   /// <summary>
   /// 
   /// </summary>
   /// <param name="p1"></param>
   public void TestMethod(int p1)
   {
   }
}

1.2 Constructor

Not insert at all. Currently inserts every time.

before:

class TestClass
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="p"></param>
    /// <returns></returns>
    public TestClass(int p)
    {
    }
}

after:

class TestClass
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="p"></param>
    public TestClass(int p)
    {
    }
}

1.3 Indexer

Change logic from search for return statement to checking if getter is present, because get might not contain return statement, but instead =>, also might not contain body at all in interfaces.
before:

interface IndexerTest
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="i"></param>
    public IndexerTest this[int i] { set; }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="i"></param>
    public IndexerTest this[int i] { get; }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="i"></param>
    public IndexerTest this[int i] { get; set; }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="i"></param>
    public IndexerTest this[int i] { get => null; set { } }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public IndexerTest this[int i] { get { return null; } }
}

after:

interface IndexerTest
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="i"></param>
    public IndexerTest this[int i] { set; }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public IndexerTest this[int i] { get; }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public IndexerTest this[int i] { get; set; }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public IndexerTest this[int i] { get => null; set { } }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public IndexerTest this[int i] { get { return null; } }
}

2. Fix parameter generation when attribute is attached to it

Currently gets 2-nd position of children in parameter. Changed it to take last child instead.

before:

class AttributeTest
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="string"></param>
    /// <param name="p2"></param>
    /// <returns></returns>
    private string TestAttribute([Attr] string p, int p2)
    {
    }
}

after:

class AttributeTest
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="p"></param>
    /// <param name="p2"></param>
    /// <returns></returns>
    private string TestAttribute([Attr] string p, int p2)
    {
    }
}

3. Added support for primary constructors

before:

/// <summary>
/// 
/// </summary>
class PrimaryConstructorTest(int p1, string p2)
{
}

after:

/// <summary>
/// 
/// </summary>
/// <param name="p1"></param>
/// <param name="p2"></param>
class PrimaryConstructorTest(int p1, string p2)
{
}

4. Added support for records, record structs, structs

Same logic as for classes is applied.

/// <summary>
/// 
/// </summary>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T2"></typeparam>
/// <typeparam name="T3"></typeparam>
/// <param name="P1"></param>
record RecordTest<T1, T2, T3>(int P1);

/// <summary>
/// 
/// </summary>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T2"></typeparam>
/// <typeparam name="T3"></typeparam>
/// <param name="P1"></param>
/// <param name="P2"></param>
record struct RecordStructTest<T1, T2, T3>(string P1, int P2);

/// <summary>
/// 
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="a"></param>
/// <param name="b"></param>
struct StructTest<T>(Type1 a, int b)
{
}

5. Change parameters and type parameters order for xmldoc (type parameters should go first)

before:

class TypeParametersOrder
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="p1"></param>
    /// <param name="p2"></param>
    /// <typeparam name="T1"></typeparam>
    /// <typeparam name="T2"></typeparam>
    /// <returns></returns>
    public void Test<T1, T2>(string p1, string p2)
    {
    }
}

after:

class TypeParametersOrder
{
    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T1"></typeparam>
    /// <typeparam name="T2"></typeparam>
    /// <param name="p1"></param>
    /// <param name="p2"></param>
    public void Test<T1, T2>(string p1, string p2)
    {
    }
}

1. Fix "return" insertion for:
    - method returning void (not insert if void)
    - constructor (not insert at all)
    - indexer (change logic from search for return statement to checking if getter is present, because get might not contain return statement, but instead "=>", also might not contain body at all in interfaces)
2. Fix parameter generation when attribute is attached to it
3. Added support for primary constructors
4. Added support for records, record structs, structs (same logic as classes)
5. Change parameters and type parameters order for xmldoc (type parameters should go first)
@romamihalich
Copy link
Author

Also "doxygen" is default annotation convention for C#. Most of C# devs use "xmldoc". Maybe it makes sense to set "xmldoc" as default?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add support for records in C#

1 participant