EnvDTE.Host/Callback/Util/SolutionExtensions.cs (102 lines of code) (raw):
using System;
using System.IO;
using System.Linq;
using JetBrains.Annotations;
using JetBrains.Application.Components;
using JetBrains.ProjectModel;
using JetBrains.ProjectModel.impl;
using JetBrains.ProjectModel.Impl;
using JetBrains.ProjectModel.ProjectsHost;
using JetBrains.ProjectModel.ProjectsHost.Impl;
using JetBrains.ProjectModel.ProjectsHost.SolutionHost;
using JetBrains.ProjectModel.ProjectsHost.SolutionHost.Impl;
using JetBrains.ProjectModel.SolutionStructure.SolutionConfigurations;
using JetBrains.ProjectModel.SolutionStructure.SolutionDefinitions;
using JetBrains.Rd.Base;
using JetBrains.RdBackend.Common.Features.ProjectModel;
using JetBrains.Util.Logging;
namespace JetBrains.EnvDTE.Host.Callback.Util;
public static class SolutionExtensions
{
const string InvalidSolutionConfigurationMessage = "Invalid solution configuration";
private const string SolutionDescriptionPropertyName = "Description";
// TODO: Get/Set Description doesn't work for slnx solutions
[CanBeNull]
public static string GetSolutionDescription([NotNull] this ISolutionMark solutionMark)
{
TryGetOrCreateSolutionDescriptionSection(solutionMark, out _, out var property);
return property?.PropertyValue;
}
public static void SetSolutionDescription([NotNull] this ISolution solution, [CanBeNull] string value)
{
var solutionMark = solution.GetSolutionMark();
if (solutionMark is null) return;
if (!TryGetOrCreateSolutionDescriptionSection(solutionMark, out var section, out var property)) return;
if (property is null)
{
if (value is not null) section.AddProperty(SolutionDescriptionPropertyName, value);
}
else
{
if (value is null) section.RemoveProperty(property);
else section.UpdateProperty(property, SolutionDescriptionPropertyName, value);
}
var host = solution.ProjectsHostContainer().GetComponent<SolutionHost>();
host.Persist();
}
public static void RenameSolution([NotNull] this ISolution solution, [CanBeNull] string newName)
{
if (string.IsNullOrWhiteSpace(newName) || newName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0)
throw new ArgumentException("Solution name contains invalid characters.");
newName += solution.SolutionFilePath.ExtensionWithDot;
try
{
var newPath = solution.SolutionFilePath.Directory.Combine(newName);
solution.SolutionFilePath.Move(newPath);
}
catch (Exception e)
{
Logger.LogException($"Failed to rename solution file to {newName}", e);
throw new IOException("Failed to rename the solution file.");
}
solution.InvokeUnderTransaction(_ =>
{
if (solution.GetSolutionMark() is SolutionMark solutionMark) solutionMark.RenameSolution(newName);
((SolutionElement)solution).RenameSolutionFile(new SolutionLocation(
solution.SolutionDirectory, solution.SolutionDirectory.Combine(newName)
));
});
}
public static void SetActiveConfigurationAndPlatform([NotNull] this ISolution solution,
[NotNull] SolutionConfigurationAndPlatform configuration)
{
var solutionMark = solution.GetSolutionMark();
if (solutionMark is null) return;
if (!solutionMark.ConfigurationAndPlatformStore.ConfigurationsAndPlatforms.Contains(configuration))
throw new ArgumentException(InvalidSolutionConfigurationMessage);
var activeConfigurationManager = solution.GetComponent<IActiveConfigurationManager>();
activeConfigurationManager.ActiveConfigurationAndPlatform.SetValue(configuration);
}
public static void SetActiveConfigurationAndPlatform([NotNull] this ISolution solution, [CanBeNull] string value)
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentException(InvalidSolutionConfigurationMessage);
var parts = value.Split('|');
if (parts.Length != 2 || string.IsNullOrWhiteSpace(parts[0]) || string.IsNullOrWhiteSpace(parts[1]))
throw new ArgumentException(InvalidSolutionConfigurationMessage);
var config = new SolutionConfigurationAndPlatform(parts[0], parts[1]);
solution.SetActiveConfigurationAndPlatform(config);
}
private static bool TryGetOrCreateSolutionDescriptionSection(ISolutionMark solutionMark, out SectionDefinition section,
out PropertyDefinition property)
{
if (solutionMark is not SolutionMark { Definition: SolutionDefinition definition })
{
section = null;
property = null;
return false;
}
section = definition.GetOrCreateGlobalSection("SolutionConfigurationPlatforms", "preSolution");
property = section.GetProperties(SolutionDescriptionPropertyName).SingleOrDefault();
return true;
}
}