public Reference(VSProjReader reader, XElement node)
 {
     this.reader = reader;
     this.node = node;
 }
        private static void LoadProjects(List<string> paths, DependencyGraphBuilder builder, List<OutputEntry> warnings, string filenamePattern,
            params string[] defaultLanguage)
        {
            var csprojsFiles =
                new HashSet<string>(paths.SelectMany(folder => Directory.GetFiles(folder, filenamePattern, SearchOption.AllDirectories))
                    .Select(Path.GetFullPath));

            List<VSProjReader> csprojs = csprojsFiles.Select(f => new VSProjReader(f))
                .OrderBy(n => n.Filename, StringComparer.CurrentCultureIgnoreCase)
                .ToList();
            foreach (VSProjReader csproj in csprojs)
            {
                object proj = builder.AddProject(csproj.Name, csproj.AssemblyName, csproj.ProjectGuid, csproj.Filename, defaultLanguage);

                foreach (VSProjReader.ProjectReference csref in csproj.ProjectReferences)
                    builder.AddProjectReference(proj, csref.Name, null, csref.ProjectGuid, csref.Include, new Location(csproj.Filename, csref.LineNumber),
                        defaultLanguage);

                foreach (VSProjReader.Reference csref in csproj.References)
                {
                    IEnumerable<string> language;
                    if (csref.HintPath == null && csref.Include.GetPublicKey() == null)
                        // A system lib
                        language = defaultLanguage;
                    else
                        language = null;

                    builder.AddLibraryReference(proj, null, csref.Include.Name, null, csref.HintPath, new Location(csproj.Filename, csref.LineNumber),
                        language);
                }

                foreach (VSProjReader.COMReference csref in csproj.COMReferences)
                    builder.AddLibraryReference(proj, null, csref.Include, csref.Guid, null, new Location(csproj.Filename, csref.LineNumber), null);
            }

            var externalCsprojFiles = csprojs.SelectMany(p => p.ProjectReferences)
                .Select(r => r.Include)
                .Distinct()
                .Where(f => !csprojsFiles.Contains(f))
                .OrderBy(n => n, StringComparer.CurrentCultureIgnoreCase);
            foreach (string externalCsprojFile in externalCsprojFiles)
            {
                if (paths.Any(p => externalCsprojFile.StartsWith(p + Path.DirectorySeparatorChar)))
                {
                    OutputMessage msg = new OutputMessage().Append("Failed to load a referenced project: ")
                        .Append(externalCsprojFile);
                    warnings.Add(new LoadingOutputEntry("Referenced project not found", msg));
                    continue;
                }

                try
                {
                    var csproj = new VSProjReader(externalCsprojFile);
                    builder.AddProject(csproj.Name, csproj.AssemblyName, csproj.ProjectGuid, csproj.Filename, defaultLanguage);
                }
                catch (IOException)
                {
                    OutputMessage msg = new OutputMessage().Append("Failed to load a project outside of input folders: ")
                        .Append(externalCsprojFile);
                    warnings.Add(new LoadingOutputEntry("External project not found", msg));
                }
            }
        }