Skip to content

Commit ddb444a

Browse files
author
Denis Peshkov
committed
#18 add support for IDictionary
1 parent b664ba6 commit ddb444a

3 files changed

Lines changed: 41 additions & 7 deletions

File tree

src/TypeScriptDefinitionGenerator/Generator/IntellisenseParser.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,11 @@ private static bool IsPublic(CodeFunction cf)
201201
return retVal;
202202
}
203203

204+
private static string GetInterfaceName(CodeInterface cc)
205+
{
206+
return cc.Name;
207+
}
208+
204209
private static string GetClassName(CodeClass cc)
205210
{
206211
return cc.Name;
@@ -211,6 +216,16 @@ private static string GetEnumName(CodeEnum cc)
211216
return cc.Name;
212217
}
213218

219+
private static string GetNamespace(CodeInterface cc)
220+
{
221+
if (!Options.UseNamespace)
222+
return Options.DefaultModuleName;
223+
224+
return cc == null
225+
? Options.DefaultModuleName
226+
: cc.Namespace.FullName;
227+
}
228+
214229
private static string GetNamespace(CodeClass cc)
215230
{
216231
if (!Options.UseNamespace)
@@ -243,13 +258,16 @@ private static IntellisenseType GetType(CodeClass rootElement, CodeTypeRef codeT
243258

244259
if (isCollection)
245260
{
246-
isDictionary = codeTypeRef.AsString.StartsWith("System.Collections.Generic.Dictionary", StringComparison.Ordinal);
261+
isDictionary = codeTypeRef.AsString.StartsWith("System.Collections.Generic.Dictionary", StringComparison.Ordinal)
262+
|| codeTypeRef.AsString.StartsWith("System.Collections.Generic.IDictionary", StringComparison.Ordinal);
247263
}
248264

249265
string typeName = effectiveTypeRef.AsFullName;
250266

251267
try
252268
{
269+
//VSHelpers.WriteOnBuildDebugWindow($"%{(effectiveTypeRef.CodeType as CodeInterface2) != null}%");
270+
var codeInterface = effectiveTypeRef.CodeType as CodeInterface2;
253271
var codeClass = effectiveTypeRef.CodeType as CodeClass2;
254272
var codeEnum = effectiveTypeRef.CodeType as CodeEnum;
255273
var isPrimitive = IsPrimitive(effectiveTypeRef);
@@ -262,8 +280,8 @@ private static IntellisenseType GetType(CodeClass rootElement, CodeTypeRef codeT
262280
CodeName = effectiveTypeRef.AsString
263281
};
264282

265-
//VSHelpers.WriteOnBuildDebugWindow($"#{result.CodeName}#{result.TypeScriptName}#{effectiveTypeRef.AsString}#{effectiveTypeRef.AsFullName}#{effectiveTypeRef.CodeType}");
266-
//VSHelpers.WriteOnBuildDebugWindow($"##{effectiveTypeRef.TypeKind}##{vsCMTypeRef.vsCMTypeRefCodeType}##{effectiveTypeRef.CodeType.InfoLocation}##{vsCMInfoLocation.vsCMInfoLocationProject}");
283+
VSHelpers.WriteOnBuildDebugWindow($"#{result.CodeName}#{result.TypeScriptName}#{effectiveTypeRef.AsString}#{effectiveTypeRef.AsFullName}#{effectiveTypeRef.CodeType}");
284+
VSHelpers.WriteOnBuildDebugWindow($"##{effectiveTypeRef.TypeKind}##{vsCMTypeRef.vsCMTypeRefCodeType}##{effectiveTypeRef.CodeType.InfoLocation}##{vsCMInfoLocation.vsCMInfoLocationProject}");
267285

268286
result.ClientSideReferenceName = null;
269287
if (effectiveTypeRef.TypeKind == vsCMTypeRef.vsCMTypeRefCodeType)
@@ -277,8 +295,10 @@ private static IntellisenseType GetType(CodeClass rootElement, CodeTypeRef codeT
277295
hasIntellisense = HasIntellisense(codeEnum.ProjectItem, references);
278296
}
279297

298+
VSHelpers.WriteOnBuildDebugWindow($"@{codeClass != null}@{codeEnum != null}@{hasIntellisense}@{Options.DeclareModule}");
280299
result.ClientSideReferenceName = (codeClass != null && hasIntellisense ? (Options.DeclareModule ? GetNamespace(codeClass) + "." : "") + Utility.CamelCaseClassName(GetClassName(codeClass)) : null) ??
281-
(codeEnum != null && hasIntellisense ? (Options.DeclareModule ? GetNamespace(codeEnum) + "." : "") + Utility.CamelCaseClassName(GetEnumName(codeEnum)) : null);
300+
(codeEnum != null && hasIntellisense ? (Options.DeclareModule ? GetNamespace(codeEnum) + "." : "") + Utility.CamelCaseClassName(GetEnumName(codeEnum)) : null) ??
301+
(codeInterface != null && hasIntellisense ? (Options.DeclareModule ? GetNamespace(codeInterface) + "." : "") + Utility.CamelCaseClassName(GetInterfaceName(codeInterface)) : null);
282302
}
283303

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

tests/ClassLibrary1/SomeSomeClass.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,7 @@ public class SomeSomeClass: SomeClass
1616
public IEnumerable<int> Inc10 { get; set; }
1717
public int[] Inc11 { get; set; }
1818
public bool Inc12 { get; set; }
19+
public Dictionary<string, int> Inc13 { get; set; }
20+
public IDictionary<string, int> Inc14 { get; set; }
1921
}
2022
}

tests/TypeScriptDefinitionGenerator.Tests/IntellisenseParserTest.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public void _ShouldWorkProperly()
6565
IgnoreIntellisense = true,
6666
});
6767
var list = IntellisenseParser.ProcessFile(item).ToList();
68+
var tsFile = IntellisenseWriter.WriteTypeScript(list);
6869

6970
//Assert
7071
Assert.IsNotNull(list);
@@ -116,10 +117,21 @@ public void _ShouldWorkProperly()
116117
Assert.AreEqual(false, list[0].Properties[4].Type.IsDictionary);
117118
Assert.AreEqual(true, list[0].Properties[4].Type.IsKnownType);
118119
Assert.AreEqual(false, list[0].Properties[4].Type.IsOptional);
119-
Assert.AreEqual(11, list[0].Properties[4].Type.Shape.Count());
120+
Assert.AreEqual(13, list[0].Properties[4].Type.Shape.Count());
121+
// Inc6
120122
Assert.AreEqual("System.Guid", list[0].Properties[4].Type.Shape.First(o => o.Name == "Inc6").Type.CodeName);
121123
Assert.AreNotEqual("any", list[0].Properties[4].Type.Shape.First(o => o.Name == "Inc6").Type.TypeScriptName);
122124
Assert.AreEqual("string", list[0].Properties[4].Type.Shape.First(o => o.Name == "Inc6").Type.TypeScriptName);
125+
// Inc13
126+
Assert.AreEqual("System.Collections.Generic.Dictionary<string, int>", list[0].Properties[4].Type.Shape.First(o => o.Name == "Inc13").Type.CodeName);
127+
Assert.AreEqual("System.Collections.Generic.Dictionary", list[0].Properties[4].Type.Shape.First(o => o.Name == "Inc13").Type.ClientSideReferenceName);
128+
Assert.AreEqual(true, list[0].Properties[4].Type.Shape.First(o => o.Name == "Inc13").Type.IsDictionary);
129+
Assert.AreEqual("{ [index: string]: number }", list[0].Properties[4].Type.Shape.First(o => o.Name == "Inc13").Type.TypeScriptName);
130+
// Inc14
131+
Assert.AreEqual("System.Collections.Generic.IDictionary<string, int>", list[0].Properties[4].Type.Shape.First(o => o.Name == "Inc14").Type.CodeName);
132+
Assert.AreEqual("System.Collections.Generic.IDictionary", list[0].Properties[4].Type.Shape.First(o => o.Name == "Inc14").Type.ClientSideReferenceName);
133+
Assert.AreEqual(true, list[0].Properties[4].Type.Shape.First(o => o.Name == "Inc14").Type.IsDictionary);
134+
Assert.AreEqual("{ [index: string]: number }", list[0].Properties[4].Type.Shape.First(o => o.Name == "Inc14").Type.TypeScriptName);
123135
}
124136

125137
[Test]
@@ -137,7 +149,7 @@ public void _ShouldWorkProperly2()
137149

138150
ProjectItem item = worker.GetProjectItem(dte2.Solution, "SomeClass.cs");
139151

140-
var expectedFile =
152+
var expectedFile =
141153
"// ------------------------------------------------------------------------------\n" +
142154
"// <auto-generated>\n" +
143155
"// This file was generated by TypeScript Definition Generator v2.2.0.0\n" +
@@ -175,7 +187,7 @@ public void _ShouldWorkProperly2()
175187
Assert.AreEqual("ClassLibrary1.SomeClass", list[0].FullName);
176188
Assert.AreEqual("SomeClass", list[0].Name);
177189
Assert.AreEqual(2, list[0].Properties.Count);
178-
190+
179191
Assert.AreEqual("Inc1", list[0].Properties[0].Name);
180192
Assert.AreEqual("Inc1", list[0].Properties[0].NameWithOption);
181193
Assert.AreEqual(null, list[0].Properties[0].InitExpression);

0 commit comments

Comments
 (0)