Skip to content

Commit

Permalink
Exp/serializable projectevaluation (#6262)
Browse files Browse the repository at this point in the history
Serializable project evaluation related changes
  • Loading branch information
jackcartman committed Mar 23, 2021
1 parent 8d34753 commit a4e26e4
Show file tree
Hide file tree
Showing 7 changed files with 170 additions and 46 deletions.
2 changes: 2 additions & 0 deletions ref/Microsoft.Build/net/Microsoft.Build.cs
Expand Up @@ -1126,6 +1126,7 @@ public partial class ProjectInstance
public ProjectInstance(Microsoft.Build.Construction.ProjectRootElement xml) { }
public ProjectInstance(Microsoft.Build.Construction.ProjectRootElement xml, System.Collections.Generic.IDictionary<string, string> globalProperties, string toolsVersion, Microsoft.Build.Evaluation.ProjectCollection projectCollection) { }
public ProjectInstance(Microsoft.Build.Construction.ProjectRootElement xml, System.Collections.Generic.IDictionary<string, string> globalProperties, string toolsVersion, string subToolsetVersion, Microsoft.Build.Evaluation.ProjectCollection projectCollection) { }
public ProjectInstance(Microsoft.Build.Evaluation.Project project, Microsoft.Build.Execution.ProjectInstanceSettings settings) { }
public ProjectInstance(string projectFile) { }
public ProjectInstance(string projectFile, System.Collections.Generic.IDictionary<string, string> globalProperties, string toolsVersion) { }
public ProjectInstance(string projectFile, System.Collections.Generic.IDictionary<string, string> globalProperties, string toolsVersion, Microsoft.Build.Evaluation.ProjectCollection projectCollection) { }
Expand Down Expand Up @@ -1982,6 +1983,7 @@ public abstract partial class ProjectLink
public abstract bool Build(string[] targets, System.Collections.Generic.IEnumerable<Microsoft.Build.Framework.ILogger> loggers, System.Collections.Generic.IEnumerable<Microsoft.Build.Logging.ForwardingLoggerRecord> remoteLoggers, Microsoft.Build.Evaluation.Context.EvaluationContext evaluationContext);
public abstract Microsoft.Build.Execution.ProjectInstance CreateProjectInstance(Microsoft.Build.Execution.ProjectInstanceSettings settings, Microsoft.Build.Evaluation.Context.EvaluationContext evaluationContext);
public abstract string ExpandString(string unexpandedValue);
public abstract System.Collections.Generic.List<Microsoft.Build.Evaluation.GlobResult> GetAllGlobs();
public abstract System.Collections.Generic.List<Microsoft.Build.Evaluation.GlobResult> GetAllGlobs(Microsoft.Build.Evaluation.Context.EvaluationContext evaluationContext);
public abstract System.Collections.Generic.List<Microsoft.Build.Evaluation.GlobResult> GetAllGlobs(string itemType, Microsoft.Build.Evaluation.Context.EvaluationContext evaluationContext);
public abstract System.Collections.Generic.List<Microsoft.Build.Evaluation.ProvenanceResult> GetItemProvenance(Microsoft.Build.Evaluation.ProjectItem item, Microsoft.Build.Evaluation.Context.EvaluationContext evaluationContext);
Expand Down
2 changes: 2 additions & 0 deletions ref/Microsoft.Build/netstandard/Microsoft.Build.cs
Expand Up @@ -1120,6 +1120,7 @@ public partial class ProjectInstance
public ProjectInstance(Microsoft.Build.Construction.ProjectRootElement xml) { }
public ProjectInstance(Microsoft.Build.Construction.ProjectRootElement xml, System.Collections.Generic.IDictionary<string, string> globalProperties, string toolsVersion, Microsoft.Build.Evaluation.ProjectCollection projectCollection) { }
public ProjectInstance(Microsoft.Build.Construction.ProjectRootElement xml, System.Collections.Generic.IDictionary<string, string> globalProperties, string toolsVersion, string subToolsetVersion, Microsoft.Build.Evaluation.ProjectCollection projectCollection) { }
public ProjectInstance(Microsoft.Build.Evaluation.Project project, Microsoft.Build.Execution.ProjectInstanceSettings settings) { }
public ProjectInstance(string projectFile) { }
public ProjectInstance(string projectFile, System.Collections.Generic.IDictionary<string, string> globalProperties, string toolsVersion) { }
public ProjectInstance(string projectFile, System.Collections.Generic.IDictionary<string, string> globalProperties, string toolsVersion, Microsoft.Build.Evaluation.ProjectCollection projectCollection) { }
Expand Down Expand Up @@ -1976,6 +1977,7 @@ public abstract partial class ProjectLink
public abstract bool Build(string[] targets, System.Collections.Generic.IEnumerable<Microsoft.Build.Framework.ILogger> loggers, System.Collections.Generic.IEnumerable<Microsoft.Build.Logging.ForwardingLoggerRecord> remoteLoggers, Microsoft.Build.Evaluation.Context.EvaluationContext evaluationContext);
public abstract Microsoft.Build.Execution.ProjectInstance CreateProjectInstance(Microsoft.Build.Execution.ProjectInstanceSettings settings, Microsoft.Build.Evaluation.Context.EvaluationContext evaluationContext);
public abstract string ExpandString(string unexpandedValue);
public abstract System.Collections.Generic.List<Microsoft.Build.Evaluation.GlobResult> GetAllGlobs();
public abstract System.Collections.Generic.List<Microsoft.Build.Evaluation.GlobResult> GetAllGlobs(Microsoft.Build.Evaluation.Context.EvaluationContext evaluationContext);
public abstract System.Collections.Generic.List<Microsoft.Build.Evaluation.GlobResult> GetAllGlobs(string itemType, Microsoft.Build.Evaluation.Context.EvaluationContext evaluationContext);
public abstract System.Collections.Generic.List<Microsoft.Build.Evaluation.ProvenanceResult> GetItemProvenance(Microsoft.Build.Evaluation.ProjectItem item, Microsoft.Build.Evaluation.Context.EvaluationContext evaluationContext);
Expand Down
42 changes: 42 additions & 0 deletions src/Build.OM.UnitTests/Instance/ProjectInstance_Tests.cs
Expand Up @@ -449,6 +449,48 @@ public void CreateProjectInstanceWithItemsContainingProjects()
Assert.Equal(projAInstanceItem.MetadataCount, projAInstanceItem.MetadataNames.Count);
}

/// <summary>
/// Constructs a new ProjectInstances from Project.
/// </summary>
[Fact]
public void CreateProjectInstanceFromProject()
{
const string CapturedMetadataName = "DefiningProjectFullPath";
var pc = new ProjectCollection();
var projA = ProjectRootElement.Create(pc);
var projB = ProjectRootElement.Create(pc);
projA.FullPath = Path.Combine(Path.GetTempPath(), "a.proj");
projB.FullPath = Path.Combine(Path.GetTempPath(), "b.proj");
projB.AddImport("a.proj");
projA.AddItem("Compile", "aItem.cs");
projB.AddItem("Compile", "bItem.cs");

var loadSettings = ProjectLoadSettings.RecordDuplicateButNotCircularImports
| ProjectLoadSettings.RejectCircularImports
| ProjectLoadSettings.IgnoreEmptyImports
| ProjectLoadSettings.IgnoreMissingImports
| ProjectLoadSettings.IgnoreInvalidImports;

var projBEval = new Project(projB, null, null, pc, loadSettings);
var projBInstance = new ProjectInstance(projBEval, ProjectInstanceSettings.ImmutableWithFastItemLookup);
var projBInstanceItem = projBInstance.GetItemsByItemTypeAndEvaluatedInclude("Compile", "bItem.cs").Single();
var projAInstanceItem = projBInstance.GetItemsByItemTypeAndEvaluatedInclude("Compile", "aItem.cs").Single();
Assert.Equal(projB.FullPath, projBInstanceItem.GetMetadataValue(CapturedMetadataName));
Assert.Equal(projA.FullPath, projAInstanceItem.GetMetadataValue(CapturedMetadataName));

// Although GetMetadataValue returns non-null, GetMetadata returns null...
Assert.Null(projAInstanceItem.GetMetadata(CapturedMetadataName));

// .. Just like built-in metadata does: (this segment just demonstrates similar functionality -- it's not meant to test built-in metadata)
Assert.NotNull(projAInstanceItem.GetMetadataValue("Identity"));
Assert.Null(projAInstanceItem.GetMetadata("Identity"));

Assert.True(projAInstanceItem.HasMetadata(CapturedMetadataName));
Assert.False(projAInstanceItem.Metadata.Any());
Assert.Contains(CapturedMetadataName, projAInstanceItem.MetadataNames);
Assert.Equal(projAInstanceItem.MetadataCount, projAInstanceItem.MetadataNames.Count);
}

/// <summary>
/// Verifies that the built-in metadata for specialized ProjectInstances is present when items are based on wildcards in the construction model.
/// </summary>
Expand Down
Expand Up @@ -187,7 +187,12 @@ public override bool Build(string[] targets, IEnumerable<ILogger> loggers, IEnum

public override string ExpandString(string unexpandedValue) => this.Proxy.ExpandString(unexpandedValue);

// TODO: Glob is not needed for the CSproj, but we might want to test it at least
// TODO: Glob is not needed for the CSproj, but we might want to test it at least
public override List<GlobResult> GetAllGlobs()
{
throw new NotImplementedException();
}

public override List<GlobResult> GetAllGlobs(EvaluationContext evaluationContext)
{
throw new NotImplementedException();
Expand Down
8 changes: 8 additions & 0 deletions src/Build/Definition/Project.cs
Expand Up @@ -2421,6 +2421,14 @@ public override bool IsBuildEnabled
/// </summary>
internal ILoggingService LoggingService => ProjectCollection.LoggingService;

/// <summary>
/// See <see cref="ProjectLink.GetAllGlobs()"/>.
/// </summary>
public override List<GlobResult> GetAllGlobs()
{
return GetAllGlobs(evaluationContext: null);
}

/// <summary>
/// See <see cref="ProjectLink.GetAllGlobs(EvaluationContext)"/>.
/// </summary>
Expand Down

0 comments on commit a4e26e4

Please sign in to comment.