diff --git a/EditorExtensions/Commands/Code/IntellisenseParser.cs b/EditorExtensions/Commands/Code/IntellisenseParser.cs index 88af517d2..a60cc3135 100644 --- a/EditorExtensions/Commands/Code/IntellisenseParser.cs +++ b/EditorExtensions/Commands/Code/IntellisenseParser.cs @@ -20,8 +20,8 @@ namespace MadsKristensen.EditorExtensions [TextViewRole(PredefinedTextViewRoles.Document)] public class IntellisenseParser : IWpfTextViewCreationListener { - public const string DefaultModuleName = "server"; - public const string ModuleNameAttributeName = "TypeScriptModule"; + private const string DefaultModuleName = "server"; + private const string ModuleNameAttributeName = "TypeScriptModule"; internal static class Ext { @@ -52,7 +52,7 @@ private void document_FileActionOccurred(object sender, TextDocumentFileActionEv Process(e.FilePath); } - public static Task Process(string filePath) + private static Task Process(string filePath) { if (!File.Exists(filePath + Ext.JavaScript) && !File.Exists(filePath + Ext.TypeScript)) return Task.FromResult(false); @@ -86,7 +86,7 @@ public static Task Process(string filePath) }), DispatcherPriority.ApplicationIdle).Task; } - private static void AddScript(string filePath, string extension, List list) + private static void AddScript(string filePath, string extension, IEnumerable list) { string resultPath = filePath + extension; @@ -166,7 +166,7 @@ private static void ProcessEnum(CodeEnum element, List list) foreach (var codeEnum in element.Members.OfType()) { - var prop = new IntellisenseProperty() + var prop = new IntellisenseProperty { Name = codeEnum.Name, }; @@ -201,7 +201,7 @@ private static IEnumerable GetProperties(CodeElements prop return from p in props.OfType() where !p.Attributes.Cast().Any(a => a.Name == "IgnoreDataMember") where p.Getter != null && !p.Getter.IsShared && p.Getter.Access == vsCMAccess.vsCMAccessPublic - select new IntellisenseProperty() + select new IntellisenseProperty { Name = GetName(p), Type = GetType(p.Parent, p.Type, traversedTypes), diff --git a/EditorExtensions/Commands/Code/IntellisenseType.cs b/EditorExtensions/Commands/Code/IntellisenseType.cs index 6d54db5c3..9b444421a 100644 --- a/EditorExtensions/Commands/Code/IntellisenseType.cs +++ b/EditorExtensions/Commands/Code/IntellisenseType.cs @@ -2,37 +2,42 @@ namespace MadsKristensen.EditorExtensions { - public class IntellisenseType { /// /// This is the name of this type as it appears in the source code /// public string CodeName { get; set; } + /// /// Indicates whether this type is array. Is this property is true, then all other properties /// describe not the type itself, but rather the type of the array's elements. /// public bool IsArray { get; set; } + /// /// If this type is itself part of a source code file that has a .d.ts definitions file attached, /// this property will contain the full (namespace-qualified) client-side name of that type. /// Otherwise, this property is null. /// public string ClientSideReferenceName { get; set; } + /// /// This is TypeScript-formed shape of the type (i.e. inline type definition). It is used for the case where /// the type is not primitive, but does not have its own named client-side definition. /// public IEnumerable Shape { get; set; } - public bool IsPrimitive + + public bool IsKnownType { get { return TypeScriptName != "any"; } } + public string JavaScriptName { get { return GetTargetName(true); } } + public string TypeScriptName { get { return GetTargetName(false); } @@ -63,7 +68,7 @@ public string JavaScripLiteral } - string GetTargetName(bool js) + private string GetTargetName(bool js) { var t = CodeName.ToLowerInvariant().TrimEnd('?'); switch (t) @@ -94,7 +99,12 @@ string GetTargetName(bool js) return js ? "Boolean" : "boolean"; } - return js ? "Object" : "any"; + return js ? "Object" : GetComplexTypeScriptName(); + } + + private string GetComplexTypeScriptName() + { + return ClientSideReferenceName ?? "any"; } } } \ No newline at end of file diff --git a/EditorExtensions/Commands/Code/IntellisenseWriter.cs b/EditorExtensions/Commands/Code/IntellisenseWriter.cs index 090d6049f..11b056ae0 100644 --- a/EditorExtensions/Commands/Code/IntellisenseWriter.cs +++ b/EditorExtensions/Commands/Code/IntellisenseWriter.cs @@ -50,7 +50,7 @@ private static string CamelCase(string name) return name[0].ToString(CultureInfo.CurrentCulture).ToLower(CultureInfo.CurrentCulture) + name.Substring(1); } - static readonly Regex whitespaceTrimmer = new Regex(@"^\s+|\s+$|\s*[\r\n]+\s*", RegexOptions.Compiled); + private static readonly Regex whitespaceTrimmer = new Regex(@"^\s+|\s+$|\s*[\r\n]+\s*", RegexOptions.Compiled); private static void WriteJavaScript(IEnumerable objects, StringBuilder sb) { @@ -71,7 +71,8 @@ private static void WriteJavaScript(IEnumerable objects, Str var propertyName = CamelCasePropertyName(p.Name); comment = p.Summary ?? "The " + propertyName + " property as defined in " + io.FullName; comment = whitespaceTrimmer.Replace(comment, " "); - sb.AppendLine("\t/// " + SecurityElement.Escape(comment) + ""); + sb.AppendLine("\t/// " + + SecurityElement.Escape(comment) + ""); sb.AppendLine("\tthis." + propertyName + " = " + p.Type.JavaScripLiteral + ";"); } @@ -88,7 +89,8 @@ private static void WriteTypeScript(IEnumerable objects, Str foreach (IntellisenseObject io in ns) { - if (!string.IsNullOrEmpty(io.Summary)) sb.AppendLine("\t/** " + whitespaceTrimmer.Replace(io.Summary, "") + " */"); + if (!string.IsNullOrEmpty(io.Summary)) + sb.AppendLine("\t/** " + whitespaceTrimmer.Replace(io.Summary, "") + " */"); if (io.IsEnum) { sb.AppendLine("\tenum " + CamelCaseClassName(io.Name) + " {"); @@ -117,7 +119,8 @@ private static void WriteTypeScriptComment(IntellisenseProperty p, StringBuilder sb.AppendLine("\t\t/** " + whitespaceTrimmer.Replace(p.Summary, "") + " */"); } - private static void WriteTSInterfaceDefinition(StringBuilder sb, string prefix, IEnumerable props) + private static void WriteTSInterfaceDefinition(StringBuilder sb, string prefix, + IEnumerable props) { sb.AppendLine("{"); @@ -126,8 +129,7 @@ private static void WriteTSInterfaceDefinition(StringBuilder sb, string prefix, WriteTypeScriptComment(p, sb); sb.AppendFormat("{0}\t{1}: ", prefix, CamelCasePropertyName(p.Name)); - if (p.Type.IsPrimitive) sb.Append(p.Type.TypeScriptName); - else if (!string.IsNullOrEmpty(p.Type.ClientSideReferenceName)) sb.Append(p.Type.ClientSideReferenceName); + if (p.Type.IsKnownType) sb.Append(p.Type.TypeScriptName); else { if (p.Type.Shape == null) sb.Append("any"); @@ -155,4 +157,4 @@ private static void WriteFileToDisk(string fileName, StringBuilder sb) //} } } -} +} \ No newline at end of file diff --git a/Rebracer.xml b/Rebracer.xml index f70ce040d..7f3d63f87 100644 --- a/Rebracer.xml +++ b/Rebracer.xml @@ -9,7 +9,12 @@ - TODO:2HACK:2UNDONE:2UnresolvedMergeConflict:3 + + TODO:2 + HACK:2 + UNDONE:2 + UnresolvedMergeConflict:3 + true true false @@ -149,14 +154,14 @@ false true true - false + true false false true true - false + true false false true @@ -167,8 +172,8 @@ true false true - false - false + true + true false false false @@ -185,19 +190,19 @@ false false false - true + false false false false false true true - false + true true false true - 65 + 55 false true false diff --git a/TestProjects/Lib/Generation/CollectionModel.cs.d.ts b/TestProjects/Lib/Generation/CollectionModel.cs.d.ts new file mode 100644 index 000000000..7e6586078 --- /dev/null +++ b/TestProjects/Lib/Generation/CollectionModel.cs.d.ts @@ -0,0 +1,12 @@ +declare module server { + interface CollectionModel { + AStringArray: string[]; + AStringIEnumerable: string[]; + AStringICollection: string[]; + AStringIList: string[]; + AStringList: string[]; + AStringCollection: string[]; + ASimpleList: server.Simple[]; + ALongList: number[]; + } +} diff --git a/TestProjects/Lib/Generation/CollectionModel.cs.js b/TestProjects/Lib/Generation/CollectionModel.cs.js new file mode 100644 index 000000000..0e418658f --- /dev/null +++ b/TestProjects/Lib/Generation/CollectionModel.cs.js @@ -0,0 +1,21 @@ +var server = server || {}; +/// The CollectionModel class as defined in Lib.Generation.CollectionModel +server.CollectionModel = function() { + /// The AStringArray property as defined in Lib.Generation.CollectionModel + this.AStringArray = []; + /// The AStringIEnumerable property as defined in Lib.Generation.CollectionModel + this.AStringIEnumerable = []; + /// The AStringICollection property as defined in Lib.Generation.CollectionModel + this.AStringICollection = []; + /// The AStringIList property as defined in Lib.Generation.CollectionModel + this.AStringIList = []; + /// The AStringList property as defined in Lib.Generation.CollectionModel + this.AStringList = []; + /// The AStringCollection property as defined in Lib.Generation.CollectionModel + this.AStringCollection = []; + /// The ASimpleList property as defined in Lib.Generation.CollectionModel + this.ASimpleList = []; + /// The ALongList property as defined in Lib.Generation.CollectionModel + this.ALongList = []; +}; + diff --git a/TestProjects/Lib/Generation/Simple.cs b/TestProjects/Lib/Generation/Simple.cs index d34a7e4b1..970ce280e 100644 --- a/TestProjects/Lib/Generation/Simple.cs +++ b/TestProjects/Lib/Generation/Simple.cs @@ -1,9 +1,14 @@ -namespace Lib.Generation +using System; + +namespace Lib.Generation { public class Simple { + public Simple ASimple { get; set; } public string AString { get; set; } public bool ABool { get; set; } public int AnInt { get; set; } + public DateTime ADateTime { get; set; } + } } \ No newline at end of file diff --git a/TestProjects/Lib/Generation/Simple.cs.d.ts b/TestProjects/Lib/Generation/Simple.cs.d.ts new file mode 100644 index 000000000..d4874a245 --- /dev/null +++ b/TestProjects/Lib/Generation/Simple.cs.d.ts @@ -0,0 +1,9 @@ +declare module server { + interface Simple { + ASimple: server.Simple; + AString: string; + ABool: boolean; + AnInt: number; + ADateTime: Date; + } +} diff --git a/TestProjects/Lib/Generation/Simple.cs.js b/TestProjects/Lib/Generation/Simple.cs.js new file mode 100644 index 000000000..957150d66 --- /dev/null +++ b/TestProjects/Lib/Generation/Simple.cs.js @@ -0,0 +1,15 @@ +var server = server || {}; +/// The Simple class as defined in Lib.Generation.Simple +server.Simple = function() { + /// The ASimple property as defined in Lib.Generation.Simple + this.ASimple = { }; + /// The AString property as defined in Lib.Generation.Simple + this.AString = ''; + /// The ABool property as defined in Lib.Generation.Simple + this.ABool = false; + /// The AnInt property as defined in Lib.Generation.Simple + this.AnInt = 0; + /// The ADateTime property as defined in Lib.Generation.Simple + this.ADateTime = new Date(); +}; + diff --git a/TestProjects/Lib/Generation/SimpleNullable.cs b/TestProjects/Lib/Generation/SimpleNullable.cs new file mode 100644 index 000000000..8f87c0e05 --- /dev/null +++ b/TestProjects/Lib/Generation/SimpleNullable.cs @@ -0,0 +1,14 @@ +using System; +using System.Security.Permissions; + +namespace Lib.Generation +{ + public class SimpleNullable + { + public bool? ABool { get; set; } + public int? AnInt { get; set; } + + public DateTime? ADateTime { get; set; } + + } +} \ No newline at end of file diff --git a/TestProjects/Lib/Generation/SimpleNullable.cs.d.ts b/TestProjects/Lib/Generation/SimpleNullable.cs.d.ts new file mode 100644 index 000000000..a5333c3f5 --- /dev/null +++ b/TestProjects/Lib/Generation/SimpleNullable.cs.d.ts @@ -0,0 +1,7 @@ +declare module server { + interface SimpleNullable { + ABool: boolean; + AnInt: number; + ADateTime: Date; + } +} diff --git a/TestProjects/Lib/Generation/SimpleNullable.cs.js b/TestProjects/Lib/Generation/SimpleNullable.cs.js new file mode 100644 index 000000000..098233f72 --- /dev/null +++ b/TestProjects/Lib/Generation/SimpleNullable.cs.js @@ -0,0 +1,11 @@ +var server = server || {}; +/// The SimpleNullable class as defined in Lib.Generation.SimpleNullable +server.SimpleNullable = function() { + /// The ABool property as defined in Lib.Generation.SimpleNullable + this.ABool = false; + /// The AnInt property as defined in Lib.Generation.SimpleNullable + this.AnInt = 0; + /// The ADateTime property as defined in Lib.Generation.SimpleNullable + this.ADateTime = new Date(); +}; + diff --git a/TestProjects/Lib/Lib.csproj b/TestProjects/Lib/Lib.csproj index fc4104088..34d27c7a1 100644 --- a/TestProjects/Lib/Lib.csproj +++ b/TestProjects/Lib/Lib.csproj @@ -40,9 +40,36 @@ + + + + Simple.cs + + + + + CollectionModel.cs + + + Simple.cs + + + SimpleNullable.cs + + + + + SimpleNullable.cs + + + + + CollectionModel.cs + +