in src/lib/Microsoft.Fx.Portability.Reports.DGML/DGMLOutputWriter.cs [25:96]
public Task WriteStreamAsync(Stream stream, AnalyzeResponse response)
{
// Create a new dgml every time write to a new stream.
var dgml = new DGMLManager();
var rg = ReferenceGraph.CreateGraph(response);
var analysisResult = response.ReportingResult;
var targets = analysisResult.Targets;
GenerateTargetContainers(dgml, targets);
dgml.SetTitle(response.ApplicationName);
// For each target, let's generate the assemblies
foreach (var node in rg.Nodes.Keys)
{
for (int i = 0; i < targets.Count; i++)
{
double portabilityIndex = 0, portabilityIndexRefs = 0;
string missingTypes = null;
if (node.UsageData != null)
{
TargetUsageInfo usageInfo = node.UsageData[i];
portabilityIndex = node.GetPortabilityIndex(i);
portabilityIndexRefs = node.GetPortabilityIndexForReferences(i);
missingTypes = GenerateMissingTypes(node.Assembly, analysisResult, i);
}
// generate the node
string tfm = targets[i].FullName;
Guid nodeGuid = dgml.GetOrCreateGuid($"{node.Assembly},TFM:{tfm}");
string nodeTitle = $"{node.SimpleName}: {Math.Round(portabilityIndex * 100, 2)}%, References: {Math.Round(portabilityIndexRefs * 100, 2)}%";
string nodeCategory = node.IsMissing ? "Unresolved" : GetCategory(Math.Round(portabilityIndex * portabilityIndexRefs * 100, 2));
dgml.AddNode(nodeGuid, nodeTitle,
nodeCategory,
portabilityIndex,
group: string.IsNullOrEmpty(missingTypes) ? null : "Collapsed");
if (dgml.TryGetId(tfm, out Guid frameworkGuid))
{
dgml.AddLink(frameworkGuid, nodeGuid, "Contains");
}
if (!string.IsNullOrEmpty(missingTypes))
{
Guid commentGuid = Guid.NewGuid();
dgml.AddNode(commentGuid, missingTypes, "Comment");
dgml.AddLink(nodeGuid, commentGuid, "Contains");
}
}
}
// generate the references.
foreach (var node in rg.Nodes.Keys)
{
for (int i = 0; i < targets.Count; i++)
{
// generate the node
string tfm = targets[i].FullName;
Guid nodeGuid = dgml.GetOrCreateGuid($"{node.Assembly},TFM:{tfm}");
foreach (var refNode in node.Nodes)
{
Guid refNodeGuid = dgml.GetOrCreateGuid($"{refNode.Assembly},TFM:{tfm}");
dgml.AddLink(nodeGuid, refNodeGuid);
}
}
}
return dgml.SaveAsync(stream);
}