Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Refactor GenerateRuntimeGraph into separate files
  • Loading branch information
ericstj committed Mar 31, 2021
commit b82c38f822b71e93f42b57afb725ad868d1ed4f3
304 changes: 0 additions & 304 deletions src/libraries/Microsoft.NETCore.Platforms/src/GenerateRuntimeGraph.cs
Original file line number Diff line number Diff line change
Expand Up @@ -291,310 +291,6 @@ private void ValidateImports(RuntimeGraph runtimeGraph, IDictionary<string, stri
}
}

internal class RuntimeGroup
{
private const string rootRID = "any";
private const char VersionDelimiter = '.';
private const char ArchitectureDelimiter = '-';
private const char QualifierDelimiter = '-';

public RuntimeGroup(ITaskItem item)
{
BaseRID = item.ItemSpec;
Parent = item.GetString(nameof(Parent));
Versions = item.GetStrings(nameof(Versions));
TreatVersionsAsCompatible = item.GetBoolean(nameof(TreatVersionsAsCompatible), true);
OmitVersionDelimiter = item.GetBoolean(nameof(OmitVersionDelimiter));
ApplyVersionsToParent = item.GetBoolean(nameof(ApplyVersionsToParent));
Architectures = item.GetStrings(nameof(Architectures));
AdditionalQualifiers = item.GetStrings(nameof(AdditionalQualifiers));
OmitRIDs = new HashSet<string>(item.GetStrings(nameof(OmitRIDs)));
OmitRIDDefinitions = new HashSet<string>(item.GetStrings(nameof(OmitRIDDefinitions)));
OmitRIDReferences = new HashSet<string>(item.GetStrings(nameof(OmitRIDReferences)));
}

public string BaseRID { get; }
public string Parent { get; }
public IEnumerable<string> Versions { get; }
public bool TreatVersionsAsCompatible { get; }
public bool OmitVersionDelimiter { get; }
public bool ApplyVersionsToParent { get; }
public IEnumerable<string> Architectures { get; }
public IEnumerable<string> AdditionalQualifiers { get; }
public ICollection<string> OmitRIDs { get; }
public ICollection<string> OmitRIDDefinitions { get; }
public ICollection<string> OmitRIDReferences { get; }

private class RIDMapping
{
public RIDMapping(RID runtimeIdentifier)
{
RuntimeIdentifier = runtimeIdentifier;
Imports = Enumerable.Empty<RID>();
}

public RIDMapping(RID runtimeIdentifier, IEnumerable<RID> imports)
{
RuntimeIdentifier = runtimeIdentifier;
Imports = imports;
}

public RID RuntimeIdentifier { get; }

public IEnumerable<RID> Imports { get; }
}

private class RID
{
public string BaseRID { get; set; }
public string VersionDelimiter { get; set; }
public string Version { get; set; }
public string ArchitectureDelimiter { get; set; }
public string Architecture { get; set; }
public string QualifierDelimiter { get; set; }
public string Qualifier { get; set; }

public override string ToString()
{
StringBuilder builder = new StringBuilder(BaseRID);

if (HasVersion())
{
builder.Append(VersionDelimiter);
builder.Append(Version);
}

if (HasArchitecture())
{
builder.Append(ArchitectureDelimiter);
builder.Append(Architecture);
}

if (HasQualifier())
{
builder.Append(QualifierDelimiter);
builder.Append(Qualifier);
}

return builder.ToString();
}

public bool HasVersion()
{
return Version != null;
}

public bool HasArchitecture()
{
return Architecture != null;
}

public bool HasQualifier()
{
return Qualifier != null;
}
}

private RID CreateRuntime(string baseRid, string version = null, string architecture = null, string qualifier = null)
{
return new RID()
{
BaseRID = baseRid,
VersionDelimiter = OmitVersionDelimiter ? string.Empty : VersionDelimiter.ToString(),
Version = version,
ArchitectureDelimiter = ArchitectureDelimiter.ToString(),
Architecture = architecture,
QualifierDelimiter = QualifierDelimiter.ToString(),
Qualifier = qualifier
};
}

private IEnumerable<RIDMapping> GetRIDMappings()
{
// base =>
// Parent
yield return Parent == null ?
new RIDMapping(CreateRuntime(BaseRID)) :
new RIDMapping(CreateRuntime(BaseRID), new[] { CreateRuntime(Parent) });

foreach (var architecture in Architectures)
{
// base + arch =>
// base,
// parent + arch
var imports = new List<RID>()
{
CreateRuntime(BaseRID)
};

if (!IsNullOrRoot(Parent))
{
imports.Add(CreateRuntime(Parent, architecture: architecture));
}

yield return new RIDMapping(CreateRuntime(BaseRID, architecture: architecture), imports);
}

string lastVersion = null;
foreach (var version in Versions)
{
// base + version =>
// base + lastVersion,
// parent + version (optionally)
var imports = new List<RID>()
{
CreateRuntime(BaseRID, version: lastVersion)
};

if (ApplyVersionsToParent)
{
imports.Add(CreateRuntime(Parent, version: version));
}

yield return new RIDMapping(CreateRuntime(BaseRID, version: version), imports);

foreach (var architecture in Architectures)
{
// base + version + architecture =>
// base + version,
// base + lastVersion + architecture,
// parent + version + architecture (optionally)
var archImports = new List<RID>()
{
CreateRuntime(BaseRID, version: version),
CreateRuntime(BaseRID, version: lastVersion, architecture: architecture)
};

if (ApplyVersionsToParent)
{
archImports.Add(CreateRuntime(Parent, version: version, architecture: architecture));
}

yield return new RIDMapping(CreateRuntime(BaseRID, version: version, architecture: architecture), archImports);
}

if (TreatVersionsAsCompatible)
{
lastVersion = version;
}
}

foreach (var qualifier in AdditionalQualifiers)
{
// base + qual =>
// base,
// parent + qual
yield return new RIDMapping(CreateRuntime(BaseRID, qualifier: qualifier),
new[]
{
CreateRuntime(BaseRID),
IsNullOrRoot(Parent) ? CreateRuntime(qualifier) : CreateRuntime(Parent, qualifier:qualifier)
});

foreach (var architecture in Architectures)
{
// base + arch + qualifier =>
// base + qualifier,
// base + arch
// parent + arch + qualifier
var imports = new List<RID>()
{
CreateRuntime(BaseRID, qualifier: qualifier),
CreateRuntime(BaseRID, architecture: architecture)
};

if (!IsNullOrRoot(Parent))
{
imports.Add(CreateRuntime(Parent, architecture: architecture, qualifier: qualifier));
}

yield return new RIDMapping(CreateRuntime(BaseRID, architecture: architecture, qualifier: qualifier), imports);
}

lastVersion = null;
foreach (var version in Versions)
{
// base + version + qualifier =>
// base + version,
// base + lastVersion + qualifier
// parent + version + qualifier (optionally)
var imports = new List<RID>()
{
CreateRuntime(BaseRID, version: version),
CreateRuntime(BaseRID, version: lastVersion, qualifier: qualifier)
};

if (ApplyVersionsToParent)
{
imports.Add(CreateRuntime(Parent, version: version, qualifier: qualifier));
}

yield return new RIDMapping(CreateRuntime(BaseRID, version: version, qualifier: qualifier), imports);

foreach (var architecture in Architectures)
{
// base + version + architecture + qualifier =>
// base + version + qualifier,
// base + version + architecture,
// base + version,
// base + lastVersion + architecture + qualifier,
// parent + version + architecture + qualifier (optionally)
var archImports = new List<RID>()
{
CreateRuntime(BaseRID, version: version, qualifier: qualifier),
CreateRuntime(BaseRID, version: version, architecture: architecture),
CreateRuntime(BaseRID, version: version),
CreateRuntime(BaseRID, version: lastVersion, architecture: architecture, qualifier: qualifier)
};

if (ApplyVersionsToParent)
{
imports.Add(CreateRuntime(Parent, version: version, architecture: architecture, qualifier: qualifier));
}

yield return new RIDMapping(CreateRuntime(BaseRID, version: version, architecture: architecture, qualifier: qualifier), archImports);
}

if (TreatVersionsAsCompatible)
{
lastVersion = version;
}
}
}
}

private bool IsNullOrRoot(string rid)
{
return rid == null || rid == rootRID;
}


public IEnumerable<RuntimeDescription> GetRuntimeDescriptions()
{
foreach (var mapping in GetRIDMappings())
{
var rid = mapping.RuntimeIdentifier.ToString();

if (OmitRIDs.Contains(rid) || OmitRIDDefinitions.Contains(rid))
{
continue;
}

var imports = mapping.Imports
.Select(i => i.ToString())
.Where(i => !OmitRIDs.Contains(i) && !OmitRIDReferences.Contains(i))
.ToArray();

yield return new RuntimeDescription(rid, imports);
}
}

public RuntimeGraph GetRuntimeGraph()
{
return new RuntimeGraph(GetRuntimeDescriptions());
}
}

private static IDictionary<string, IEnumerable<string>> GetCompatibilityMap(RuntimeGraph graph)
{
Dictionary<string, IEnumerable<string>> compatibilityMap = new Dictionary<string, IEnumerable<string>>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
<Compile Include="BuildTask.cs" />
<Compile Include="Extensions.cs" />
<Compile Include="GenerateRuntimeGraph.cs" />
<Compile Include="RID.cs" />
<Compile Include="RuntimeGroup.cs" />
</ItemGroup>

<ItemGroup>
Expand Down
59 changes: 59 additions & 0 deletions src/libraries/Microsoft.NETCore.Platforms/src/RID.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Text;

namespace Microsoft.NETCore.Platforms.BuildTasks
{
internal class RID
{
public string BaseRID { get; set; }
public string VersionDelimiter { get; set; }
public string Version { get; set; }
public string ArchitectureDelimiter { get; set; }
public string Architecture { get; set; }
public string QualifierDelimiter { get; set; }
public string Qualifier { get; set; }

public override string ToString()
{
StringBuilder builder = new StringBuilder(BaseRID);

if (HasVersion())
{
builder.Append(VersionDelimiter);
builder.Append(Version);
}

if (HasArchitecture())
{
builder.Append(ArchitectureDelimiter);
builder.Append(Architecture);
}

if (HasQualifier())
{
builder.Append(QualifierDelimiter);
builder.Append(Qualifier);
}

return builder.ToString();
}

public bool HasVersion()
{
return Version != null;
}

public bool HasArchitecture()
{
return Architecture != null;
}

public bool HasQualifier()
{
return Qualifier != null;
}
}

}
Loading