'Reinforced.Typings naming conflict for multi-file setup
I have the following classes:
namespace MyApp
{
public class Class1
{
public Nested.Class1 MyProperty { get; set; }
}
}
namespace MyApp.Nested
{
public class Class1
{
public int MyProperty { get; set; }
}
}
Fluent config:
public static void Configure(ConfigurationBuilder builder)
{
builder.Global(conf => conf.UseModules());
builder.ExportAsInterface<Class1>().WithPublicProperties();
builder.ExportAsInterface<Nested.Class1>().WithPublicProperties();
}
Which is translated to the following:
// ./Nested/IClass1.ts
export interface IClass1
{
MyProperty: number;
}
// ./IClass1.ts
import { IClass1 } from './Nested/IClass1';
export interface IClass1
{
MyProperty: IClass1;
}
As you can see there is a naming conflict for IClass1. The question is, is it possible to overcome this somehow? Maybe to generate something like this:
import * as _IClass1 from './Nested/IClass1';
export interface IClass1
{
MyProperty: _IClass1.IClass1;
}
Solution 1:[1]
After giving it some thought I finally came up with the following:
private class MyInterfaceGenerator : InterfaceCodeGenerator
{
public override RtInterface GenerateNode(Type element, RtInterface result, TypeResolver resolver)
{
var node = base.GenerateNode(element, result, resolver);
var typeName = node.Name.TypeName;
typeName = typeName.Substring(typeName.IndexOf('.') + 1);
node.Name = new RtSimpleTypeName(node.Name.GenericArguments, node.Name.Prefix, typeName);
return node;
}
}
private class MyEnumGenerator : EnumGenerator
{
public override RtEnum GenerateNode(Type element, RtEnum result, TypeResolver resolver)
{
var resultEnum = base.GenerateNode(element, result, resolver);
var typeName = resultEnum.EnumName.TypeName;
typeName = typeName.Substring(typeName.IndexOf('.') + 1);
resultEnum.EnumName = new RtSimpleTypeName(resultEnum.EnumName.GenericArguments, resultEnum.EnumName.Prefix, typeName);
return resultEnum;
}
}
private class MyRefProcessor : ReferenceProcessorBase
{
public override IEnumerable<RtImport> FilterImports(IEnumerable<RtImport> imports, ExportedFile file)
{
foreach (var import in imports)
{
import.Target = "* as " + import.Target.Substring(2, import.Target.IndexOf(".") - 2);
}
return imports;
}
public override IEnumerable<RtReference> FilterReferences(IEnumerable<RtReference> references, ExportedFile file)
{
return references;
}
}
private static string StripGeneric(string name)
{
var index = name.IndexOf('`');
return index == -1 ? name : name.Substring(0, index);
}
private static string NormalizeTypeName(Type type)
{
return StripGeneric(type.FullName).Replace('.', '_').Replace('+', '_') + "." + StripGeneric(type.Name);
}
private static string NormalizeFileName(Type type)
{
var result = type.FullName.Replace('.', '/').Replace('+', '_');
return result + ".ts";
}
public static void Configure(ConfigurationBuilder builder)
{
builder.Global(conf =>
conf.UseModules()
.WithReferencesProcessor<MyRefProcessor>()
);
builder.ExportAsInterfaces(
interfaceTypes,
conf =>
{
conf.WithCodeGenerator<MyInterfaceGenerator>()
.ExportTo(NormalizeFileName(conf.Type))
.OverrideName(NormalizeTypeName(conf.Type));
}
);
builder.ExportAsEnums(
enumTypes,
conf =>
{
conf.WithCodeGenerator<MyEnumGenerator>()
.ExportTo(NormalizeFileName(conf.Type))
.OverrideName(NormalizeTypeName(conf.Type));
}
);
}
Obviously this is not what the author of the library intended, however this workaround seems to solve all naming conflicts that I had.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | helcoder |
