NeVeSpl / NTypewriter

File/code generator using Scriban text templates populated with C# code metadata from Roslyn API.
https://nevespl.github.io/NTypewriter/
MIT License
126 stars 24 forks source link

[Question] Is it possible to output a property's default value? #128

Open rmarskell opened 1 month ago

rmarskell commented 1 month ago

Hey there, I'm looking to integrate NTypewriter (source generator) into a new project and so far I'm loving the capabilities. A previous project I worked on used TypeGen and while it was good for simplicity, there was no real control over the templates. I've been able to replicate all of the functionality of TypeGen with NTypewriter, except one big thing (default values) and I'm hoping I'm just missing something/not searching the correct terms.

Basically, given the following C# classes...

using System.Collections.Generic;

public class NameCountClass {
  public string Name { get; set; }
  public int Count { get; set; }
}

public static class StaticClass {
  public static string StaticProperty => "Test";

  public static Dictionary<string, NameCountClass> NameCounts = new Dictionary<string, NameCountClass>() {
    { "a", new NameCountClass() { Name = "A name", Count = 123 } },
    { "b", new NameCountClass() { Name = "B name", Count = 321 } }
  };
}

...is it possible to output the default values in a TS class something like this:

export class StaticClass {
  static StaticProperty: string = "Test";
  static NameCounts: { [key: string]: NameCountClass } = {"a":{"Name":"A name", "Count": 123}, "b":{"Name":"B name", "Count": 321}}
}

Basically, is there a way to access the default values for properties to output them?

NeVeSpl commented 1 month ago

Only field constants are supported.

Property's default value, property's getter defined by expression body, object and collection initializers are not currently supported. Mostly because these are C# syntax sugar that do not exist on Roslyn level (symbol/semantic).

But all the objects in NTypewriter code model have ISymbolBase.SourceCode property that gives access to C# syntax that defines a given object, so you can write a custom function that will parse any C# syntax to any TS.

rmarskell commented 1 month ago

Thanks for the quick reply. Is there any example code I could look at that utilizes that property as you suggest?

NeVeSpl commented 1 month ago

There is no example, and as far as I know, no one has ever tried to get access to what you call a property's default value.

The type of ISymbolBase.SourceCode is string, and probably some regular expression would be necessary to extract required informations, but all this can be done on the user side.