/// <summary>
        /// Populates specified project object from context
        /// </summary>
        /// <param name="project"></param>
        /// <param name="context"></param>
        public IProject Build(IProject project, ProjectContext context)
        {
            project.AbsolutePath       = context.FileName;
            project.Name               = context.Name;
            project.Version            = context.Version;
            project.PackagesConfigPath = context.PackagesConfigFileSpec;
            project.AppConfigPath      = context.AppConfigFileSpec;

            foreach (var packageReferenceContext in context.PackageReferences)
            {
                if (_packageCache.PackagesDictionary.TryGetValue(packageReferenceContext.Name, out var package))
                {
                    var reference = new PackageReference
                    {
                        Package          = package,
                        Version          = packageReferenceContext.Version,
                        PreReleaseSuffix = packageReferenceContext.PreRelease,
                        LineNumber       = packageReferenceContext.LineNumber,
                        OriginalXml      = packageReferenceContext.OriginalXml
                    };

                    if (project.PackageReferenceDictionary.TryGetValue(reference.Package.Name, out var existingReference))
                    {
                        _logErrorAction(project,
                                        $"There is already a reference to package {existingReference.Package.Name} at version {existingReference.Version}");
                    }

                    project.PackageReferenceDictionary[reference.Package.Name] = reference;
                }
                else
                {
                    _logErrorAction(project, $"Package {packageReferenceContext.Name} not found in cache");
                }
            }

            if (context.HasPackagesConfig)
            {
                foreach (var packageContext in context.GetPackagesConfigContext().Packages)
                {
                    if (_packageCache.PackagesDictionary.TryGetValue(packageContext.Id, out var package))
                    {
                        if (!project.PackageReferenceDictionary.ContainsKey(package.Name))
                        {
                            project.PackageReferenceDictionary[package.Name] = new PackageReference
                            {
                                Package                  = package,
                                Version                  = packageContext.Version,
                                PreReleaseSuffix         = packageContext.PreRelease,
                                PackagesConfigLineNumber = packageContext.LineNumber
                            };
                        }
                    }
                    else
                    {
                        _logErrorAction(project, $"Package {packageContext.Id} not found in cache");
                    }
                }
            }

            foreach (var referenceContext in context.References.Where(c => c.IsPackage))
            {
                if (_packageCache.PackagesDictionary.TryGetValue(referenceContext.Name, out var package))
                {
                    if (!project.PackageReferenceDictionary.TryGetValue(package.Name, out var reference))
                    {
                        reference = new PackageReference
                        {
                            Package = package,
                            Version = referenceContext.AssemblyVersion,
                        };

                        project.PackageReferenceDictionary[package.Name] = reference;
                    }

                    if (reference.AssemblyReferences == null)
                    {
                        reference.AssemblyReferences = new List <AssemblyReference>();
                    }

                    reference.AssemblyReferences.Add(new AssemblyReference
                    {
                        Package  = package,
                        HintPath = referenceContext.HintPath,
                        Version  = referenceContext.AssemblyVersion
                    });
                }
                else
                {
                    _logErrorAction(project, $"Package {referenceContext.Name} not found in cache");
                }
            }

            if (context.HasAppConfig)
            {
                foreach (var assemblyRedirect in context.GetAppConfigContext().AssemblyRedirects)
                {
                    project.BindingRedirections.Add(new BindingRedirection
                    {
                        AssemblyName   = assemblyRedirect.AssemblyName,
                        OldVersionFrom = assemblyRedirect.OldVersionFrom,
                        OldVersionTo   = assemblyRedirect.OldVersionTo,
                        NewVersion     = assemblyRedirect.NewVersion,
                        LineNumber     = assemblyRedirect.LineNumber
                    });
                }
            }

            return(project);
        }