using System.Collections.Generic;
using System.Linq;
using Codelyzer.Analysis;
using Codelyzer.Analysis.Model;
using CTA.FeatureDetection;
using CTA.FeatureDetection.Common.Models;
using CTA.Rules.Config;
using CTA.Rules.Models;
using CTA.Rules.Update;
using Microsoft.Extensions.Logging;
namespace CTA.Rules.PortCore
{
///
/// Ports a solution
///
public class ProjectPort
{
private ProjectRewriter _projectRewriter;
internal FeatureDetectionResult ProjectTypeFeatureResults;
private ProjectResult _projectResult;
internal HashSet ProjectReferences;
private SolutionPort _solutionPort;
private IProjectRewriterFactory _projectRewriterFactory;
public ProjectPort(AnalyzerResult analyzerResult, PortCoreConfiguration projectConfiguration, SolutionPort solutionPort, ILogger logger = null)
{
if (logger != null)
{
LogHelper.Logger = logger;
}
_solutionPort = solutionPort;
_projectRewriterFactory = new PortCoreProjectRewriterFactory();
ProjectReferences = new HashSet() { Constants.ProjectRecommendationFile };
InitProjectRewriter(analyzerResult, projectConfiguration);
}
private void InitProjectRewriter(AnalyzerResult analyzerResult, PortCoreConfiguration projectConfiguration)
{
InitRules(projectConfiguration, analyzerResult);
_projectRewriter = _projectRewriterFactory.GetInstance(analyzerResult, projectConfiguration);
}
private void InitRules(PortCoreConfiguration projectConfiguration, AnalyzerResult analyzerResult)
{
using var projectTypeFeatureDetector = new FeatureDetector();
ProjectTypeFeatureResults = projectTypeFeatureDetector.DetectFeaturesInProject(analyzerResult);
projectConfiguration.ProjectType = _solutionPort.GetProjectType(ProjectTypeFeatureResults);
if (projectConfiguration.UseDefaultRules)
{
//If a rules dir was provided, copy files from that dir into the rules folder
if (!string.IsNullOrEmpty(projectConfiguration.RulesDir))
{
_solutionPort.CopyOverrideRules(projectConfiguration.RulesDir);
}
projectConfiguration.RulesDir = Constants.RulesDefaultPath;
ProjectReferences.UnionWith(PortCoreUtils.GetReferencesForProject(analyzerResult));
ProjectReferences.Add(Constants.ProjectRecommendationFile);
}
_solutionPort.DownloadRecommendationFiles(ProjectReferences);
}
///
/// Initializes the Solution Port
///
public ProjectResult AnalysisRun()
{
// If the solution was already analyzed, don't duplicate the results
if (_projectResult != null)
{
return _projectResult;
}
_projectResult = _projectRewriter.Initialize();
return _projectResult;
}
///
/// Runs the Solution Port after creating an analysis
///
public ProjectResult Run()
{
// Find actions to execute for each project
var projectAnalysisResult = AnalysisRun();
var projectActions = projectAnalysisResult.ProjectActions;
// Pass in the actions found to translate all files in each project
var projectRewriterResult = _projectRewriter.Run(projectActions);
return projectRewriterResult;
}
}
}