Skip to content

Commit d5f27c4

Browse files
author
Denis Peshkov
authored
Merge pull request #4 from denis-peshkov/feature/3_Dynamic_build_module_name_from_server_dto's_namespace
Feature/3 dynamic build module name from server dto's namespace
2 parents 24e3049 + 4f182f5 commit d5f27c4

3 files changed

Lines changed: 52 additions & 100 deletions

File tree

src/TypeScriptDefinitionGenerator/Generator/IntellisenseParser.cs

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ namespace TypeScriptDefinitionGenerator
1313
{
1414
internal static class IntellisenseParser
1515
{
16-
private const string ModuleNameAttributeName = "TypeScriptModule";
1716
private static readonly Regex IsNumber = new Regex("^[0-9a-fx]+[ul]{0,2}$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
1817
private static Project _project;
1918

@@ -47,6 +46,7 @@ internal static IEnumerable<IntellisenseObject> ProcessFile(ProjectItem item, Ha
4746

4847
return new HashSet<IntellisenseObject>(list);
4948
}
49+
5050
private static void ProcessElement(CodeElement element, List<IntellisenseObject> list, HashSet<CodeClass> underProcess)
5151
{
5252
if (element.Kind == vsCMElement.vsCMElementEnum)
@@ -95,9 +95,8 @@ private static void ProcessElement(CodeElement element, List<IntellisenseObject>
9595

9696
private static bool ShouldProcess(CodeElement member)
9797
{
98-
return
99-
member.Kind == vsCMElement.vsCMElementClass
100-
|| member.Kind == vsCMElement.vsCMElementEnum;
98+
return member.Kind == vsCMElement.vsCMElementClass ||
99+
member.Kind == vsCMElement.vsCMElementEnum;
101100
}
102101

103102
private static void ProcessEnum(CodeEnum element, List<IntellisenseObject> list)
@@ -204,45 +203,32 @@ private static bool IsPublic(CodeFunction cf)
204203

205204
private static string GetClassName(CodeClass cc)
206205
{
207-
return GetDataContractName(cc, "Name") ?? cc.Name;
206+
return cc.Name;
208207
}
209208

210-
private static string GetNamespace(CodeClass cc)
209+
private static string GetEnumName(CodeEnum cc)
211210
{
212-
return GetDataContractName(cc, "Namespace") ?? GetNamespace(cc.Attributes);
211+
return cc.Name;
213212
}
214213

215-
private static string GetDataContractName(CodeClass cc, string attrName)
214+
private static string GetNamespace(CodeClass cc)
216215
{
217-
var dataContractAttribute = cc.Attributes.Cast<CodeAttribute>().Where(a => a.Name == "DataContract");
218-
219-
if (!dataContractAttribute.Any())
220-
return null;
216+
if (!Options.UseNamespace)
217+
return Options.DefaultModuleName;
221218

222-
string name = null;
223-
var keyValues = dataContractAttribute.First().Children.OfType<CodeAttributeArgument>()
224-
.ToDictionary(a => a.Name, a => (a.Value ?? "").Trim('\"', '\''));
225-
226-
if (keyValues.ContainsKey(attrName))
227-
name = keyValues[attrName];
228-
229-
return name;
219+
return cc == null
220+
? Options.DefaultModuleName
221+
: cc.Namespace.FullName;
230222
}
231223

232-
private static string GetNamespace(CodeEnum cc) { return GetNamespace(cc.Attributes); }
233-
234-
private static string GetNamespace(CodeElements attrs)
224+
private static string GetNamespace(CodeEnum cc)
235225
{
236-
if (attrs == null) return Options.DefaultModuleName;
237-
238-
var namespaceFromAttr = from a in attrs.Cast<CodeAttribute2>()
239-
where a.Name.EndsWith(ModuleNameAttributeName, StringComparison.OrdinalIgnoreCase)
240-
from arg in a.Arguments.Cast<CodeAttributeArgument>()
241-
let v = (arg.Value ?? "").Trim('\"')
242-
where !string.IsNullOrWhiteSpace(v)
243-
select v;
226+
if (!Options.UseNamespace)
227+
return Options.DefaultModuleName;
244228

245-
return namespaceFromAttr.FirstOrDefault() ?? Options.DefaultModuleName;
229+
return cc == null
230+
? Options.DefaultModuleName
231+
: cc.Namespace.FullName;
246232
}
247233

248234
private static IntellisenseType GetType(CodeClass rootElement, CodeTypeRef codeTypeRef, HashSet<string> traversedTypes, HashSet<string> references)
@@ -292,7 +278,7 @@ private static IntellisenseType GetType(CodeClass rootElement, CodeTypeRef codeT
292278
}
293279

294280
result.ClientSideReferenceName = (codeClass != null && hasIntellisense ? (Options.DeclareModule ? GetNamespace(codeClass) + "." : "") + Utility.CamelCaseClassName(GetClassName(codeClass)) : null) ??
295-
(codeEnum != null && hasIntellisense ? (Options.DeclareModule ? GetNamespace(codeEnum) + "." : "") + Utility.CamelCaseClassName(codeEnum.Name) : null);
281+
(codeEnum != null && hasIntellisense ? (Options.DeclareModule ? GetNamespace(codeEnum) + "." : "") + Utility.CamelCaseClassName(GetEnumName(codeEnum)) : null);
296282
}
297283

298284
if (!isPrimitive && (codeClass != null || codeEnum != null) && !traversedTypes.Contains(effectiveTypeRef.CodeType.FullName) && !isCollection)

src/TypeScriptDefinitionGenerator/Options.cs

Lines changed: 26 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class OptionsDialogPage : DialogPage
1717

1818
internal const bool _defClassInsteadOfInterface = false;
1919
internal const string _defModuleName = "Server.Dtos";
20+
internal const bool _defUseNamespace = true;
2021
internal const bool _defDeclareModule = true;
2122
internal const bool _defIgnoreIntellisense = true;
2223

@@ -34,7 +35,7 @@ public class OptionsDialogPage : DialogPage
3435
[DisplayName("Camel case type names")]
3536
[DefaultValue(_defCamelCaseTypeNames)]
3637
public bool CamelCaseTypeNames { get; set; } = _defCamelCaseTypeNames;
37-
38+
3839
[Category("Compatibilty")]
3940
[DisplayName("Web Essentials 2015 file names")]
4041
[Description("Web Essentials 2015 format is <filename>.cs.d.ts instead of <filename>.d.ts")]
@@ -46,6 +47,11 @@ public class OptionsDialogPage : DialogPage
4647
[Description("Set the top-level module name for the generated .d.ts file. Default is \"Server.Dtos\"")]
4748
public string DefaultModuleName { get; set; } = _defModuleName;
4849

50+
[Category("Settings")]
51+
[DisplayName("Use Namespace")]
52+
[Description("Use Namespace by default, otherwise \"Default Module name\" will be taken.")]
53+
public bool UseNamespace { get; set; } = _defUseNamespace;
54+
4955
[Category("Settings")]
5056
[DisplayName("Class instead of Interface")]
5157
[Description("Controls whether to generate a class or an interface: default is an Interface")]
@@ -67,71 +73,27 @@ public class OptionsDialogPage : DialogPage
6773

6874
public class Options
6975
{
70-
const string OVERRIDE_FILE_NAME = "tsdefgen.json";
71-
static OptionsOverride overrides { get; set; } = null;
72-
public static bool CamelCaseEnumerationValues
73-
{
74-
get
75-
{
76-
return overrides != null ? overrides.CamelCaseEnumerationValues : DtsPackage.Options.CamelCaseEnumerationValues;
77-
}
78-
}
76+
private const string OVERRIDE_FILE_NAME = "tsdefgen.json";
7977

80-
public static bool CamelCasePropertyNames
81-
{
82-
get
83-
{
84-
return overrides != null ? overrides.CamelCasePropertyNames : DtsPackage.Options.CamelCasePropertyNames;
85-
}
86-
}
78+
private static OptionsOverride overrides { get; set; } = null;
8779

88-
public static bool CamelCaseTypeNames
89-
{
90-
get
91-
{
92-
return overrides != null ? overrides.CamelCaseTypeNames : DtsPackage.Options.CamelCaseTypeNames;
93-
}
94-
}
95-
//todo: set to server namespace
96-
public static string DefaultModuleName
97-
{
98-
get
99-
{
100-
return overrides != null ? overrides.DefaultModuleName : DtsPackage.Options.DefaultModuleName;
101-
}
102-
}
80+
public static bool CamelCaseEnumerationValues => overrides?.CamelCaseEnumerationValues ?? DtsPackage.Options.CamelCaseEnumerationValues;
10381

104-
public static bool ClassInsteadOfInterface
105-
{
106-
get
107-
{
108-
return overrides != null ? overrides.ClassInsteadOfInterface : DtsPackage.Options.ClassInsteadOfInterface;
109-
}
110-
}
82+
public static bool CamelCasePropertyNames => overrides?.CamelCasePropertyNames ?? DtsPackage.Options.CamelCasePropertyNames;
11183

112-
public static bool DeclareModule
113-
{
114-
get
115-
{
116-
return overrides != null ? overrides.DeclareModule : DtsPackage.Options.DeclareModule;
117-
}
118-
}
84+
public static bool CamelCaseTypeNames => overrides?.CamelCaseTypeNames ?? DtsPackage.Options.CamelCaseTypeNames;
11985

120-
public static bool IgnoreIntellisense
121-
{
122-
get
123-
{
124-
return overrides != null ? overrides.IgnoreIntellisense : DtsPackage.Options.IgnoreIntellisense;
125-
}
126-
}
86+
public static string DefaultModuleName => overrides?.DefaultModuleName ?? DtsPackage.Options.DefaultModuleName;
12787

128-
public static bool WebEssentials2015
129-
{
130-
get
131-
{
132-
return overrides != null ? overrides.WebEssentials2015 : DtsPackage.Options.WebEssentials2015;
133-
}
134-
}
88+
public static bool UseNamespace => overrides?.UseNamespace ?? DtsPackage.Options.UseNamespace;
89+
90+
public static bool ClassInsteadOfInterface => overrides?.ClassInsteadOfInterface ?? DtsPackage.Options.ClassInsteadOfInterface;
91+
92+
public static bool DeclareModule => overrides?.DeclareModule ?? DtsPackage.Options.DeclareModule;
93+
94+
public static bool IgnoreIntellisense => overrides?.IgnoreIntellisense ?? DtsPackage.Options.IgnoreIntellisense;
95+
96+
public static bool WebEssentials2015 => overrides?.WebEssentials2015 ?? DtsPackage.Options.WebEssentials2015;
13597

13698
public static void ReadOptionOverrides(ProjectItem sourceItem, bool display = true)
13799
{
@@ -141,7 +103,7 @@ public static void ReadOptionOverrides(ProjectItem sourceItem, bool display = tr
141103

142104
foreach (ProjectItem item in proj.ProjectItems)
143105
{
144-
if (item.Name.ToLower() == OVERRIDE_FILE_NAME.ToLower())
106+
if (string.Equals(item.Name, OVERRIDE_FILE_NAME, StringComparison.InvariantCultureIgnoreCase))
145107
{
146108
jsonName = item.FileNames[0];
147109
break;
@@ -205,6 +167,9 @@ internal class OptionsOverride
205167
// [JsonRequired]
206168
public string DefaultModuleName { get; set; } = OptionsDialogPage._defModuleName;
207169

170+
// [JsonRequired]
171+
public bool UseNamespace { get; set; } = OptionsDialogPage._defUseNamespace;
172+
208173
// [JsonRequired]
209174
public bool ClassInsteadOfInterface { get; set; } = OptionsDialogPage._defClassInsteadOfInterface;
210175

tests/TypeScriptDefinitionGenerator.Tests/IntellisenseParserTest.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public void _ShouldWorkProperly()
6060

6161
ClassInsteadOfInterface = false,
6262
DefaultModuleName = "Server.Dtos",
63+
UseNamespace = true,
6364
DeclareModule = true,
6465
IgnoreIntellisense = true,
6566
});
@@ -78,9 +79,9 @@ public void _ShouldWorkProperly()
7879
Assert.AreEqual(null, list[0].Properties[1].Summary);
7980
Assert.AreEqual("TypeScriptDefinitionGenerator.Tests.IntEnum", list[0].Properties[1].Type.CodeName);
8081
Assert.AreNotEqual("any", list[0].Properties[1].Type.TypeScriptName);
81-
Assert.AreEqual("Server.Dtos.IntEnum", list[0].Properties[1].Type.TypeScriptName);
82+
Assert.AreEqual("TypeScriptDefinitionGenerator.Tests.IntEnum", list[0].Properties[1].Type.TypeScriptName);
8283
Assert.AreNotEqual(null, list[0].Properties[1].Type.ClientSideReferenceName);
83-
Assert.AreEqual("Server.Dtos.IntEnum", list[0].Properties[1].Type.ClientSideReferenceName);
84+
Assert.AreEqual("TypeScriptDefinitionGenerator.Tests.IntEnum", list[0].Properties[1].Type.ClientSideReferenceName);
8485
Assert.AreEqual(false, list[0].Properties[1].Type.IsArray);
8586
Assert.AreEqual(false, list[0].Properties[1].Type.IsDictionary);
8687
Assert.AreEqual(true, list[0].Properties[1].Type.IsKnownType);
@@ -93,9 +94,9 @@ public void _ShouldWorkProperly()
9394
Assert.AreEqual(null, list[0].Properties[3].Summary);
9495
Assert.AreEqual("ClassLibrary1.SomeEnum", list[0].Properties[3].Type.CodeName);
9596
Assert.AreNotEqual("any", list[0].Properties[3].Type.TypeScriptName);
96-
Assert.AreEqual("Server.Dtos.SomeEnum", list[0].Properties[3].Type.TypeScriptName);
97+
Assert.AreEqual("ClassLibrary1.SomeEnum", list[0].Properties[3].Type.TypeScriptName);
9798
Assert.AreNotEqual(null, list[0].Properties[3].Type.ClientSideReferenceName);
98-
Assert.AreEqual("Server.Dtos.SomeEnum", list[0].Properties[3].Type.ClientSideReferenceName);
99+
Assert.AreEqual("ClassLibrary1.SomeEnum", list[0].Properties[3].Type.ClientSideReferenceName);
99100
Assert.AreEqual(false, list[0].Properties[3].Type.IsArray);
100101
Assert.AreEqual(false, list[0].Properties[3].Type.IsDictionary);
101102
Assert.AreEqual(true, list[0].Properties[3].Type.IsKnownType);
@@ -108,9 +109,9 @@ public void _ShouldWorkProperly()
108109
Assert.AreEqual(null, list[0].Properties[4].Summary);
109110
Assert.AreEqual("ClassLibrary1.SomeSomeClass", list[0].Properties[4].Type.CodeName);
110111
Assert.AreNotEqual("any", list[0].Properties[4].Type.TypeScriptName);
111-
Assert.AreEqual("Server.Dtos.SomeSomeClass", list[0].Properties[4].Type.TypeScriptName);
112+
Assert.AreEqual("ClassLibrary1.SomeSomeClass", list[0].Properties[4].Type.TypeScriptName);
112113
Assert.AreNotEqual(null, list[0].Properties[4].Type.ClientSideReferenceName);
113-
Assert.AreEqual("Server.Dtos.SomeSomeClass", list[0].Properties[4].Type.ClientSideReferenceName);
114+
Assert.AreEqual("ClassLibrary1.SomeSomeClass", list[0].Properties[4].Type.ClientSideReferenceName);
114115
Assert.AreEqual(false, list[0].Properties[4].Type.IsArray);
115116
Assert.AreEqual(false, list[0].Properties[4].Type.IsDictionary);
116117
Assert.AreEqual(true, list[0].Properties[4].Type.IsKnownType);

0 commit comments

Comments
 (0)