private void CalculateTargetGraph(Project project)
        {
            ProjectInstance projectInstance;

            if (!_projectToProjectInstanceMap.TryGetValue(project, out projectInstance))
            {
                // if for some reason we weren't able to fish out the project instance from MSBuild,
                // just add all orphans directly to the project
                var unparented = project.GetUnparentedTargets();
                foreach (var orphan in unparented)
                {
                    project.AddChild(orphan);
                }

                return;
            }

            var targetGraph = new TargetGraph(projectInstance);

            var unparentedTargets = project.GetUnparentedTargets();

            foreach (var unparentedTarget in unparentedTargets)
            {
                var parent = targetGraph.GetDependent(unparentedTarget.Name);
                if (parent != null)
                {
                    var parentNode = project.GetOrAddTargetByName(parent);
                    if (parentNode != null)
                    {
                        parentNode.AddChild(unparentedTarget);
                    }
                }

                if (unparentedTarget.Parent == null)
                {
                    project.AddChild(unparentedTarget);
                }
            }

            project.VisitAllChildren <Target>(t =>
            {
                if (t.Project == project)
                {
                    var dependencies = targetGraph.GetDependencies(t.Name);
                    if (dependencies != null && dependencies.Any())
                    {
                        t.DependsOnTargets = stringTable.Intern(string.Join(",", dependencies));
                    }
                }
            });
        }
        public void ProjectStarted(object sender, ProjectStartedEventArgs args)
        {
            try
            {
                lock (syncLock)
                {
                    Project parent = null;

                    int parentProjectId = args?.ParentProjectBuildEventContext.ProjectContextId ?? -1;
                    if (parentProjectId > 0)
                    {
                        parent = GetOrAddProject(parentProjectId);
                    }

                    var project = GetOrAddProject(args.BuildEventContext.ProjectContextId, args, parent);

                    if (parent != null)
                    {
                        parent.AddChild(project);
                    }
                    else
                    {
                        // This is a "Root" project (no parent project).
                        Build.AddChild(project);
                    }
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }