private async Task<Tuple<Compilation, IEnumerable<ITypeMetric>>> CalculateTypeMetrics(Compilation compilation, NamespaceDeclaration namespaceNodes, Solution solution)
{
var comp = compilation;
var tasks = GetTypeDeclarations(namespaceNodes)
.Select(async typeNodes =>
{
var tuple = await CalculateMemberMetrics(comp, typeNodes, solution).ConfigureAwait(false);
var metrics = tuple.Item2;
comp = tuple.Item1;
return new
{
comp,
typeNodes,
solution,
memberMetrics = metrics
};
})
.AsArray();
var data = await Task.WhenAll(tasks).ConfigureAwait(false);
var typeMetricsTasks = data
.Select(async item =>
{
var tuple = await CalculateTypeMetrics(item.solution, item.comp, item.typeNodes, item.memberMetrics).ConfigureAwait(false);
if (tuple == null)
{
return null;
}
comp = tuple.Item1;
return tuple.Item2;
})
.AsArray();
var typeMetrics = await Task.WhenAll(typeMetricsTasks).ConfigureAwait(false);
var array = typeMetrics.Where(x => x != null).AsArray();
return new Tuple<Compilation, IEnumerable<ITypeMetric>>(comp, array);
}
}