SourcePackage GetPackage(PackageReference reference) { SourcePackage result; if (_cache.TryGetValue(reference.PackageName, out result)) { if (result == null) { Log.Error(reference.Source, null, "Circular reference to " + reference.Quote()); return(new SourcePackage(reference.PackageName, reference.PackageVersion)); } result.Flags |= SourcePackageFlags.Cached; result.Flags &= ~SourcePackageFlags.Startup; return(result); } var package = GetFile(reference); if (package == null) { Log.Error(reference.Source, ErrorCode.E0100, "Package " + reference.Quote() + " was not found"); return(new SourcePackage(reference.PackageName, reference.PackageVersion)); } result = package.CreateSourcePackage(); _cache[reference.PackageName] = null; foreach (var r in package.References) { result.References.Add(GetPackage(r)); } _cache[reference.PackageName] = result; return(result); }