private void ParseNetCore(VisualStudioSolutionProject visualStudioProject, XDocument xDocument)
        {
            string sdkValue = xDocument.Descendants("Project").Attributes("Sdk").Select(a => a.Value).FirstOrDefault();

            visualStudioProject.Type = VsProjectType.NetCore;

            if (sdkValue == "Microsoft.NET.Sdk.Web")
            {
                visualStudioProject.Type |= VsProjectType.Web;
                return;
            }

            if (sdkValue == "Microsoft.NET.Sdk")
            {
                string outputType = xDocument.Descendants("OutputType").Select(a => a.Value).FirstOrDefault();

                if (outputType != null && outputType.Equals("Exe", StringComparison.InvariantCultureIgnoreCase))
                {
                    visualStudioProject.Type |= VsProjectType.Console;
                }

                if (xDocument.Descendants("PackageReference").Any(d => d.Attribute("Include")?.Value == "MSTest.TestFramework"))
                {
                    visualStudioProject.Type |= VsProjectType.Test;
                }

                if (xDocument.Descendants("PackageReference").Any(d => d.Attribute("Include")?.Value == "MSTest.TestFramework"))
                {
                    visualStudioProject.Type |= VsProjectType.ClassLibrary;
                }
            }
        }
Exemple #2
0
        public override IGeneratorCommandResult Run()
        {
            string                      projectFileName = FileSystem.GetFileName(this.Parameters.Project);
            VisualStudioParser          parser          = new();
            VisualStudioSolutionProject project         = parser.ParseProject(this.Parameters.Project);

            if (project == null || project.Id == Guid.Empty)
            {
                VisualStudioSolution solution = parser.ParseSolution(this.Parameters.Solution);
                project = solution?.Projects.FirstOrDefault(x => x.Path.EndsWith(projectFileName)) ?? project;
            }
            if (project != null && project.Id == Guid.Empty)
            {
                project.Id = Guid.NewGuid();
                parser.SetProjectGuid(this.Parameters.Project, project.Id);
            }

            if (project == null || project.Id == Guid.Empty)
            {
                Logger.Warning($"Can not read project id. No solution for project '{this.Parameters.Project}' found. Automatic file cleanup deactivated!");
                return(this.Success());
            }
            this.resolver.Get <IEnvironment>().OutputId = project.Id;

            return(this.Success().ForceRerunOnAsync());
        }
        public IList <VisualStudioSolutionProject> Parse(string solutionFilePath)
        {
            string text   = File.ReadAllText(solutionFilePath);
            string folder = Path.GetDirectoryName(solutionFilePath);

            IList <VisualStudioSolutionProject> result = new List <VisualStudioSolutionProject>();

            Match match = projectParser.Match(text);

            while (match.Success)
            {
                if (match.Groups["type"].Value == "2150E333-8FDC-42A3-9474-1A3956D46DE8") // project group
                {
                    match = match.NextMatch();
                    continue;
                }

                VisualStudioSolutionProject visualStudioProject = new VisualStudioSolutionProject()
                {
                    Guid        = Guid.Parse(match.Groups["guid"].Value),
                    Name        = match.Groups["name"].Value,
                    ProjectFile = match.Groups["file"].Value,
                    TypeGuid    = Guid.Parse(match.Groups["type"].Value),
                };

                string projectFile = Path.Combine(folder, visualStudioProject.ProjectFile);
                this.ProcessCSProjFile(projectFile, visualStudioProject);

                result.Add(visualStudioProject);

                match = match.NextMatch();
            }

            return(result);
        }
        private VisualStudioSolutionProject ParseProject(VisualStudioSolution solution, string projectLine)
        {
            var project = new VisualStudioSolutionProject {
                Solution = solution
            };
            var matches = Regex.Match(projectLine, SolutionConstants.ProjectRegex);

            project.TypeGuid    = new Guid(matches.Groups["typeguid"].Value);
            project.Name        = matches.Groups["name"].Value;
            project.FileName    = matches.Groups["filename"].Value;
            project.ProjectGuid = new Guid(matches.Groups["projectguid"].Value);

            string str;

            while ((str = ReadLine()) != null)
            {
                if (str.Equals("EndProject"))
                {
                    return(project);
                }
                else if (str.StartsWith("ProjectSection("))
                {
                    project.Sections.Add(ParseProjectSection(str));
                }
                else
                {
                    throw new Exception($"Unexpected line in project: {str}");
                }
            }
            return(project);
        }
        private void DetermineProjectType(VisualStudioSolutionProject visualStudioProject, XDocument xDocument, XNamespace fileNamespace)
        {
            XElement projectTypeGuids = xDocument.Descendants(fileNamespace + "ProjectTypeGuids").FirstOrDefault();

            if (projectTypeGuids != null)
            {
                Match match = guidParser.Match(projectTypeGuids.Value);

                while (match.Success)
                {
                    visualStudioProject.Type |= this.GetTypeByGuid(match.Groups["guid"].Value);
                    match = match.NextMatch();
                }
            }

            string typeGuid = visualStudioProject.TypeGuid.ToString().ToUpper();

            XElement outputTypeElement = xDocument.Descendants(fileNamespace + "OutputType").FirstOrDefault();

            if (outputTypeElement != null && outputTypeElement.Value == "Exe")
            {
                visualStudioProject.Type |= VsProjectType.Console;
            }
            else if (outputTypeElement != null && outputTypeElement.Value == "WinExe")
            {
                visualStudioProject.Type |= VsProjectType.WindowsApplication;
            }
            else if (outputTypeElement != null && outputTypeElement.Value == "Database")
            {
                visualStudioProject.Type |= VsProjectType.Database;
            }
            else if (xDocument.Descendants(fileNamespace + "UseIISExpress").Any())
            {
                visualStudioProject.Type |= VsProjectType.Web;

                switch (typeGuid.ToUpper())
                {
                case "E3E379DF-F4C6-4180-9B81-6769533ABE47":
                    visualStudioProject.MvcVersion = 4;
                    break;

                case "E53F8FEA-EAE0-44A6-8774-FFD645390401":
                    visualStudioProject.MvcVersion = 3;
                    break;

                case "F85E285D-A4E0-4152-9332-AB1D724D3325":
                    visualStudioProject.MvcVersion = 2;
                    break;

                case "603C0E0B-DB56-11DC-BE95-000D561079B0":
                    visualStudioProject.MvcVersion = 1;
                    break;

                default:
                    break;
                }
            }
        }
 private void DetermineProjectCLR(VisualStudioSolutionProject visualStudioProject, XDocument xDocument, XNamespace fileNamespace)
 {
     visualStudioProject.TargetFrameworkVersion = xDocument.Descendants(fileNamespace + "TargetFrameworkVersion").Select(n => n.Value).FirstOrDefault();
     visualStudioProject.ContentFiles           = xDocument.Descendants(fileNamespace + "Content").Select(n => n.Attribute("Include").Value).ToList();
     visualStudioProject.ReferenceLibraries     = xDocument
                                                  .Descendants(fileNamespace + "Content")
                                                  .SelectMany(n => n.Descendants("HintPath"))
                                                  .Select(n => n.Value)
                                                  .ToList();
 }
        public void Call_WithNormalProject()
        {
            var solution = new VisualStudioSolution();

            var solutionProject = new VisualStudioSolutionProject();

            solutionProject.Solution = solution;
            var project = visualStudioProjectGenerator.CreateNewProject(solutionProject, "", "", "");

            visualStudioProjectWriter.WriteProject("file", solutionProject);

            mockFileReaderWriter.Received(1).WriteFile(Arg.Any <string>(), Arg.Any <MemoryStream>());
        }
        private Framework DetectFramework(VisualStudioSolutionProject project)
        {
            var frameworkVersionNode = _projectNodeSelector.First(project.Project, "TargetFrameworkVersion");
            var targetProfileNode    = _projectNodeSelector.First(project.Project, "TargetFrameworkProfile");

            if (frameworkVersionNode != null)
            {
                return(_stringToFrameworkConverter.Convert(frameworkVersionNode.Value, targetProfileNode?.Value));
            }

            _logger.Error($"TargetFrameworkVersion not found in project {project.Name}");
            return(Framework.Unknown);
        }
Exemple #9
0
        public void Analyse(VisualStudioSolutionProject solutionProject, ProjectAnalysis projectAnalysis)
        {
            var configurations = _projectNodeSelector.GetPlatformConfigurations(solutionProject.Project);

            foreach (var configuration in configurations)
            {
                var configurationPlatform = _configurationPlatformParser.GetConfigurationAndPlatform(configuration);

                var configurationPlatformAnalysis = projectAnalysis.GetConfigurationPlatform(
                    configurationPlatform.configuration, configurationPlatform.platform);
                configurationPlatformAnalysis.LanguageVersion = GetLanguageVersion(configuration);
            }
        }
        private VisualStudioProjectNode ResolveProjectNode(VisualStudioSolutionProject project, CompileUnit compileUnit)
        {
            var relativeFileName = _compileItemFileNameComposer.ComposeFileName(compileUnit.Name, project.TypeGuid);

            var node = _projectGenerator.GetCompileItem(project.Project, relativeFileName);

            if (node == null)
            {
                node = _projectGenerator.AddCompileItem(project.Project, relativeFileName);
            }

            return(node);
        }
        public void Call_With_SolutionFolder()
        {
            var solution = new VisualStudioSolution();

            var solutionProject = new VisualStudioSolutionProject {
                TypeGuid = new Guid(VisualStudioSolutionProjectTypeIds.SolutionFolderGuid)
            };

            solutionProject.Solution = solution;
            visualStudioProjectWriter.WriteProject("file", solutionProject);

            mockFileReaderWriter.Received(0).WriteFile(Arg.Any <string>(), Arg.Any <MemoryStream>());
        }
Exemple #12
0
        public void Analyse(VisualStudioSolutionProject solutionProject, ProjectAnalysis projectAnalysis)
        {
            var configurations = _projectNodeSelector.GetPlatformConfigurations(solutionProject.Project);

            foreach (var configuration in configurations)
            {
                var configurationPlatform = _configurationPlatformParser.GetConfigurationAndPlatform(configuration);

                var configurationPlatformAnalysis = projectAnalysis.GetConfigurationPlatform(
                    configurationPlatform.configuration, configurationPlatform.platform);
                configurationPlatformAnalysis.WarningLevel         = GetWarningLevel(configuration);
                configurationPlatformAnalysis.TreatWarningsAsError = GetTreatWarningsAsErrors(configuration);
            }
        }
        private VisualStudioSolutionProject ResolveProject(VisualStudioSolution solution, MondopAssembly assembly)
        {
            VisualStudioSolutionProject project = solution.Projects.FirstOrDefault(
                x => x.Name.Equals(assembly.Name));

            if (project != null)
            {
                return(project);
            }

            project = NewProject(solution, assembly.Name, Guid.Parse(VisualStudioSolutionProjectTypeIds.CsProjectGuid), "Library",
                                 assembly.Folder, assembly.Namespace, "4.6.2");

            return(project);
        }
        private void ProcessCSProjFile(string projectFile, VisualStudioSolutionProject visualStudioProject)
        {
            XDocument xDocument = XDocument.Load(projectFile);

            XNamespace fileNamespace = "http://schemas.microsoft.com/developer/msbuild/2003";

            if (xDocument.Descendants("Project").Attributes("Sdk").Select(a => a.Value).FirstOrDefault() != null)
            {
                this.ParseNetCore(visualStudioProject, xDocument);
            }
            else
            {
                this.DetermineProjectType(visualStudioProject, xDocument, fileNamespace);
                this.DetermineProjectCLR(visualStudioProject, xDocument, fileNamespace);
            }
        }
Exemple #15
0
        public void Analyse(VisualStudioSolutionProject solutionProject, ProjectAnalysis projectAnalysis)
        {
            var configurations = _projectNodeSelector.GetPlatformConfigurations(solutionProject.Project);

            foreach (var configuration in configurations)
            {
                var configurationPlatform = _configurationPlatformParser.GetConfigurationAndPlatform(configuration);

                var configurationPlatformAnalysis = projectAnalysis.GetConfigurationPlatform(
                    configurationPlatform.configuration, configurationPlatform.platform);

                configurationPlatformAnalysis.CodeAnalysisRuleSet             = GetCodeAnalysisRuleSet(configuration);
                configurationPlatformAnalysis.RunCodeAnalysis                 = GetRunCodeAnalysis(configuration);
                configurationPlatformAnalysis.CodeAnalysisIgnoreGeneratedCode = GetCodeAnalysisIngoreGeneratedCode(configuration);
            }
        }
        public VisualStudioSolutionProject NewProject(VisualStudioSolution solution, string name, Guid typeId,
                                                      string outputType, string projectFolder, string rootNamespace, string targetFramework)
        {
            var solutionProject = new VisualStudioSolutionProject
            {
                Name        = name,
                Solution    = solution,
                FileName    = _projectFileNameComposer.Compose(solution.SolutionFolder, projectFolder, name, typeId),
                ProjectGuid = Guid.NewGuid(),
                TypeGuid    = typeId
            };

            solution.Projects.Add(solutionProject);

            CreateProjectConfigurationPlatforms(solution, solutionProject.ProjectGuid);

            _projectGenerator.CreateNewProject(solutionProject, outputType, rootNamespace, targetFramework);
            _projectGenerator.AddBuildConfigurations(solutionProject.Project);

            return(solutionProject);
        }
        public ProjectAnalysis Analyse(VisualStudioSolutionProject solutionProject)
        {
            if (solutionProject.Project == null)
            {
                _visualStudioSolutionManager.LoadProject(solutionProject);
            }

            if (CanAnalyse(solutionProject.TypeGuid))
            {
                var result = new ProjectAnalysis {
                    Project = solutionProject
                };

                foreach (var analyser in _analysers)
                {
                    analyser.Analyse(solutionProject, result);
                }

                return(result);
            }

            return(null);
        }
        public void WriteProject(string fileName, VisualStudioSolutionProject project)
        {
            if (project.TypeGuid == new Guid(VisualStudioSolutionProjectTypeIds.SolutionFolderGuid))
            {
                return;
            }

            var ms = new MemoryStream();

            var settings = new XmlWriterSettings();

            settings.Encoding = Encoding.UTF8;
            settings.Indent   = true;
            using (var xmlWriter = XmlWriter.Create(ms, settings))
            {
                xmlWriter.WriteStartDocument();
                WriteNode(xmlWriter, project.Project.Root, project.ProjectPath);
                xmlWriter.WriteEndDocument();
                xmlWriter.Flush();
            }

            _fileReaderWriter.WriteFile(project.QualifiedFileName, ms);
        }
 public void Analyse(VisualStudioSolutionProject solutionProject, ProjectAnalysis projectAnalysis)
 {
     projectAnalysis.Framework = DetectFramework(solutionProject);
 }