public int Generate(ProjectItem projectItem, string inputFileContents,
                            string defaultNamespace, out byte[] output, IVsGeneratorProgress generateProgress)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            VSUIIntegration.Instance?.ClearErrors();

            output = null;
            try
            {
                var resourceFileInfo = ResourceInfo.ResourceFileInfoBuilder.Create(projectItem);
                if (resourceFileInfo == null)
                {
                    return(VSConstants.E_FAIL);
                }
                var reswCodeGenerator = ReswClassGenerator.CreateGenerator(resourceFileInfo, VSUIIntegration.Instance);
                if (reswCodeGenerator == null)
                {
                    return(VSConstants.E_FAIL);
                }
                VSUIIntegration.Instance?.SetStatusBar($"Generating class for {projectItem.Document.Name}...");

                var baseFilename     = "resources.generated." + GetCodeProvider().FileExtension; //won't be used.
                var generationResult = reswCodeGenerator.GenerateCode(baseFilename, inputFileContents, defaultNamespace, _isAdvanced);
                if (generationResult.Files.Count() != 1)
                {
                    return(VSConstants.E_FAIL);
                }

                // IVsSingleFileGenerator supports only 1 file.
                output = Encoding.UTF8.GetBytes(generationResult.Files.First().Content);

                if (generationResult.MustInstallReswPlusLib)
                {
                    projectItem.ContainingProject.InstallNuGetPackage("ReswPlusLib", true);
                }
            }
            catch (Exception)
            {
                return(VSConstants.E_FAIL);
            }
            finally
            {
                VSUIIntegration.Instance?.CleanStatusBar();
            }
            return(VSConstants.S_OK);
        }
Example #2
0
        private int GenerateResourceFile(bool isAdvanced)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            VSUIIntegration.Instance?.ClearErrors();

            try
            {
                var projectItem = GetCurrentProjectItem();
                if (!projectItem.Name.EndsWith(".resw"))
                {
                    VsShellUtilities.ShowMessageBox(
                        package,
                        "File not compatible with ReswPlus",
                        "ReswPlus",
                        OLEMSGICON.OLEMSGICON_INFO,
                        OLEMSGBUTTON.OLEMSGBUTTON_OK,
                        OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
                    return(VSConstants.E_FAIL);
                }
                VSUIIntegration.Instance?.SetStatusBar($"Generating class for {Path.GetFileName(projectItem.Name)}...");

                var language = projectItem.ContainingProject.GetLanguage();
                if (language == Language.CSHARP || language == Language.VB)
                {
                    // Reset CustomTool to force the file generation.
                    projectItem.Properties.Item("CustomTool").Value = "";
                    projectItem.Properties.Item("CustomTool").Value = isAdvanced ? "ReswPlusAdvancedGenerator" : "ReswPlusGenerator";
                    return(VSConstants.S_OK);
                }
                else if (language == Language.CPPCX || language == Language.CPPWINRT)
                {
                    // CPP projects doesn't support custom tools, we need to create the file ourselves.
                    var filepath      = (string)projectItem.Properties.Item("FullPath").Value;
                    var fileNamespace = (string)projectItem.ContainingProject.Properties.Item("RootNamespace").Value;

                    var relativeDirectoryPath = Path.GetDirectoryName((string)projectItem.Properties.Item("RelativePath").Value);
                    var reswNamespace         = relativeDirectoryPath.StartsWith("..") ? "" : relativeDirectoryPath;
                    if (!string.IsNullOrEmpty(reswNamespace))
                    {
                        fileNamespace += "." + reswNamespace.Replace("\\", ".");
                    }

                    var resourceFileInfo = ResourceFileInfoBuilder.Create(projectItem);
                    if (resourceFileInfo == null)
                    {
                        return(VSConstants.E_FAIL);
                    }
                    var reswCodeGenerator = ReswClassGenerator.CreateGenerator(resourceFileInfo, VSUIIntegration.Instance);
                    if (reswCodeGenerator == null)
                    {
                        return(VSConstants.E_FAIL);
                    }

                    var inputFilepath    = projectItem.Properties.Item("FullPath").Value as string;
                    var baseFilename     = Path.GetFileNameWithoutExtension(filepath) + ".generated";
                    var generationResult = reswCodeGenerator.GenerateCode(baseFilename, File.ReadAllText(inputFilepath), fileNamespace, isAdvanced);
                    foreach (var file in generationResult.Files)
                    {
                        var generatedFilePath = Path.Combine(Path.GetDirectoryName(filepath), file.Filename);
                        using (var streamWriter = File.Create(generatedFilePath))
                        {
                            var contentBytes = System.Text.Encoding.UTF8.GetBytes(file.Content);
                            streamWriter.Write(contentBytes, 0, contentBytes.Length);
                        }
                        try
                        {
                            projectItem.ProjectItems.AddFromFile(generatedFilePath);
                        }
                        catch { }
                    }

                    if (generationResult.MustInstallReswPlusLib)
                    {
                        projectItem.ContainingProject.InstallNuGetPackage("ReswPlusLib", true);
                    }
                    return(VSConstants.S_OK);
                }
                else
                {
                    VsShellUtilities.ShowMessageBox(
                        package,
                        "Project language not compatible with ReswPlus",
                        "ReswPlus",
                        OLEMSGICON.OLEMSGICON_INFO,
                        OLEMSGBUTTON.OLEMSGBUTTON_OK,
                        OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
                    return(VSConstants.E_UNEXPECTED);
                }
            }
            finally
            {
                VSUIIntegration.Instance?.CleanStatusBar();
            }
        }