public static GlobalSection Parse(string line)
        {
            GlobalSection g = new GlobalSection();

            var halves = line.Split(") = ");

            g.SectionType = halves[0].Substring(halves[0].IndexOf("(") + 1);
            g.Location    = halves[1];

            return(g);
        }
Esempio n. 2
0
        void Parse(string slnFile)
        {
            this.Name = System.IO.Path.GetFileName(slnFile);
            this.Path = slnFile;
            bool    isParsingProject = false;
            bool    isParsingGlobal  = false;
            var     lines            = File.ReadAllLines(slnFile);
            Project currentProject   = null;

            GlobalSection currentGlobalSection = null;

            foreach (var line in lines)
            {
                if (string.IsNullOrWhiteSpace(line))
                {
                    continue;
                }
                if (IsComment(line))
                {
                    continue;
                }

                if (isParsingGlobal)
                {
                    if (line.TrimStart().StartsWith("GlobalSection"))
                    {
                        currentGlobalSection = GlobalSection.Parse(line);
                    }
                    else if (line.TrimStart().StartsWith("EndGlobalSection"))
                    {
                        GlobalSections.Add(currentGlobalSection.SectionType, currentGlobalSection);
                        currentGlobalSection = null;
                    }
                    else if (line == "EndGlobal")
                    {
                        isParsingGlobal = false;
                    }
                    else
                    {
                        currentGlobalSection.AddSubLine(line);
                    }
                }
                else if (isParsingProject)
                {
                    if (line.StartsWith("EndProject"))
                    {
                        isParsingProject = false;
                        this.Projects.Add(currentProject);
                    }
                    else
                    {
                        currentProject.AddSubItem(line);
                    }
                }
                else
                {
                    if (line.StartsWith("VisualStudioVersion = "))
                    {
                        this.VisualStudioVersion = Version.Parse(line.Substring("VisualStudioVersion = ".Length));
                    }
                    if (line.StartsWith("MinimumVisualStudioVersion ="))
                    {
                        this.MinimumVisualStudioVersion = Version.Parse(line.Substring("MinimumVisualStudioVersion =".Length));
                    }

                    if (line.StartsWith("Project("))
                    {
                        isParsingProject = true;
                        currentProject   = Project.Parse(line, Name);
                    }

                    if (line.Trim() == "Global")
                    {
                        isParsingGlobal = true;
                    }
                }
            }


            foreach (var p in Projects)
            {
                ProjectsById[p.ProjectGuid] = p;
            }

            if (GlobalSections.TryGetValue("NestedProjects", out var section))
            {
                foreach (var subItem in section.SubItems)
                {
                    var guids  = subItem.Split("=");
                    var child  = Guid.Parse(guids[0].Trim());
                    var parent = Guid.Parse(guids[1].Trim());
                    ProjectsById[child].ParentGuid = parent;
                    ProjectsById[parent].ChildProjectGuids.Add(child);
                }
            }
            else
            {
                GlobalSections.Add("NestProjects", new GlobalSection {
                    Location = "preSolution", SectionType = "NestedProjects"
                });
            }

            this.SolutionGuid = GetSolutionGuid();
        }