in src/PortingAssistant.Client.Analysis/Utils/CodeEntityModelToCodeEntities.cs [15:94]
public static List<SourceFileAnalysisResult> AnalyzeResults(
Dictionary<string, List<CodeEntityDetails>> sourceFileToCodeEntities,
Dictionary<PackageVersionPair, Task<PackageDetails>> packageResults,
Dictionary<string, Task<RecommendationDetails>> recommendationResults,
Dictionary<string, List<RecommendedAction>> portingActionResults,
string targetFramework = "netcoreapp3.1",
bool compatibleOnly = false
)
{
var packageDetailsWithIndicesResults = ApiCompatiblity.PreProcessPackageDetails(packageResults);
return sourceFileToCodeEntities.Select(sourceFile =>
{
return new SourceFileAnalysisResult
{
SourceFileName = Path.GetFileName(sourceFile.Key),
SourceFilePath = sourceFile.Key,
RecommendedActions = portingActionResults?.GetValueOrDefault(sourceFile.Key, new List<RecommendedAction>()),
ApiAnalysisResults = sourceFile.Value.Select(codeEntity =>
{
var package = codeEntity.Package;
//A code entity with no reference data. This can be any error in the code
if (package == null)
{
return new ApiAnalysisResult
{
CodeEntityDetails = codeEntity,
CompatibilityResults = new Dictionary<string, CompatibilityResult>
{
{
targetFramework, new CompatibilityResult() { Compatibility = Compatibility.UNKNOWN }
}
},
Recommendations = new Model.Recommendations
{
RecommendedActions = new List<RecommendedAction>()
}
};
}
var sdkpackage = new PackageVersionPair { PackageId = codeEntity.Namespace, Version = "0.0.0", PackageSourceType = PackageSourceType.SDK };
// check result with nuget package
var packageDetails = packageDetailsWithIndicesResults.GetValueOrDefault(package, null);
var compatibilityResultWithPackage = ApiCompatiblity.GetCompatibilityResult(packageDetails, codeEntity, targetFramework);
// potential check with namespace
var sdkpackageDetails = packageDetailsWithIndicesResults.GetValueOrDefault(sdkpackage, null);
var compatibilityResultWithSdk = ApiCompatiblity.GetCompatibilityResult(sdkpackageDetails, codeEntity, targetFramework);
var compatibilityResult = GetCompatibilityResult(compatibilityResultWithPackage, compatibilityResultWithSdk);
if (compatibleOnly)
{
if (!(compatibilityResult.Compatibility == Compatibility.INCOMPATIBLE))
return null;
}
var recommendationDetails = recommendationResults.GetValueOrDefault(codeEntity.Namespace, null);
var apiRecommendation = ApiCompatiblity.UpgradeStrategy(compatibilityResult, codeEntity.OriginalDefinition, recommendationDetails, targetFramework);
return new ApiAnalysisResult
{
CodeEntityDetails = codeEntity,
CompatibilityResults = new Dictionary<string, CompatibilityResult>
{
{ targetFramework, compatibilityResult}
},
Recommendations = new Model.Recommendations
{
RecommendedActions = new List<RecommendedAction>
{
apiRecommendation
}
}
};
}).Where(codeEntity => codeEntity != null)
.ToList()
};
}
).ToList();
}