in src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs [47:212]
public static LockFile Read(ref Utf8JsonStreamReader reader, LockFileReadFlags flags)
{
if (reader.TokenType != JsonTokenType.StartObject)
{
throw new JsonException("Expected StartObject, found " + reader.TokenType);
}
var lockFile = new LockFile();
while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName)
{
if (reader.ValueTextEquals(VersionPropertyName))
{
reader.Read();
if (reader.TryGetInt32(out int version))
{
lockFile.Version = version;
}
else
{
lockFile.Version = int.MinValue;
}
}
else if (reader.ValueTextEquals(LibrariesPropertyName))
{
reader.Read();
if ((flags & LockFileReadFlags.Libraries) == LockFileReadFlags.Libraries)
{
lockFile.Libraries = reader.ReadObjectAsList<LockFileLibrary>(Utf8JsonStreamLockFileConverters.LockFileLibraryConverter);
}
else
{
reader.Skip();
lockFile.Libraries = Array.Empty<LockFileLibrary>();
}
}
else if (reader.ValueTextEquals(TargetsPropertyName))
{
reader.Read();
if ((flags & LockFileReadFlags.Targets) == LockFileReadFlags.Targets)
{
lockFile.Targets = reader.ReadObjectAsList<LockFileTarget>(Utf8JsonStreamLockFileConverters.LockFileTargetConverter);
}
else
{
reader.Skip();
lockFile.Targets = Array.Empty<LockFileTarget>();
}
}
else if (reader.ValueTextEquals(ProjectFileDependencyGroupsPropertyName))
{
reader.Read();
if ((flags & LockFileReadFlags.ProjectFileDependencyGroups) == LockFileReadFlags.ProjectFileDependencyGroups)
{
lockFile.ProjectFileDependencyGroups = reader.ReadObjectAsList<ProjectFileDependencyGroup>(Utf8JsonStreamLockFileConverters.ProjectFileDepencencyGroupConverter);
}
else
{
reader.Skip();
lockFile.ProjectFileDependencyGroups = Array.Empty<ProjectFileDependencyGroup>();
}
}
else if (reader.ValueTextEquals(PackageFoldersPropertyName))
{
reader.Read();
if ((flags & LockFileReadFlags.PackageFolders) == LockFileReadFlags.PackageFolders)
{
lockFile.PackageFolders = reader.ReadObjectAsList<LockFileItem>(Utf8JsonStreamLockFileConverters.LockFileItemConverter);
}
else
{
reader.Skip();
lockFile.PackageFolders = Array.Empty<LockFileItem>();
}
}
else if (reader.ValueTextEquals(ProjectPropertyName))
{
reader.Read();
if ((flags & LockFileReadFlags.PackageSpec) == LockFileReadFlags.PackageSpec)
{
lockFile.PackageSpec = JsonPackageSpecReader.GetPackageSpec(
ref reader,
name: null,
packageSpecPath: null,
EnvironmentVariableWrapper.Instance,
snapshotValue: null);
}
else
{
reader.Skip();
lockFile.PackageSpec = new PackageSpec(Array.Empty<TargetFrameworkInformation>());
}
}
else if (reader.ValueTextEquals(CentralTransitiveDependencyGroupsPropertyName))
{
IList<CentralTransitiveDependencyGroup> results = null;
if ((flags & LockFileReadFlags.CentralTransitiveDependencyGroups) == LockFileReadFlags.CentralTransitiveDependencyGroups)
{
if (reader.Read() && reader.TokenType == JsonTokenType.StartObject)
{
while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName)
{
results ??= new List<CentralTransitiveDependencyGroup>();
var frameworkPropertyName = reader.GetString();
NuGetFramework framework = NuGetFramework.Parse(frameworkPropertyName);
JsonPackageSpecReader.ReadCentralTransitiveDependencyGroup(
jsonReader: ref reader,
results: out var dependencies,
packageSpecPath: string.Empty);
results.Add(new CentralTransitiveDependencyGroup(framework, dependencies));
}
}
}
else
{
reader.Skip();
}
lockFile.CentralTransitiveDependencyGroups = results ?? Array.Empty<CentralTransitiveDependencyGroup>();
}
else if (reader.ValueTextEquals(LogsPropertyName))
{
reader.Read();
if ((flags & LockFileReadFlags.LogMessages) == LockFileReadFlags.LogMessages)
{
lockFile.LogMessages = reader.ReadListOfObjects<IAssetsLogMessage>(Utf8JsonStreamLockFileConverters.IAssetsLogMessageConverter);
}
else
{
reader.Skip();
lockFile.LogMessages = Array.Empty<IAssetsLogMessage>();
}
}
else
{
reader.Skip();
}
}
if (lockFile.Version == 3)
{
// Populate the alias at read time. This allows readers to use the alias to find targets regardless of what the underlying assets file format is.
foreach (var target in lockFile.Targets)
{
target.TargetAlias = lockFile.PackageSpec?.GetRestoreMetadataFramework(target.TargetFramework)?.TargetAlias;
}
}
var projectPath = lockFile.PackageSpec?.RestoreMetadata?.ProjectPath;
if (!string.IsNullOrEmpty(projectPath) && lockFile.LogMessages.Count > 0)
{
foreach (AssetsLogMessage message in lockFile.LogMessages.Where(x => string.IsNullOrEmpty(x.ProjectPath)))
{
message.ProjectPath = projectPath;
message.FilePath = projectPath;
}
}
return lockFile;
}