in src/PortingAssistantExtensionServer/Services/AnalysisService.cs [233:332]
public IList<Diagnostic> GetDiagnostics(SourceFileAnalysisResult sourceFileAnalysisResult)
{
var diagnostics = new List<Diagnostic>();
var fileUri = DocumentUri.FromFileSystemPath(sourceFileAnalysisResult.SourceFilePath);
var codedescrption = new CodeDescription()
{
//TODO Move to a constants class
Href = new Uri(Constants.PortingAssitantHelpUrl)
};
foreach (var api in sourceFileAnalysisResult.ApiAnalysisResults)
{
if (api.CompatibilityResults[_request.settings.TargetFramework].Compatibility == Compatibility.INCOMPATIBLE)
{
try
{
var name = api.CodeEntityDetails.Signature;
var package = api.CodeEntityDetails.Package;
var rcommnadation = api.Recommendations.RecommendedActions
.Where(r => r.RecommendedActionType != RecommendedActionType.NoRecommendation)
.Select(r =>
{
switch (r.RecommendedActionType)
{
case RecommendedActionType.UpgradePackage:
return $"Upgrade Source Package { package.PackageId}-{package.Version} to version " + r.Description;
case RecommendedActionType.ReplacePackage:
return $"Replace Source Package { package.PackageId}-{package.Version} with " + r.Description;
case RecommendedActionType.ReplaceApi:
return r.Description;
case RecommendedActionType.ReplaceNamespace:
return r.Description;
case RecommendedActionType.NoRecommendation:
break;
default:
break;
}
return "";
});
var message = $"Porting Assistant: {name} is incompatible for target framework {_request.settings.TargetFramework} " + string.Join(", ", rcommnadation);
var range = GetRange(api.CodeEntityDetails.TextSpan);
var location = new Location()
{
Uri = fileUri,
Range = range
};
var diagnostic = new Diagnostic()
{
Severity = DiagnosticSeverity.Warning,
Code = new DiagnosticCode(Constants.DiagnosticCode),
Source = Constants.DiagnosticSource,
CodeDescription = codedescrption,
Range = range,
RelatedInformation = new Container<DiagnosticRelatedInformation>(new List<DiagnosticRelatedInformation>() { new DiagnosticRelatedInformation() {
Location = location
} }),
Message = message,
};
diagnostics.Add(diagnostic);
}
catch (Exception ex)
{
_logger.LogError(ex, "Add API diagnostic failed with error: ");
}
}
}
foreach (var recommendedAction in sourceFileAnalysisResult.RecommendedActions)
{
var range = GetRange(recommendedAction.TextSpan);
var location = new Location
{
Uri = fileUri,
Range = range
};
try
{
var diagnositc = new Diagnostic()
{
Severity = DiagnosticSeverity.Warning,
Code = new DiagnosticCode(Constants.DiagnosticWithActionCode),
Source = Constants.DiagnosticSource,
CodeDescription = codedescrption,
Range = range,
RelatedInformation = new Container<DiagnosticRelatedInformation>(new List<DiagnosticRelatedInformation>() {new DiagnosticRelatedInformation(){
Location = location
} }),
Message = recommendedAction.Description,
};
diagnostics.Add(diagnositc);
UpdateCodeAction(diagnositc.Message, diagnositc.Range, fileUri.Path, recommendedAction.TextChanges);
}
catch (Exception ex)
{
_logger.LogError(ex, "Add porting action diagnostic failed with error: ");
}
}
return diagnostics;
}