Adding expression rewrites

This commit is contained in:
Zoe Roux
2021-03-17 14:56:38 +01:00
commit ec67a11287
30 changed files with 652 additions and 0 deletions

13
.idea/.idea.DotExperiments/.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,13 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/modules.xml
/.idea.DotExperiments.iml
/contentModel.xml
/projectSettingsUpdater.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
</project>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ContentModelUserStore">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="RIDER_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$/../.." />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

11
DotExperiments.csproj Normal file
View File

@@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="JetBrains.Annotations" Version="2020.3.0" />
</ItemGroup>
</Project>

16
DotExperiments.sln Normal file
View File

@@ -0,0 +1,16 @@

Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotExperiments", "DotExperiments.csproj", "{FB46BB47-A1DB-44CD-9FAF-50BD6E533008}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{FB46BB47-A1DB-44CD-9FAF-50BD6E533008}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FB46BB47-A1DB-44CD-9FAF-50BD6E533008}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FB46BB47-A1DB-44CD-9FAF-50BD6E533008}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FB46BB47-A1DB-44CD-9FAF-50BD6E533008}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ContentModelStore">
<e p="$USER_HOME$/.cache/JetBrains/Rider2020.3/extResources" t="IncludeRecursive" />
<e p="$USER_HOME$/.cache/JetBrains/Rider2020.3/resharper-host/local/Transient/Rider/v203/SolutionCaches/_DotExperiments.-1975764949.00" t="ExcludeRecursive" />
<e p="$PROJECT_DIR$" t="IncludeFlat">
<e p="DotExperiments.sln" t="IncludeFlat" />
</e>
</component>
</project>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ContentModelUserStore">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/.idea.DotExperiments/.idea/riderModule.iml" filepath="$PROJECT_DIR$/.idea/.idea.DotExperiments/.idea/riderModule.iml" />
</modules>
</component>
</project>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RiderProjectSettingsUpdater">
<option name="vcsConfiguration" value="2" />
</component>
</project>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="RIDER_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$/../.." />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

View File

@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="8f105013-24ef-4052-8695-b0376b63c6c3" name="Default Changelist" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
</component>
<component name="ProjectId" id="1pt3N96DnhlOd7E48cCz9PGEXha" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="ASKED_ADD_EXTERNAL_FILES" value="true" />
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/.." />
<property name="nodejs_package_manager_path" value="npm" />
<property name="settings.editor.selected.configurable" value="preferences.pluginManager" />
<property name="vue.rearranger.settings.migration" value="true" />
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="8f105013-24ef-4052-8695-b0376b63c6c3" name="Default Changelist" comment="" />
<created>1615988517462</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1615988517462</updated>
<workItem from="1615988519871" duration="39000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="UnityProjectConfiguration" hasMinimizedUI="null" />
<component name="UnityUnitTestConfiguration" currentTestLauncher="NUnit" />
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
<component name="VcsManagerConfiguration">
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" />
</component>
</project>

View File

@@ -0,0 +1,62 @@
using System;
using System.Linq;
using System.Linq.Expressions;
using JetBrains.Annotations;
namespace DotExperiments
{
public static class ExpressionUtility
{
public static Expression<T> Convert<T>([CanBeNull] this Expression expr)
where T : Delegate
{
Expression<T> e = expr switch
{
null => null,
LambdaExpression lambda => new ExpressionConverter<T>(lambda).VisitAndConvert(),
_ => throw new ArgumentException("Can't convert a non lambda.")
};
return ExpressionRewrite.Rewrite<T>(e);
}
private class ExpressionConverter<TTo> : ExpressionVisitor
where TTo : Delegate
{
private readonly LambdaExpression _expression;
private readonly ParameterExpression[] _newParams;
internal ExpressionConverter(LambdaExpression expression)
{
_expression = expression;
Type[] paramTypes = typeof(TTo).GetGenericArguments()[..^1];
if (paramTypes.Length != _expression.Parameters.Count)
throw new ArgumentException("Parameter count from internal and external lambda are not matched.");
_newParams = new ParameterExpression[paramTypes.Length];
for (int i = 0; i < paramTypes.Length; i++)
{
if (_expression.Parameters[i].Type == paramTypes[i])
_newParams[i] = _expression.Parameters[i];
else
_newParams[i] = Expression.Parameter(paramTypes[i], _expression.Parameters[i].Name);
}
}
internal Expression<TTo> VisitAndConvert()
{
Type returnType = _expression.Type.GetGenericArguments().Last();
Expression body = _expression.ReturnType == returnType
? Visit(_expression.Body)
: Expression.Convert(Visit(_expression.Body)!, returnType);
return Expression.Lambda<TTo>(body!, _newParams);
}
protected override Expression VisitParameter(ParameterExpression node)
{
return _newParams.FirstOrDefault(x => x.Name == node.Name) ?? node;
}
}
}
}

View File

@@ -0,0 +1,115 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace DotExperiments
{
public class ExpressionRewriteAttribute : Attribute
{
public string Link { get; }
public string Inner { get; }
public ExpressionRewriteAttribute(string link, string inner = null)
{
Link = link;
Inner = inner;
}
}
public class ExpressionRewrite : ExpressionVisitor
{
private string _inner;
private readonly List<(string inner, ParameterExpression param, ParameterExpression newParam)> _innerRewrites;
private ExpressionRewrite()
{
_innerRewrites = new List<(string, ParameterExpression, ParameterExpression)>();
}
public static Expression Rewrite(Expression expression)
{
return new ExpressionRewrite().Visit(expression);
}
public static Expression<T> Rewrite<T>(Expression expression) where T : Delegate
{
return (Expression<T>)new ExpressionRewrite().Visit(expression);
}
protected override Expression VisitMember(MemberExpression node)
{
(string inner, _, ParameterExpression p) = _innerRewrites.FirstOrDefault(x => x.param == node.Expression);
if (inner != null)
{
Expression param = inner.Split('.').Aggregate<string, Expression>(p, Expression.Property);
node = Expression.Property(param, node.Member.Name);
}
// Can't use node.Member directly because we want to support attribute override
MemberInfo member = node.Expression!.Type.GetProperty(node.Member.Name) ?? node.Member;
ExpressionRewriteAttribute attr = member!.GetCustomAttribute<ExpressionRewriteAttribute>();
if (attr == null)
return base.VisitMember(node);
Expression property = attr.Link.Split('.').Aggregate(node.Expression, Expression.Property);
if (property is MemberExpression expr)
Visit(expr.Expression);
_inner = attr.Inner;
return property!;
}
protected override Expression VisitLambda<T>(Expression<T> node)
{
(_, ParameterExpression oldParam, ParameterExpression param) = _innerRewrites
.FirstOrDefault(x => node.Parameters.Any(y => y == x.param));
if (param == null)
return base.VisitLambda(node);
ParameterExpression[] newParams = node.Parameters.Where(x => x != oldParam).Append(param).ToArray();
return Expression.Lambda(Visit(node.Body)!, newParams);
}
protected override Expression VisitMethodCall(MethodCallExpression node)
{
int count = node.Arguments.Count;
if (node.Object != null)
count++;
if (count != 2)
return base.VisitMethodCall(node);
Expression instance = node.Object ?? node.Arguments.First();
Expression argument = node.Object != null
? node.Arguments.First()
: node.Arguments[1];
Type oldType = instance.Type;
instance = Visit(instance);
if (instance!.Type == oldType)
return base.VisitMethodCall(node);
if (_inner != null && argument is LambdaExpression lambda)
{
// TODO this type handler will usually work with IEnumerable & others but won't work with everything.
Type type = oldType.GetGenericArguments().First();
ParameterExpression oldParam = lambda.Parameters.FirstOrDefault(x => x.Type == type);
if (oldParam != null)
{
Type newType = instance.Type.GetGenericArguments().First();
ParameterExpression newParam = Expression.Parameter(newType, oldParam.Name);
_innerRewrites.Add((_inner, oldParam, newParam));
}
}
argument = Visit(argument);
// TODO this method handler may not work for some methods (ex: method taking a Fun<> method won't have good generic arguments)
MethodInfo method = node.Method.IsGenericMethod
? node.Method.GetGenericMethodDefinition().MakeGenericMethod(instance.Type.GetGenericArguments())
: node.Method;
return node.Object != null
? Expression.Call(instance, method!, argument)
: Expression.Call(null, method!, instance, argument!);
}
}
}

49
README.md Normal file
View File

@@ -0,0 +1,49 @@
# DotExperiment
Dot experiments is a list of over engineered functions in dotnet.
## Expressions
A set of functions to convert and rewrite expressions. This allow users to transform expression's parameters & return type and rewrite accessors.
Expression Convertor Usage:
```csharp
Expression<Func<int, bool>> func = x => x > 100;
Expression<Func<long, bool>> converted = ExpressionUtility.Convert<Func<long, bool>>(func);
```
Expression Rewrite Usage:
```csharp
public class Parent
{
public ICollection<GenreLink> GenreLinks { get; set; }
[ExpressionRewrite(nameof(GenreLinks), nameof(GenreLink.Genre))]
public ICollection<Genre> Genres
{
get => GenreLinks?.Select(x => x.Genre);
set => GenreLinks = value?.Select(x => new GenreLink(this, x)).ToList();
}
}
public class Genre
{
public bool Enabled { get; set; }
}
public class GenreLink
{
public Parent Parent { get ; set; }
public Genre Genre { get; set; }
public GenreLink(Parent parent, Genre genre)
{
Parent = parent;
Genre = genre;
}
}
Expression<Func<Parent, ICollection<Genre>>> = x => x.Genres.Any(y => y.Enabled);
Expession rewrited = Expression.ExpressionRewrite(expression);
// rewrited contains: x => x.GenreLinks.Any(y => y.Genre.Enabled);
```

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v5.0", FrameworkDisplayName = "")]

View File

@@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("DotExperiments")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("DotExperiments")]
[assembly: System.Reflection.AssemblyTitleAttribute("DotExperiments")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@@ -0,0 +1 @@
6578c792ece403e10aaf157c3825244f5d0ac4ef

View File

@@ -0,0 +1,8 @@
is_global = true
build_property.TargetFramework = net5.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.PublishSingleFile =
build_property.IncludeAllContentForSelfExtract =
build_property._SupportedPlatformList = Android,iOS,Linux,macOS,Windows

Binary file not shown.

View File

@@ -0,0 +1,72 @@
{
"format": 1,
"restore": {
"/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj": {}
},
"projects": {
"/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj",
"projectName": "DotExperiments",
"projectPath": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj",
"packagesPath": "/home/anonymus-raccoon/.nuget/packages/",
"outputPath": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/home/anonymus-raccoon/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net5.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net5.0": {
"targetAlias": "net5.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net5.0": {
"targetAlias": "net5.0",
"dependencies": {
"JetBrains.Annotations": {
"target": "Package",
"version": "[2020.3.0, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48"
],
"assetTargetFallback": true,
"warn": true,
"downloadDependencies": [
{
"name": "Microsoft.AspNetCore.App.Ref",
"version": "[5.0.0, 5.0.0]"
}
],
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/5.0.201/RuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/anonymus-raccoon/.nuget/packages/</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/anonymus-raccoon/.nuget/packages/</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">5.8.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="$([MSBuild]::EnsureTrailingSlash($(NuGetPackageFolders)))" />
</ItemGroup>
<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
</PropertyGroup>
</Project>

112
obj/project.assets.json Normal file
View File

@@ -0,0 +1,112 @@
{
"version": 3,
"targets": {
"net5.0": {
"JetBrains.Annotations/2020.3.0": {
"type": "package",
"compile": {
"lib/netstandard2.0/JetBrains.Annotations.dll": {}
},
"runtime": {
"lib/netstandard2.0/JetBrains.Annotations.dll": {}
}
}
}
},
"libraries": {
"JetBrains.Annotations/2020.3.0": {
"sha512": "FnX06vtxuoZnhZdR6UHt5kJ7HUC/syODfGLnhPDn1x5sXvvepNyCl4jMtPUzJfsPWh7q0Jo+AIYz5xaVbbyikA==",
"type": "package",
"path": "jetbrains.annotations/2020.3.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"icon.png",
"jetbrains.annotations.2020.3.0.nupkg.sha512",
"jetbrains.annotations.nuspec",
"lib/net20/JetBrains.Annotations.dll",
"lib/net20/JetBrains.Annotations.xml",
"lib/netstandard1.0/JetBrains.Annotations.deps.json",
"lib/netstandard1.0/JetBrains.Annotations.dll",
"lib/netstandard1.0/JetBrains.Annotations.xml",
"lib/netstandard2.0/JetBrains.Annotations.deps.json",
"lib/netstandard2.0/JetBrains.Annotations.dll",
"lib/netstandard2.0/JetBrains.Annotations.xml",
"lib/portable40-net40+sl5+win8+wp8+wpa81/JetBrains.Annotations.dll",
"lib/portable40-net40+sl5+win8+wp8+wpa81/JetBrains.Annotations.xml"
]
}
},
"projectFileDependencyGroups": {
"net5.0": [
"JetBrains.Annotations >= 2020.3.0"
]
},
"packageFolders": {
"/home/anonymus-raccoon/.nuget/packages/": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj",
"projectName": "DotExperiments",
"projectPath": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj",
"packagesPath": "/home/anonymus-raccoon/.nuget/packages/",
"outputPath": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/home/anonymus-raccoon/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net5.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net5.0": {
"targetAlias": "net5.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net5.0": {
"targetAlias": "net5.0",
"dependencies": {
"JetBrains.Annotations": {
"target": "Package",
"version": "[2020.3.0, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48"
],
"assetTargetFallback": true,
"warn": true,
"downloadDependencies": [
{
"name": "Microsoft.AspNetCore.App.Ref",
"version": "[5.0.0, 5.0.0]"
}
],
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/5.0.201/RuntimeIdentifierGraph.json"
}
}
}
}

11
obj/project.nuget.cache Normal file
View File

@@ -0,0 +1,11 @@
{
"version": 2,
"dgSpecHash": "TZ/lo70fwlMcZSdro2yXAU3eCKzcvh30saL/a5culOGYgmYHy/9ylZJTi8NHW6YJKb33mZy3Xc2lb0OQ1gSsPg==",
"success": true,
"projectFilePath": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj",
"expectedPackageFiles": [
"/home/anonymus-raccoon/.nuget/packages/jetbrains.annotations/2020.3.0/jetbrains.annotations.2020.3.0.nupkg.sha512",
"/home/anonymus-raccoon/.nuget/packages/microsoft.aspnetcore.app.ref/5.0.0/microsoft.aspnetcore.app.ref.5.0.0.nupkg.sha512"
],
"logs": []
}

View File

@@ -0,0 +1 @@
"version":"1.0.0","restore":{"projectUniqueName":"/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj","projectName":"DotExperiments","projectPath":"/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj","outputPath":"/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net5.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net5.0":{"targetAlias":"net5.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]}}"frameworks":{"net5.0":{"targetAlias":"net5.0","dependencies":{"JetBrains.Annotations":{"target":"Package","version":"[2020.3.0, )"}},"imports":["net461","net462","net47","net471","net472","net48"],"assetTargetFallback":true,"warn":true,"downloadDependencies":[{"name":"Microsoft.AspNetCore.App.Ref","version":"[5.0.0, 5.0.0]"}],"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/share/dotnet/sdk/5.0.201/RuntimeIdentifierGraph.json"}}

View File

@@ -0,0 +1 @@
16159886511185361