Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
c870c41
Initial commit,...
jgonz120 Nov 3, 2023
9083583
Finshed up moving all the objects to use STJ
jgonz120 Nov 6, 2023
49541e0
Added a really long unit test but then just validated using other uni…
jgonz120 Nov 8, 2023
4d1fe5b
Went through the lock file converters, using Utf8JsonReaderExtensions
jgonz120 Nov 8, 2023
a1af274
Seperated the STJ logic from the JsonPackageSpec reader
jgonz120 Nov 9, 2023
39fffa5
Small optimizations
jgonz120 Nov 10, 2023
da7d17c
Split the JsonPackageReader, added obsolete and surpressed in tests
jgonz120 Nov 10, 2023
9f9738f
Changes to get unit tests working for exceptions
jgonz120 Nov 13, 2023
d3d9f32
merge
jgonz120 Nov 13, 2023
0e02fe1
Updated Package reader with new field
jgonz120 Nov 13, 2023
8422e96
Updated exception unit test
jgonz120 Nov 14, 2023
a5fdf9a
Fix unit tests wrt to exceptions
jgonz120 Nov 14, 2023
57813dd
Implemented deserialization with memory stream
jgonz120 Nov 16, 2023
1cb4fd3
Updated tests to work with new streaming logic
jgonz120 Nov 16, 2023
08b36d1
Update tests to use double quotes instead of single quotes for json
jgonz120 Nov 20, 2023
6e3a887
Additonal single quote removals
jgonz120 Nov 20, 2023
1dc7682
Fix another test that uses single quotes
jgonz120 Nov 21, 2023
e62dcfe
Added unit tests and renamed some functions
jgonz120 Nov 21, 2023
5cd4486
Arrange files
jgonz120 Nov 21, 2023
e1d989d
Rename StreamingUtf8JsonReader to Utf8JsonStreamReader
jgonz120 Nov 21, 2023
68c2021
change classes to no longer implement converter
jgonz120 Nov 22, 2023
3ab5dd4
Added environment variable check
jgonz120 Nov 22, 2023
d0fa9ca
updated comments
jgonz120 Nov 22, 2023
20658a6
merge with dev
jgonz120 Dec 4, 2023
9df9654
Remove the floating package version
jgonz120 Dec 4, 2023
3895c46
removed unused references
jgonz120 Dec 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Arrange files
  • Loading branch information
jgonz120 committed Nov 21, 2023
commit 5cd4486bab44cc94d4c30f7e0c1893218059d99d
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ namespace NuGet.ProjectModel
internal static class StreamingUtf8JsonPackageSpecReader
{
private static readonly char[] VersionSeparators = new[] { ';' };

private static readonly byte[] Utf8Authors = Encoding.UTF8.GetBytes("authors");
private static readonly byte[] BuildOptionsUtf8 = Encoding.UTF8.GetBytes("buildOptions");
private static readonly byte[] Utf8ContentFiles = Encoding.UTF8.GetBytes("contentFiles");
Expand Down Expand Up @@ -116,12 +115,12 @@ internal static class StreamingUtf8JsonPackageSpecReader
/// </summary>
/// <param name="name">project name</param>
/// <param name="packageSpecPath">file path</param>
public static PackageSpec GetPackageSpec(string name, string packageSpecPath)
internal static PackageSpec GetPackageSpec(string name, string packageSpecPath)
{
return FileUtility.SafeRead(filePath: packageSpecPath, read: (stream, filePath) => GetPackageSpec(stream, name, filePath, null));
}

public static PackageSpec GetPackageSpec(Stream stream, string name, string packageSpecPath, string snapshotValue)
internal static PackageSpec GetPackageSpec(Stream stream, string name, string packageSpecPath, string snapshotValue)
{
var reader = new StreamingUtf8JsonReader(stream);
PackageSpec packageSpec;
Expand Down Expand Up @@ -303,95 +302,7 @@ internal static PackageSpec GetPackageSpec(ref StreamingUtf8JsonReader jsonReade
return packageSpec;
}

private static PackageType CreatePackageType(ref StreamingUtf8JsonReader jsonReader)
{
var name = jsonReader.GetString();

return new PackageType(name, Packaging.Core.PackageType.EmptyVersion);
}

[Obsolete]
private static void ReadBuildOptions(ref StreamingUtf8JsonReader jsonReader, PackageSpec packageSpec)
{
packageSpec.BuildOptions = new BuildOptions();

if (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.StartObject)
{
while (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.PropertyName)
{
if (jsonReader.ValueTextEquals(Utf8OutputName))
{
packageSpec.BuildOptions.OutputName = jsonReader.ReadNextTokenAsString();
}
else
{
jsonReader.TrySkip();
}
}
}
}

private static void ReadCentralPackageVersions(
ref StreamingUtf8JsonReader jsonReader,
IDictionary<string, CentralPackageVersion> centralPackageVersions)
{
if (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.StartObject)
{
while (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.PropertyName)
{
var propertyName = jsonReader.GetString();

if (string.IsNullOrEmpty(propertyName))
{
var exception = new JsonException("Unable to resolve central version ''.");
throw exception;
}

string version = jsonReader.ReadNextTokenAsString();

if (string.IsNullOrEmpty(version))
{
var exception = new JsonException("The version cannot be null or empty.");
throw exception;
}

centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, VersionRange.Parse(version));
}
}
}

private static CompatibilityProfile ReadCompatibilityProfile(ref StreamingUtf8JsonReader jsonReader, string profileName)
{
List<FrameworkRuntimePair> sets = null;

if (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.StartObject)
{
while (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.PropertyName)
{
var propertyName = jsonReader.GetString();
sets = sets ?? new List<FrameworkRuntimePair>();

IReadOnlyList<string> values = jsonReader.ReadNextStringOrArrayOfStringsAsReadOnlyList() ?? Array.Empty<string>();

IEnumerable<FrameworkRuntimePair> profiles = ReadCompatibilitySets(values, propertyName);

sets.AddRange(profiles);
}
}
return new CompatibilityProfile(profileName, sets ?? Enumerable.Empty<FrameworkRuntimePair>());
}

private static IEnumerable<FrameworkRuntimePair> ReadCompatibilitySets(IReadOnlyList<string> values, string compatibilitySetName)
{
NuGetFramework framework = NuGetFramework.Parse(compatibilitySetName);

foreach (string value in values)
{
yield return new FrameworkRuntimePair(framework, value);
}
}

internal static void ReadDependencies(
internal static void ReadDependencies(
ref StreamingUtf8JsonReader jsonReader,
IList<LibraryDependency> results,
string packageSpecPath,
Expand Down Expand Up @@ -678,6 +589,94 @@ internal static void ReadCentralTransitiveDependencyGroup(
}
}

private static PackageType CreatePackageType(ref StreamingUtf8JsonReader jsonReader)
{
var name = jsonReader.GetString();

return new PackageType(name, Packaging.Core.PackageType.EmptyVersion);
}

[Obsolete]
private static void ReadBuildOptions(ref StreamingUtf8JsonReader jsonReader, PackageSpec packageSpec)
{
packageSpec.BuildOptions = new BuildOptions();

if (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.StartObject)
{
while (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.PropertyName)
{
if (jsonReader.ValueTextEquals(Utf8OutputName))
{
packageSpec.BuildOptions.OutputName = jsonReader.ReadNextTokenAsString();
}
else
{
jsonReader.TrySkip();
}
}
}
}

private static void ReadCentralPackageVersions(
ref StreamingUtf8JsonReader jsonReader,
IDictionary<string, CentralPackageVersion> centralPackageVersions)
{
if (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.StartObject)
{
while (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.PropertyName)
{
var propertyName = jsonReader.GetString();

if (string.IsNullOrEmpty(propertyName))
{
var exception = new JsonException("Unable to resolve central version ''.");
throw exception;
}

string version = jsonReader.ReadNextTokenAsString();

if (string.IsNullOrEmpty(version))
{
var exception = new JsonException("The version cannot be null or empty.");
throw exception;
}

centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, VersionRange.Parse(version));
}
}
}

private static CompatibilityProfile ReadCompatibilityProfile(ref StreamingUtf8JsonReader jsonReader, string profileName)
{
List<FrameworkRuntimePair> sets = null;

if (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.StartObject)
{
while (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.PropertyName)
{
var propertyName = jsonReader.GetString();
sets = sets ?? new List<FrameworkRuntimePair>();

IReadOnlyList<string> values = jsonReader.ReadNextStringOrArrayOfStringsAsReadOnlyList() ?? Array.Empty<string>();

IEnumerable<FrameworkRuntimePair> profiles = ReadCompatibilitySets(values, propertyName);

sets.AddRange(profiles);
}
}
return new CompatibilityProfile(profileName, sets ?? Enumerable.Empty<FrameworkRuntimePair>());
}

private static IEnumerable<FrameworkRuntimePair> ReadCompatibilitySets(IReadOnlyList<string> values, string compatibilitySetName)
{
NuGetFramework framework = NuGetFramework.Parse(compatibilitySetName);

foreach (string value in values)
{
yield return new FrameworkRuntimePair(framework, value);
}
}

private static void ReadDownloadDependencies(
ref StreamingUtf8JsonReader jsonReader,
IList<DownloadDependency> downloadDependencies,
Expand Down
37 changes: 19 additions & 18 deletions src/NuGet.Core/NuGet.ProjectModel/StreamingUtf8JsonReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ namespace NuGet.ProjectModel
{

internal ref struct StreamingUtf8JsonReader

{
private static readonly char[] DelimitedStringDelimiters = new char[] { ' ', ',' };

Expand All @@ -20,7 +21,7 @@ internal ref struct StreamingUtf8JsonReader
private byte[] _buffer;
private Stream _stream;

public StreamingUtf8JsonReader(Stream stream)
internal StreamingUtf8JsonReader(Stream stream)
{
if (stream is null)
{
Expand All @@ -46,25 +47,25 @@ public StreamingUtf8JsonReader(Stream stream)
_reader.Read();
}

public bool IsFinalBlock => _reader.IsFinalBlock;
internal bool IsFinalBlock => _reader.IsFinalBlock;

public int BufferSize => _buffer.Length;
internal int BufferSize => _buffer.Length;

public JsonTokenType TokenType => _reader.TokenType;
internal JsonTokenType TokenType => _reader.TokenType;

public bool ValueTextEquals(ReadOnlySpan<byte> utf8Text) => _reader.ValueTextEquals(utf8Text);
internal bool ValueTextEquals(ReadOnlySpan<byte> utf8Text) => _reader.ValueTextEquals(utf8Text);

public bool ValueTextEquals(string text) => _reader.ValueTextEquals(text);
internal bool ValueTextEquals(string text) => _reader.ValueTextEquals(text);

public bool TryGetInt32(out int value) => _reader.TryGetInt32(out value);
internal bool TryGetInt32(out int value) => _reader.TryGetInt32(out value);

public string GetString() => _reader.GetString();
internal string GetString() => _reader.GetString();

public bool GetBoolean() => _reader.GetBoolean();
internal bool GetBoolean() => _reader.GetBoolean();

public int GetInt32() => _reader.GetInt32();
internal int GetInt32() => _reader.GetInt32();

public bool Read()
internal bool Read()
{
bool wasRead;
while (!(wasRead = _reader.Read()) && !_reader.IsFinalBlock)
Expand All @@ -74,7 +75,7 @@ public bool Read()
return wasRead;
}

public bool TrySkip()
internal bool TrySkip()
{
bool wasSkipped;
while (!(wasSkipped = _reader.TrySkip()) && !_reader.IsFinalBlock)
Expand All @@ -84,7 +85,7 @@ public bool TrySkip()
return wasSkipped;
}

public IList<T> ReadObjectAsList<T>(JsonSerializerOptions options)
internal IList<T> ReadObjectAsList<T>(JsonSerializerOptions options)
{
if (TokenType != JsonTokenType.StartObject)
{
Expand All @@ -111,7 +112,7 @@ public IList<T> ReadObjectAsList<T>(JsonSerializerOptions options)
return listObjects;
}

public void ReadArrayOfObjects<T1, T2>(JsonSerializerOptions options, IList<T2> objectList) where T1 : T2
internal void ReadArrayOfObjects<T1, T2>(JsonSerializerOptions options, IList<T2> objectList) where T1 : T2
{
if (objectList is null)
{
Expand All @@ -134,7 +135,7 @@ public void ReadArrayOfObjects<T1, T2>(JsonSerializerOptions options, IList<T2>
}
}

public string ReadNextTokenAsString()
internal string ReadNextTokenAsString()
{
if (Read())
{
Expand All @@ -144,9 +145,9 @@ public string ReadNextTokenAsString()
return null;
}

public string GetCurrentBufferAsString() => Encoding.UTF8.GetString(_buffer);
internal string GetCurrentBufferAsString() => Encoding.UTF8.GetString(_buffer);

public IList<string> ReadStringArrayAsIList(IList<string> strings = null)
internal IList<string> ReadStringArrayAsIList(IList<string> strings = null)
{
if (TokenType == JsonTokenType.StartArray)
{
Expand Down Expand Up @@ -183,7 +184,7 @@ internal IReadOnlyList<string> ReadDelimitedString()
return null;
}

public List<string> ReadStringArrayAsList(List<string> strings = null)
internal List<string> ReadStringArrayAsList(List<string> strings = null)
{
if (TokenType == JsonTokenType.StartArray)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ internal static IReadOnlyList<string> ReadStringArrayAsReadOnlyListFromArrayStar
return (IReadOnlyList<string>)strings ?? Array.Empty<string>();
}

public static string ReadTokenAsString(this ref Utf8JsonReader reader)
internal static string ReadTokenAsString(this ref Utf8JsonReader reader)
{
switch (reader.TokenType)
{
Expand Down