Exemplo n.º 1
0
 public static bool TryParse(ICodebaseService codebaseService, CsProjectFileInfo projFileInfo, out CsProjectFile csProject)
 {
     try
     {
         csProject = CsProjectFile.Parse(codebaseService, projFileInfo);
         return(true);
     }
     catch
     {
         csProject = null;
         return(false);
     }
 }
        /// <summary>
        /// Получает последовательность всех солюшенов из репозитория (на указанной ветке)
        /// </summary>
        public static IEnumerable <Result <CsSolution> > GetAllSolutions(
            ICodebaseService codebaseService
            , BranchInfo branch
            , ProgressObserver progressObserver = null)
        {
            if (codebaseService == null)
            {
                throw new ArgumentNullException(nameof(codebaseService));
            }

            bool isSolutionFileInfo(SourceItemInfo item)
            => item.Type == SourceItemTypes.File && item.Extension?.ToLower() == "sln";

            return(codebaseService.FindAllItems(
                       branch
                       , null
                       , isSolutionFileInfo
                       , items => items.Any(isSolutionFileInfo)
                       , true
                       , progressObserver)
                   .Select(solutionFileInfo =>
            {
                try
                {
                    var solutionFileContent = codebaseService.GetSourceFileContent(solutionFileInfo);
                    var solutionFile = CsSolutionFile.Parse(solutionFileContent, solutionFileInfo);
                    var projectFiles = solutionFile.CsProjectFileInfos
                                       .Select(projectFileInfo => CsProjectFile.Parse(codebaseService, projectFileInfo));

                    return new Result <CsSolution>
                    {
                        IsSuccessful = true,
                        Data = new CsSolution(solutionFile, projectFiles)
                    };
                }
                catch (Exception e)
                {
                    return new Result <CsSolution>
                    {
                        IsSuccessful = false,
                        Tag = solutionFileInfo,
                        ErrorMessage = e.Message
                    };
                }
            }));
        }
Exemplo n.º 3
0
        public static CsProjectFile Parse(ICodebaseService codebaseService, CsProjectFileInfo projFileInfo)
        {
            var projFileContent = codebaseService.GetSourceFileContent(projFileInfo);

            var result = new CsProjectFile
            {
                ProjectFileInfo = projFileInfo,
                //IsNewFormat = CsParsingHelper.IsProjectOfNewFormat(projFileContent)
            };

            CsParsingHelper.ParseFieldsFromCsProjectXml(result, projFileContent);

            if (!result.IsNewFormat)
            {
                if (codebaseService.TryGetSourceFileContentIfExists(projFileInfo.Branch
                                                                    , $"{projFileInfo.FolderPath}/packages.config", out var packagesConfigContent))
                {
                    result.PackageReferences = CsParsingHelper.ParsePackageReferencesFromConfig(packagesConfigContent);
                }
            }

            return(result);
        }
Exemplo n.º 4
0
        public static void ParseFieldsFromCsProjectXml(CsProjectFile targetProject, string xmlString, Action <Exception> onError = null)
        {
            if (targetProject == null)
            {
                throw new ArgumentNullException(nameof(targetProject));
            }

            var projXml = CsParsingHelper.ToXElement(xmlString, onError);

            // новый/старый формат
            var isNewFormat = projXml.Attribute("ToolsVersion") == null;

            targetProject.IsNewFormat = isNewFormat;
            if (isNewFormat)
            {
                var propertyGroup = projXml.Elements("PropertyGroup")
                                    .SelectMany(e => e.Elements());
                targetProject.Version                = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Version")?.Value;
                targetProject.TargetFramework        = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "TargetFramework")?.Value;
                targetProject.GeneratePackageOnBuild = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "GeneratePackageOnBuild")?.Value.Trim().ToLower() == "true";
                targetProject.Authors                = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Authors")?.Value;
                targetProject.Description            = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Description")?.Value;
                targetProject.Company                = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Company")?.Value;
                targetProject.Product                = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Product")?.Value;
                targetProject.AssemblyName           = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "AssemblyName")?.Value;
                targetProject.RootNamespace          = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "RootNamespace")?.Value;

                targetProject.PackageReferences = projXml.Elements("ItemGroup")
                                                  .SelectMany(e => e.Elements()
                                                              .Where(rf => rf.Name.LocalName == "PackageReference"))
                                                  .Select(pr =>
                                                          new CsProjectFile.PackageReference
                {
                    Name    = pr.Attribute("Include").Value,
                    Version = pr.Attribute("Version")?.Value                                     // может отсутствовать
                });

                targetProject.DotNetCliToolReferences = projXml.Elements("ItemGroup")
                                                        .SelectMany(e => e.Elements()
                                                                    .Where(rf => rf.Name.LocalName == "DotNetCliToolReference"))
                                                        .Select(e =>
                                                                new CsProjectFile.DotNetCliToolReference
                {
                    Name    = e.Attribute("Include").Value,
                    Version = e.Attribute("Version").Value
                });

                targetProject.ProjectReferences = projXml.Elements("ItemGroup")
                                                  .SelectMany(e => e.Elements()
                                                              .Where(rf => rf.Name.LocalName == "ProjectReference"))
                                                  .Select(e =>
                                                          new CsProjectFile.ProjectReference
                {
                    RelativePath = e.Attribute("Include").Value
                });
            }
            else
            {
                // если формат файла проекта старый

                var propertyGroup = projXml.Elements("PropertyGroup")
                                    .SelectMany(e => e.Elements());
                targetProject.Version                = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Version")?.Value;
                targetProject.TargetFramework        = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "TargetFrameworkVersion")?.Value;
                targetProject.GeneratePackageOnBuild = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "GeneratePackageOnBuild")?.Value.Trim().ToLower() == "true";
                targetProject.Authors                = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Authors")?.Value;
                targetProject.Description            = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Description")?.Value;
                targetProject.Company                = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Company")?.Value;
                targetProject.Product                = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Product")?.Value;
                targetProject.AssemblyName           = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "AssemblyName")?.Value;
                targetProject.RootNamespace          = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "RootNamespace")?.Value;

                targetProject.ProjectReferences = projXml.Elements("ItemGroup")
                                                  .SelectMany(e => e.Elements()
                                                              .Where(rf => rf.Name.LocalName == "ProjectReference"))
                                                  .Select(e =>
                                                          new CsProjectFile.ProjectReference
                {
                    RelativePath = e.Attribute("Include").Value
                });
            }
        }