diff --git a/build/T4TS.Attributes.dll b/build/T4TS.Attributes.dll new file mode 100644 index 0000000..0233266 Binary files /dev/null and b/build/T4TS.Attributes.dll differ diff --git a/build/T4TS.cs b/build/T4TS.cs deleted file mode 100644 index 85cf00e..0000000 --- a/build/T4TS.cs +++ /dev/null @@ -1,53 +0,0 @@ - -namespace T4TS -{ - using System; - using System.CodeDom; - using System.CodeDom.Compiler; - - /// - /// Add this attribute to a class to generate a corresponding TypeScript interface. - /// - [GeneratedCode("T4TS", "1.0")] - [AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)] - public class TypeScriptInterfaceAttribute: Attribute - { - /// - /// Specifies which module the interface should be placed. - /// The default module will be used if not specified. - /// - public string Module { get; set; } - - /// - /// The name of the interface. - /// If not specified, the name of the class will be used. - /// - public string Name { get; set; } - } - - /// - /// Add this attribute to a property to customize the generated interface member - /// - [GeneratedCode("T4TS", "1.0")] - [AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=true)] - public class TypeScriptMemberAttribute: Attribute - { - /// - /// The member name in the interface. - /// If not specified, the property name will be used. - /// - public string Name { get; set; } - - /// - /// Specify if the member should be optional, ie. "name?: type". - /// If not specified, the default value will be used. - /// - public bool Optional { get; set; } - - /// - /// Specify which type the interface member will have. - /// If not specified, a suitable type will be determined. - /// - public string Type { get; set; } - } -} diff --git a/build/T4TS.tt b/build/T4TS.tt index e32a61a..b814dcd 100644 --- a/build/T4TS.tt +++ b/build/T4TS.tt @@ -1,5 +1,5 @@ -<#@ template language="C#" debug="true" hostspecific="true" -#><#@ output extension=".cs" +<#@ template language="C#" debug="false" hostspecific="true" +#><#@ output extension=".d.ts" #><#@ assembly name="System.Core" #><#@ assembly name="Microsoft.VisualStudio.Shell.Interop.8.0" #><#@ assembly name="EnvDTE" @@ -11,8 +11,7 @@ #><#@ import namespace="Microsoft.VisualStudio.Shell.Interop" #><#@ import namespace="Microsoft.VisualStudio.TextTemplating" #><#@ import namespace="EnvDTE" -#><#@ Include File="T4TS.tt.settings.t4" -#><# var manager = Manager.Create(Host, GenerationEnvironment); manager.StartNewFile("T4TS.d.ts"); #> +#> /**************************************************************************** Generated by T4TS.tt - don't make any changes in this file ****************************************************************************/ @@ -31,63 +30,7 @@ } <# } #> <#= module.IsGlobal ? "// -- End global interfaces" : "}" #> -<# } #> -<# manager.EndBlock(); #> - -namespace T4TS -{ - using System; - using System.CodeDom; - using System.CodeDom.Compiler; - - /// - /// Add this attribute to a class to generate a corresponding TypeScript interface. - /// - [GeneratedCode("T4TS", "1.0")] - [AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)] - public class TypeScriptInterfaceAttribute: Attribute - { - /// - /// Specifies which module the interface should be placed. - /// The default module will be used if not specified. - /// - public string Module { get; set; } - - /// - /// The name of the interface. - /// If not specified, the name of the class will be used. - /// - public string Name { get; set; } - } - - /// - /// Add this attribute to a property to customize the generated interface member - /// - [GeneratedCode("T4TS", "1.0")] - [AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=true)] - public class TypeScriptMemberAttribute: Attribute - { - /// - /// The member name in the interface. - /// If not specified, the property name will be used. - /// - public string Name { get; set; } - - /// - /// Specify if the member should be optional, ie. "name?: type". - /// If not specified, the default value will be used. - /// - public bool Optional { get; set; } - - /// - /// Specify which type the interface member will have. - /// If not specified, a suitable type will be determined. - /// - public string Type { get; set; } - } -} -<# -manager.Process(true); +<# } #><#@ Include File="T4TS.tt.settings.t4" #><#+ List GetDataToRender() { @@ -681,171 +624,4 @@ class CodeGenerator return values; } } - -// ------------------------------------------------------------------------------------------ - -// https://raw.github.com/damieng/DamienGKit -// http://damieng.com/blog/2009/11/06/multiple-outputs-from-t4-made-easy-revisited - -// Manager class records the various blocks so it can split them up -class Manager { - private class Block { - public String Name; - public int Start, Length; - } - - private Block currentBlock; - private List files = new List(); - private Block footer = new Block(); - private Block header = new Block(); - private ITextTemplatingEngineHost host; - private StringBuilder template; - protected List generatedFileNames = new List(); - - public static Manager Create(ITextTemplatingEngineHost host, StringBuilder template) { - return (host is IServiceProvider) ? new VSManager(host, template) : new Manager(host, template); - } - - public void StartNewFile(String name) { - if (name == null) - throw new ArgumentNullException("name"); - CurrentBlock = new Block { Name = name }; - } - - public void StartFooter() { - CurrentBlock = footer; - } - - public void StartHeader() { - CurrentBlock = header; - } - - public void EndBlock() { - if (CurrentBlock == null) - return; - CurrentBlock.Length = template.Length - CurrentBlock.Start; - if (CurrentBlock != header && CurrentBlock != footer) - files.Add(CurrentBlock); - currentBlock = null; - } - - public virtual void Process(bool split, bool sync = true) { - if (split) { - EndBlock(); - String headerText = template.ToString(header.Start, header.Length); - String footerText = template.ToString(footer.Start, footer.Length); - String outputPath = Path.GetDirectoryName(host.TemplateFile); - files.Reverse(); - foreach(Block block in files) { - String fileName = Path.Combine(outputPath, block.Name); - String content = headerText + template.ToString(block.Start, block.Length) + footerText; - generatedFileNames.Add(fileName); - CreateFile(fileName, content); - template.Remove(block.Start, block.Length); - } - } - } - - protected virtual void CreateFile(String fileName, String content) { - if (IsFileContentDifferent(fileName, content)) - File.WriteAllText(fileName, content); - } - - public virtual String GetCustomToolNamespace(String fileName) { - return null; - } - - public virtual String DefaultProjectNamespace { - get { return null; } - } - - protected bool IsFileContentDifferent(String fileName, String newContent) { - return !(File.Exists(fileName) && File.ReadAllText(fileName) == newContent); - } - - private Manager(ITextTemplatingEngineHost host, StringBuilder template) { - this.host = host; - this.template = template; - } - - private Block CurrentBlock { - get { return currentBlock; } - set { - if (CurrentBlock != null) - EndBlock(); - if (value != null) - value.Start = template.Length; - currentBlock = value; - } - } - - private class VSManager: Manager { - private EnvDTE.ProjectItem templateProjectItem; - private EnvDTE.DTE dte; - private Action checkOutAction; - private Action> projectSyncAction; - - public override String DefaultProjectNamespace { - get { - return templateProjectItem.ContainingProject.Properties.Item("DefaultNamespace").Value.ToString(); - } - } - - public override String GetCustomToolNamespace(string fileName) { - return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString(); - } - - public override void Process(bool split, bool sync) { - if (templateProjectItem.ProjectItems == null) - return; - base.Process(split, sync); - if (sync) - projectSyncAction.EndInvoke(projectSyncAction.BeginInvoke(generatedFileNames, null, null)); - } - - protected override void CreateFile(String fileName, String content) { - if (IsFileContentDifferent(fileName, content)) { - CheckoutFileIfRequired(fileName); - File.WriteAllText(fileName, content); - } - } - - internal VSManager(ITextTemplatingEngineHost host, StringBuilder template) - : base(host, template) { - var hostServiceProvider = (IServiceProvider) host; - if (hostServiceProvider == null) - throw new ArgumentNullException("Could not obtain IServiceProvider"); - dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE)); - if (dte == null) - throw new ArgumentNullException("Could not obtain DTE from host"); - templateProjectItem = dte.Solution.FindProjectItem(host.TemplateFile); - checkOutAction = (String fileName) => dte.SourceControl.CheckOutItem(fileName); - projectSyncAction = (IEnumerable keepFileNames) => ProjectSync(templateProjectItem, keepFileNames); - } - - private static void ProjectSync(EnvDTE.ProjectItem templateProjectItem, IEnumerable keepFileNames) { - var keepFileNameSet = new HashSet(keepFileNames); - var projectFiles = new Dictionary(); - var originalFilePrefix = Path.GetFileNameWithoutExtension(templateProjectItem.get_FileNames(0)) + "."; - foreach(EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems) - projectFiles.Add(projectItem.get_FileNames(0), projectItem); - - // Remove unused items from the project - foreach(var pair in projectFiles) - if (!keepFileNames.Contains(pair.Key) && !(Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalFilePrefix)) - pair.Value.Delete(); - - // Add missing files to the project - foreach(String fileName in keepFileNameSet) - if (!projectFiles.ContainsKey(fileName)) - templateProjectItem.ProjectItems.AddFromFile(fileName); - } - - private void CheckoutFileIfRequired(String fileName) { - var sc = dte.SourceControl; - if (sc != null && sc.IsItemUnderSCC(fileName) && !sc.IsItemCheckedOut(fileName)) - checkOutAction.EndInvoke(checkOutAction.BeginInvoke(fileName, null, null)); - } - } -} #> \ No newline at end of file