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); }
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(); } }