Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 42 additions & 13 deletions vsSolutionBuildEvent/EnvAbstract.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using net.r_eg.MvsSln;
using net.r_eg.MvsSln.Core;
using net.r_eg.MvsSln.Exceptions;
using net.r_eg.MvsSln.Extensions;
using net.r_eg.vsSBE.API.Commands;
using BuildType = net.r_eg.vsSBE.Bridge.BuildType;
using EProject = Microsoft.Build.Evaluation.Project;
Expand Down Expand Up @@ -102,32 +103,54 @@ public virtual EProject getProject(string name = null)
if(string.IsNullOrEmpty(name)) name = StartupProjectString;

ProjectItem project = Sln.ProjectItems.FirstOrDefault(p => p.name == name);
if(project.fullPath == null) {
if(project.fullPath == null)
{
throw new NotFoundException($"Project '{name}' was not found. ['{project.name}', '{project.pGuid}']");
}

IConfPlatformPrj cfg = Sln.ProjectItemsConfigs
.FirstOrDefault(p => p.project.name == name && ActiveSlnConf?.Equals(p.solutionConfig) == true)
.projectConfig;

return (cfg == null) ? SlnEnv?.GetOrLoadProject(project)
: SlnEnv?.GetOrLoadProject(project, cfg);
return LoadOrReload
(
project,
Sln.ProjectItemsConfigs
.FirstOrDefault(p => p.project.name == name && ActiveSlnConf?.Equals(p.solutionConfig) == true)
.projectConfig
);
}

/// <summary>
/// Returns formatted configuration from the SolutionConfiguration2
/// </summary>
public string SolutionCfgFormat(EnvDTE80.SolutionConfiguration2 cfg)
{
if(cfg == null) {
return formatCfg(PropertyNames.UNDEFINED);
}
return formatCfg(cfg.Name, cfg.PlatformName);
return (cfg == null) ? FormatConf(PropertyNames.UNDEFINED)
: FormatConf(cfg.Name, cfg.PlatformName);
}

protected string formatCfg(string name, string platform = null)
protected static string FormatConf(string name, string platform = null)
=> ConfigItem.Format(name, platform ?? name);

/// <summary>
/// Load or reload the project if necessary due to possible lag in early VS environment.
/// </summary>
/// <remarks>~ https://github.com/3F/vsSolutionBuildEvent/issues/80</remarks>
protected EProject LoadOrReload(ProjectItem item, IConfPlatformPrj cfg)
{
return ConfigItem.Format(name, platform ?? name);
EProject loaded = LoadProject(item, cfg);

if(loaded == null
|| loaded.GetPropertyValue(PropertyNames.SLN_DIR) == PropertyNames.UNDEFINED)
{
IXProjectEnv env = SlnEnv;

env?.Projects
.Where(p => p.ProjectItem.project.fullPath == item.fullPath)
.ToArray() // since we will change the collection below
.ForEach(p => env.Unload(p));

return LoadProject(item, cfg);
}

return loaded;
}

protected void AssignEnv(IXProjectEnv env)
Expand All @@ -139,6 +162,12 @@ protected void AssignEnv(IXProjectEnv env)
SlnEnv = env;
}

private EProject LoadProject(ProjectItem project, IConfPlatformPrj cfg)
{
return (cfg == null) ? SlnEnv?.GetOrLoadProject(project)
: SlnEnv?.GetOrLoadProject(project, cfg);
}

private ISlnResult UpdateSln()
{
var input = SolutionFile;
Expand Down
10 changes: 5 additions & 5 deletions vsSolutionBuildEvent/IsolatedEnv.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public List<string> ProjectsList
/// <summary>
/// Formatted string with an active configuration for current solution.
/// </summary>
public string SolutionActiveCfgString => formatCfg(slnProperties);
public string SolutionActiveCfgString => FormatConf(slnProperties);

/// <summary>
/// All configurations for current solution
Expand Down Expand Up @@ -301,18 +301,18 @@ protected ConfigItem extractCfg(IDictionary<string, string> properties)
return currentSlnConf;
}

protected string formatCfg(IDictionary<string, string> properties)
protected string FormatConf(IDictionary<string, string> properties)
{
IConfPlatform def = extractCfg(properties);
return formatCfg(def.Configuration, def.Platform);
return FormatConf(def.Configuration, def.Platform);
}

private void __disabled(string name)
private static void __disabled(string name)
{
Log.Debug($"Accessing to '{name}' is disabled in Isolated environment.");
}

private T __disabled<T>(string name, T val = default)
private static T __disabled<T>(string name, T val = default)
{
__disabled(name);
return val;
Expand Down