Skip to content

Commit

Permalink
+Logic to reload project due to possible lag in early VS environment
Browse files Browse the repository at this point in the history
  • Loading branch information
3F committed May 22, 2024
1 parent 5acf51a commit 838d539
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 18 deletions.
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

0 comments on commit 838d539

Please sign in to comment.