Esempio n. 1
0
        private static List <string> GetReferences(IEnumerable <IntellisenseObject> objects, ProjectItem sourceItem)
        {
            if (Options.KeepReferencesUnchanged)
            {
                ProjectItem generatedProjectItem = sourceItem.ProjectItems
                                                   .Cast <ProjectItem>()
                                                   .Where(item => GenerationService.GenerateFileName(sourceItem.Name) == item.Name)
                                                   .FirstOrDefault();

                if (generatedProjectItem != null)
                {
                    string documentText = VSHelpers.GetDocumentText(generatedProjectItem);

                    if (string.IsNullOrWhiteSpace(documentText) == false)
                    {
                        string pattern = "/// <reference path=\"(.*)\" />\r\n";
                        return(new Regex(pattern).Matches(documentText)
                               .Cast <Match>()
                               .Select(m => m.Groups[1].Value)
                               .OrderBy(r => r)
                               .ToList());
                    }
                }
            }

            return(objects
                   .SelectMany(o => o.References)
                   .Where(r => Path.GetFileName(r) != GenerationService.GenerateFileName(sourceItem.Name))
                   .Distinct()
                   .OrderBy(r => r)
                   .ToList());
        }
        public static void CreateDtsFile(ProjectItem sourceItem)
        {
            string sourceFile = sourceItem.FileNames[1];
            string dtsFile    = GenerationService.GenerateFileName(sourceFile);
            string dts        = ConvertToTypeScript(sourceItem);

            VSHelpers.CheckFileOutOfSourceControl(dtsFile);
            File.WriteAllText(dtsFile, dts);

            if (sourceItem.ContainingProject.IsKind(ProjectTypes.DOTNET_Core, ProjectTypes.ASPNET_5))
            {
                Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
                {
                    var dtsItem = VSHelpers.GetProjectItem(dtsFile);

                    if (dtsItem != null)
                    {
                        dtsItem.Properties.Item("DependentUpon").Value = sourceItem.Name;
                    }

                    Telemetry.TrackOperation("FileGenerated");
                }), DispatcherPriority.ApplicationIdle, null);
            }
            else if (sourceItem.ContainingProject.IsKind(ProjectTypes.WEBSITE_PROJECT))
            {
                sourceItem.ContainingProject.ProjectItems.AddFromFile(dtsFile);
            }
        }
        protected override byte[] GenerateCode(string inputFileName, string inputFileContent)
        {
            ProjectItem item = Dte.Solution.FindProjectItem(inputFileName);

            this.originalExt = Path.GetExtension(inputFileName);
            if (item != null)
            {
                // Sometimes "DtsPackage.Options"==null at this point. Make sure that options get loaded now.
                DtsPackage.EnsurePackageLoad();

                try
                {
                    string dts = GenerationService.ConvertToTypeScript(item);

                    Telemetry.TrackOperation("FileGenerated");

                    return(Encoding.UTF8.GetBytes(dts));
                }
                catch (Exception ex)
                {
                    Telemetry.TrackOperation("FileGenerated", Microsoft.VisualStudio.Telemetry.TelemetryResult.Failure);
                    Telemetry.TrackException("FileGenerated", ex);
                }
            }

            return(new byte[0]);
        }
        public static void CopyDtsFile(DefinitionMapData definitionMapData, ProjectItem projectItem, string dts, bool isEnumDefinition)
        {
            // There might be paths where this file should be copied to
            foreach (string copyPath in definitionMapData.CopyPaths)
            {
                // Ignore empty paths
                if (string.IsNullOrWhiteSpace(copyPath))
                {
                    continue;
                }

                // Get the path from our project item and combine it with the target path and target name
                string filePath = Path.GetFullPath(Path.Combine(
                                                       Path.GetDirectoryName(projectItem.FileNames[1]),
                                                       copyPath,
                                                       GenerationService.GetCopyDtsFileName(definitionMapData, projectItem, isEnumDefinition)));

                // Try to write our definition file to the new path too
                try
                {
                    File.WriteAllText(filePath, dts);
                    VSHelpers.WriteOnOutputWindow($"File written to \"{filePath}\"");
                }
                catch (Exception ex)
                {
                    VSHelpers.WriteOnOutputWindow($"Could not write file to \"{filePath}\"{Environment.NewLine}" +
                                                  $"Reason: {ex.Message}");
                }
            }
        }
Esempio n. 5
0
        internal static DefinitionMapData GetDefinitionMapData(ProjectItem projectItem)
        {
            // Initialize our result
            DefinitionMapData result = null;

            // Try to find our map data for the typescript definition file
            ProjectItem definitionMapProjectItem = projectItem.ProjectItems
                                                   .Cast <ProjectItem>()
                                                   .Where(pi => pi.Name == GenerationService.GenerateFileName(projectItem.Name) + ".map")
                                                   .FirstOrDefault();

            // Continue if found
            if (definitionMapProjectItem != null)
            {
                // Get the text of our mapping file
                string documentText = VSHelpers.GetDocumentText(definitionMapProjectItem);

                // Continue if the document has text
                if (string.IsNullOrWhiteSpace(documentText) == false)
                {
                    // Try to parse the containing json string
                    // When a SerializationException is getting thrown the document text wasn't valid
                    try
                    {
                        result = JsonConvert.DeserializeObject <DefinitionMapData>(documentText);
                    }
                    catch (JsonSerializationException) { }
                }
            }

            return(result);
        }
        protected override byte[] GenerateCode(string inputFileName, string inputFileContent)
        {
            ProjectItem item = (Dte as DTE2).Solution.FindProjectItem(inputFileName);

            originalExt = Path.GetExtension(inputFileName);
            if (item != null)
            {
                try
                {
                    var dts = GenerationService.ConvertToTypeScript(item);

                    Telemetry.TrackOperation("FileGenerated");

                    InsertToIndex(item, Path.GetFileNameWithoutExtension(inputFileName));

                    return(Encoding.UTF8.GetBytes(dts));
                }
                catch (Exception ex)
                {
                    Telemetry.TrackOperation("FileGenerated", Microsoft.VisualStudio.Telemetry.TelemetryResult.Failure);
                    Telemetry.TrackException("FileGenerated", ex);
                }
            }

            return(new byte[0]);
        }
        public static void CreateDtsFile(ProjectItem sourceItem)
        {
            string sourceFile  = sourceItem.FileNames[1];
            string dtsFile     = GenerationService.GenerateFileName(sourceFile);
            string dtsEnumFile = GenerationService.GenerateFileName(sourceFile);

            // Get metadata from our project item
            DefinitionMapData definitionMapData = VSHelpers.GetDefinitionMapData(sourceItem);

            string dts         = ConvertToTypeScriptWithoutEnums(sourceItem, ref definitionMapData, out bool isEmpty);
            string dtsEnumOnly = ConvertToTypeScriptEnumsOnly(sourceItem, ref definitionMapData, out bool isEmptyEnum);

            VSHelpers.CheckFileOutOfSourceControl(dtsFile);
            File.WriteAllText(dtsFile, dts);

            if (isEmptyEnum == false)
            {
                File.WriteAllText(dtsEnumFile, dtsEnumOnly);
            }

            if (sourceItem.ContainingProject.IsKind(ProjectTypes.DOTNET_Core, ProjectTypes.ASPNET_5))
            {
                Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
                {
                    var dtsItem = VSHelpers.GetProjectItem(dtsFile);

                    if (dtsItem != null)
                    {
                        dtsItem.Properties.Item("DependentUpon").Value = sourceItem.Name;
                    }

                    if (isEmptyEnum == false)
                    {
                        var dtsItem2 = VSHelpers.GetProjectItem(dtsEnumFile);

                        if (dtsItem2 != null)
                        {
                            dtsItem2.Properties.Item("DependentUpon").Value = sourceItem.Name;
                        }
                    }

                    Telemetry.TrackOperation("FileGenerated");
                }), DispatcherPriority.ApplicationIdle, null);
            }
            else if (sourceItem.ContainingProject.IsKind(ProjectTypes.WEBSITE_PROJECT))
            {
                sourceItem.ContainingProject.ProjectItems.AddFromFile(dtsFile);

                if (isEmptyEnum == false)
                {
                    sourceItem.ContainingProject.ProjectItems.AddFromFile(dtsEnumFile);
                }
            }

            // Also create the definition map data and add it to our project item
            CreateDtsMapFile(sourceItem, definitionMapData);
        }
        public static string GetCopyDtsFileName(DefinitionMapData definitionMapData, ProjectItem projectItem, bool isEnumDefinition)
        {
            string sourceFile = string.IsNullOrWhiteSpace(definitionMapData.CustomName) ? projectItem.Name : definitionMapData.CustomName;

            if (isEnumDefinition)
            {
                sourceFile += "Enum";
            }

            return(GenerationService.GenerateFileName(sourceFile));
        }
        private static bool HasIntellisense(ProjectItem projectItem, HashSet <string> references)
        {
            for (short i = 0; i < projectItem.FileCount; i++)
            {
                var fileName = GenerationService.GenerateFileName(projectItem.FileNames[i]);

                references.Add(fileName);
                return(true);
            }

            return(false);
        }
        private void FileActionOccurred(object sender, TextDocumentFileActionEventArgs e)
        {
            if (e.FileActionType != FileActionTypes.ContentSavedToDisk)
            {
                return;
            }
            _item = VSHelpers.GetProjectItem(e.FilePath);
            Options.ReadOptionOverrides(_item, false);
            string fileName = GenerationService.GenerateFileName(e.FilePath);

            if (File.Exists(fileName))
            {
                DtsPackage.EnsurePackageLoad();
                CreateDtsFile(_item);
            }
        }
Esempio n. 11
0
        public static void CreateDtsFile(ProjectItem sourceItem)
        {
            string sourceFile = sourceItem.FileNames[1];
            string dtsFile    = GenerationService.GenerateFileName(sourceFile);

            var output = ConvertToTypeScript(sourceItem);

            if (string.IsNullOrWhiteSpace(Options.NodeModulePath))
            {
                WriteTypescriptToFile(output, dtsFile, sourceItem);
            }
            else
            {
                string nodeModuleFile = Path.ChangeExtension(sourceFile, ".ts");
                WriteTypescriptToFile(output, nodeModuleFile, sourceItem);
            }
        }
        protected override byte[] GenerateCode(string inputFileName, string inputFileContent)
        {
            ProjectItem item = Dte.Solution.FindProjectItem(inputFileName);

            OriginalExt = Path.GetExtension(inputFileName);
            if (item != null)
            {
                try
                {
                    Telemetry.TrackOperation("FileGenerated");

                    string output = GenerationService.ConvertToTypeScript(item);

                    if (!string.IsNullOrWhiteSpace(Options.NodeModulePath))
                    {
                        // generate a Node module instead of a d.ts file.
                        string outputFile  = Path.ChangeExtension(inputFileName, ".ts");
                        string projectPath = Path.GetDirectoryName(item.ContainingProject.FileName);
                        outputFile = outputFile.Substring(projectPath.Length + 1); // strip the initial part of the path
                        outputFile = Path.Combine(projectPath, Options.NodeModulePath, outputFile);
                        var di = Directory.CreateDirectory(Path.GetDirectoryName(outputFile));
                        if (di != null && di.Exists)
                        {
                            VSHelpers.CheckFileOutOfSourceControl(outputFile);
                            File.WriteAllText(outputFile, output);

                            output = $"// Node module file generated at {MakeRelativePath(InputFilePath, outputFile)}";
                        }
                    }

                    return(Encoding.UTF8.GetBytes(output));
                }
                catch (Exception ex)
                {
                    VSHelpers.WriteOnOutputWindow(string.Format("{0} - File Generation Failure", inputFileName));
                    VSHelpers.WriteOnOutputWindow(ex.StackTrace);
                    Telemetry.TrackOperation("FileGenerated", Microsoft.VisualStudio.Telemetry.TelemetryResult.Failure);
                    Telemetry.TrackException("FileGenerated", ex);
                }
            }

            return(new byte[0]);
        }
Esempio n. 13
0
        protected override byte[] GenerateCode(string inputFileName, string inputFileContent)
        {
            ProjectItem item = Dte.Solution.FindProjectItem(inputFileName);

            this.originalExt = Path.GetExtension(inputFileName);
            if (item != null)
            {
                try
                {
                    // Get metadata from our project item
                    DefinitionMapData definitionMapData = VSHelpers.GetDefinitionMapData(item);

                    string dts     = GenerationService.ConvertToTypeScriptWithoutEnums(item, ref definitionMapData, out bool isEmpty);
                    string dtsEnum = GenerationService.ConvertToTypeScriptEnumsOnly(item, ref definitionMapData, out bool isEmptyEnum);
                    Telemetry.TrackOperation("FileGenerated");

                    if (isEmpty == false)
                    {
                        // Copy our dts file to the specified paths in the definition map data
                        GenerationService.CopyDtsFile(definitionMapData, item, dts, false);
                    }

                    if (isEmptyEnum == false)
                    {
                        GenerationService.CopyDtsFile(definitionMapData, item, dtsEnum, true);
                        GenerationService.CreateEnumFile(item, dtsEnum);
                    }

                    // And in the last step write the map file which contains some metadata
                    GenerationService.CreateDtsMapFile(item, definitionMapData);

                    return(Encoding.UTF8.GetBytes(dts));
                }
                catch (Exception ex)
                {
                    Telemetry.TrackOperation("FileGenerated", Microsoft.VisualStudio.Telemetry.TelemetryResult.Failure);
                    Telemetry.TrackException("FileGenerated", ex);
                }
            }

            return(new byte[0]);
        }
Esempio n. 14
0
        private void Execute(object sender, EventArgs e)
        {
            if (_item == null)
            {
                return;
            }
            Options.ReadOptionOverrides(_item, false);
            // .NET Core and Website projects
            if (_item.ContainingProject.IsKind(ProjectTypes.DOTNET_Core, ProjectTypes.ASPNET_5, ProjectTypes.WEBSITE_PROJECT))
            {
                string dtsFile = GenerationService.GenerateFileName(_item.FileNames[1]);
                bool   synOn   = File.Exists(dtsFile);

                if (synOn)
                {
                    var dtsItem = VSHelpers.GetProjectItem(dtsFile);
                    dtsItem?.Delete();
                    File.Delete(dtsFile);
                }
                else
                {
                    GenerationService.CreateDtsFile(_item);
                }
            }
            // Legacy .NET projects
            else
            {
                bool synOn = _item.Properties.Item("CustomTool").Value.ToString() == DtsGenerator.Name;

                if (synOn)
                {
                    _item.Properties.Item("CustomTool").Value = "";
                    Telemetry.TrackUserTask("EnableGeneration");
                }
                else
                {
                    _item.Properties.Item("CustomTool").Value = DtsGenerator.Name;
                    Telemetry.TrackUserTask("DisabledGeneration");
                }
            }
        }
Esempio n. 15
0
        private void BeforeQueryStatus(object sender, EventArgs e)
        {
            var button = (OleMenuCommand)sender;

            button.Visible = button.Enabled = false;

            if (_dte.SelectedItems.Count != 1)
            {
                return;
            }

            _item = _dte.SelectedItems?.Item(1)?.ProjectItem;
            if (_item == null)
            {
                return;
            }
            Options.ReadOptionOverrides(_item, false);

            if (_item == null || _item.ContainingProject == null || _item.FileCodeModel == null)
            {
                return;
            }

            var fileName = _item.FileNames[1];
            var ext      = Path.GetExtension(fileName);

            if (Constants.SupportedSourceExtensions.Contains(ext, StringComparer.OrdinalIgnoreCase))
            {
                if (_item.ContainingProject.IsKind(ProjectTypes.DOTNET_Core, ProjectTypes.ASPNET_5, ProjectTypes.WEBSITE_PROJECT))
                {
                    string dtsFile = GenerationService.GenerateFileName(_item.FileNames[1]);
                    button.Checked = File.Exists(dtsFile);
                }
                else
                {
                    button.Checked = _item.Properties.Item("CustomTool").Value.ToString() == DtsGenerator.Name;
                }

                button.Visible = button.Enabled = true;
            }
        }
Esempio n. 16
0
        public static string WriteTypeScriptEnumsOnly(IEnumerable <IntellisenseObject> objects, ProjectItem sourceItem, out bool isEmpty)
        {
            isEmpty = true;

            var sb = new StringBuilder();

            foreach (var ns in objects.GroupBy(o => o.Namespace))
            {
                List <string> references = GetReferences(objects, sourceItem);

                if (references.Count > 0)
                {
                    foreach (string referencePath in references.OrderBy(p => Path.GetFileName(p)))
                    {
                        string path = Path.GetFileName(referencePath);

                        ProjectItem definitionMapProjectItem = sourceItem.DTE.Solution.FindProjectItem(referencePath);

                        if (definitionMapProjectItem != null)
                        {
                            DefinitionMapData definitionMapData = VSHelpers.GetDefinitionMapData(definitionMapProjectItem.Collection.Parent as ProjectItem);

                            if (definitionMapData != null)
                            {
                                if (string.IsNullOrWhiteSpace(definitionMapData.CustomName) == false)
                                {
                                    path = GenerationService.GetCopyDtsFileName(definitionMapData, definitionMapProjectItem, true);
                                }
                            }
                        }

                        sb.AppendFormat("/// <reference path=\"{0}\" />\r\n", path);
                    }

                    sb.AppendLine();
                }

                if (!Options.GlobalScope)
                {
                    sb.AppendFormat("declare module {0} {{\r\n", ns.Key);
                }

                foreach (IntellisenseObject io in ns)
                {
                    if (io.IsEnum == false)
                    {
                        continue;
                    }

                    isEmpty = false;

                    if (!string.IsNullOrEmpty(io.Summary))
                    {
                        sb.AppendLine("\t/** " + _whitespaceTrimmer.Replace(io.Summary, "") + " */");
                    }

                    sb.AppendLine("\tenum " + Utility.CamelCaseClassName(io.Name) + " {");

                    foreach (var p in io.Properties)
                    {
                        WriteTypeScriptComment(p, sb);

                        if (p.InitExpression != null)
                        {
                            sb.AppendLine("\t\t" + Utility.CamelCaseEnumValue(p.Name) + " = " + CleanEnumInitValue(p.InitExpression) + ",");
                        }
                        else
                        {
                            sb.AppendLine("\t\t" + Utility.CamelCaseEnumValue(p.Name) + ",");
                        }
                    }

                    sb.AppendLine("\t}");
                }

                if (!Options.GlobalScope)
                {
                    sb.AppendLine("}");
                }
            }

            return(sb.ToString());
        }
Esempio n. 17
0
        public static string WriteTypeScriptWithoutEnums(IEnumerable <IntellisenseObject> objects, ProjectItem sourceItem, out bool isEmpty)
        {
            isEmpty = true;

            var sb = new StringBuilder();

            foreach (var ns in objects.GroupBy(o => o.Namespace))
            {
                List <string> references = GetReferences(objects, sourceItem);

                if (references.Count > 0)
                {
                    foreach (string referencePath in references.OrderBy(p => Path.GetFileName(p)))
                    {
                        string path = Path.GetFileName(referencePath);

                        ProjectItem definitionMapProjectItem = sourceItem.DTE.Solution.FindProjectItem(referencePath);

                        if (definitionMapProjectItem != null)
                        {
                            DefinitionMapData definitionMapData = VSHelpers.GetDefinitionMapData(definitionMapProjectItem.Collection.Parent as ProjectItem);

                            if (definitionMapData != null)
                            {
                                if (string.IsNullOrWhiteSpace(definitionMapData.CustomName) == false)
                                {
                                    path = GenerationService.GetCopyDtsFileName(definitionMapData, definitionMapProjectItem, false);
                                }
                            }
                        }

                        sb.AppendFormat("/// <reference path=\"{0}\" />\r\n", path);
                    }

                    sb.AppendLine();
                }

                if (!Options.GlobalScope)
                {
                    sb.AppendFormat("declare module {0} {{\r\n", ns.Key);
                }

                foreach (IntellisenseObject io in ns)
                {
                    if (io.IsEnum)
                    {
                        continue;
                    }

                    isEmpty = false;

                    if (!string.IsNullOrEmpty(io.Summary))
                    {
                        sb.AppendLine("\t/** " + _whitespaceTrimmer.Replace(io.Summary, "") + " */");
                    }

                    string type = Options.ClassInsteadOfInterface ? "\tclass " : "\tinterface ";
                    sb.Append(type).Append(Utility.CamelCaseClassName(io.Name)).Append(" ");

                    if (!string.IsNullOrEmpty(io.BaseName))
                    {
                        sb.Append("extends ");

                        if (Options.GlobalScope == false)
                        {
                            sb.Append(ns.Key).Append(".");
                        }

                        if (!string.IsNullOrEmpty(io.BaseNamespace) && io.BaseNamespace != io.Namespace)
                        {
                            sb.Append(io.BaseNamespace).Append(".");
                        }

                        sb.Append(Utility.CamelCaseClassName(io.BaseName)).Append(" ");
                    }

                    WriteTSInterfaceDefinition(sb, "\t", io.Properties);
                    sb.AppendLine();
                }

                if (!Options.GlobalScope)
                {
                    sb.AppendLine("}");
                }
            }

            return(sb.ToString());
        }