in src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs [312:489]
private static void ReadDependencies(
ref Utf8JsonStreamReader jsonReader,
IList<LibraryDependency> results,
string packageSpecPath,
bool isGacOrFrameworkReference)
{
if (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.StartObject)
{
while (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.PropertyName)
{
var propertyName = jsonReader.GetString();
if (string.IsNullOrEmpty(propertyName))
{
throw FileFormatException.Create("Unable to resolve dependency ''.", packageSpecPath);
}
// Support
// "dependencies" : {
// "Name" : "1.0"
// }
if (jsonReader.Read())
{
var dependencyIncludeFlagsValue = LibraryIncludeFlags.All;
var dependencyExcludeFlagsValue = LibraryIncludeFlags.None;
var suppressParentFlagsValue = LibraryIncludeFlagUtils.DefaultSuppressParent;
ImmutableArray<NuGetLogCode> noWarn = [];
// This method handles both the dependencies and framework assembly sections.
// Framework references should be limited to references.
// Dependencies should allow everything but framework references.
LibraryDependencyTarget targetFlagsValue = isGacOrFrameworkReference
? LibraryDependencyTarget.Reference
: LibraryDependencyTarget.All & ~LibraryDependencyTarget.Reference;
var autoReferenced = false;
var generatePathProperty = false;
var versionCentrallyManaged = false;
string aliases = null;
string dependencyVersionValue = null;
VersionRange versionOverride = null;
if (jsonReader.TokenType == JsonTokenType.String)
{
dependencyVersionValue = jsonReader.GetString();
}
else if (jsonReader.TokenType == JsonTokenType.StartObject)
{
while (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.PropertyName)
{
if (jsonReader.ValueTextEquals(AutoReferencedPropertyName))
{
autoReferenced = jsonReader.ReadNextTokenAsBoolOrFalse();
}
else if (jsonReader.ValueTextEquals(ExcludePropertyName))
{
var values = jsonReader.ReadDelimitedString();
dependencyExcludeFlagsValue = LibraryIncludeFlagUtils.GetFlags(values);
}
else if (jsonReader.ValueTextEquals(GeneratePathPropertyPropertyName))
{
generatePathProperty = jsonReader.ReadNextTokenAsBoolOrFalse();
}
else if (jsonReader.ValueTextEquals(IncludePropertyName))
{
var values = jsonReader.ReadDelimitedString();
dependencyIncludeFlagsValue = LibraryIncludeFlagUtils.GetFlags(values);
}
else if (jsonReader.ValueTextEquals(NoWarnPropertyName))
{
noWarn = ReadNuGetLogCodesList(ref jsonReader);
}
else if (jsonReader.ValueTextEquals(SuppressParentPropertyName))
{
var values = jsonReader.ReadDelimitedString();
suppressParentFlagsValue = LibraryIncludeFlagUtils.GetFlags(values);
}
else if (jsonReader.ValueTextEquals(TargetPropertyName))
{
targetFlagsValue = ReadTarget(ref jsonReader, packageSpecPath, targetFlagsValue);
}
else if (jsonReader.ValueTextEquals(VersionPropertyName))
{
if (jsonReader.Read())
{
dependencyVersionValue = jsonReader.GetString();
}
}
else if (jsonReader.ValueTextEquals(VersionOverridePropertyName))
{
if (jsonReader.Read())
{
var versionPropValue = jsonReader.GetString();
try
{
versionOverride = VersionRange.Parse(versionPropValue);
}
catch (Exception ex)
{
throw FileFormatException.Create(ex, packageSpecPath);
}
}
}
else if (jsonReader.ValueTextEquals(VersionCentrallyManagedPropertyName))
{
versionCentrallyManaged = jsonReader.ReadNextTokenAsBoolOrFalse();
}
else if (jsonReader.ValueTextEquals(AliasesPropertyName))
{
aliases = jsonReader.ReadNextTokenAsString();
}
else
{
jsonReader.Skip();
}
}
}
VersionRange dependencyVersionRange = null;
if (!string.IsNullOrEmpty(dependencyVersionValue))
{
try
{
dependencyVersionRange = VersionRange.Parse(dependencyVersionValue);
}
catch (Exception ex)
{
throw FileFormatException.Create(
ex,
packageSpecPath);
}
}
// Projects and References may have empty version ranges, Packages may not
if (dependencyVersionRange == null)
{
if ((targetFlagsValue & LibraryDependencyTarget.Package) == LibraryDependencyTarget.Package)
{
throw FileFormatException.Create(
new ArgumentException(Strings.MissingVersionOnDependency),
packageSpecPath);
}
else
{
// Projects and references with no version property allow all versions
dependencyVersionRange = VersionRange.All;
}
}
// the dependency flags are: Include flags - Exclude flags
var includeFlags = dependencyIncludeFlagsValue & ~dependencyExcludeFlagsValue;
var libraryDependency = new LibraryDependency()
{
LibraryRange = new LibraryRange()
{
Name = propertyName,
TypeConstraint = targetFlagsValue,
VersionRange = dependencyVersionRange
},
IncludeType = includeFlags,
SuppressParent = suppressParentFlagsValue,
AutoReferenced = autoReferenced,
GeneratePathProperty = generatePathProperty,
VersionCentrallyManaged = versionCentrallyManaged,
Aliases = aliases,
// The ReferenceType is not persisted to the assets file
// Default to LibraryDependencyReferenceType.Direct on Read
ReferenceType = LibraryDependencyReferenceType.Direct,
VersionOverride = versionOverride,
NoWarn = noWarn,
};
results.Add(libraryDependency);
}
}
}
}